mirror of
https://gitee.com/csharpui/CPF.git
synced 2025-04-05 17:37:51 +08:00
124 lines
2.2 KiB
C#
124 lines
2.2 KiB
C#
using CPF.Mac.Foundation;
|
|
using CPF.Mac.ObjCRuntime;
|
|
using System;
|
|
using System.Runtime.InteropServices;
|
|
|
|
namespace CPF.Mac.CoreFoundation
|
|
{
|
|
public abstract class DispatchObject : INativeObject, IDisposable
|
|
{
|
|
internal IntPtr handle;
|
|
|
|
public IntPtr Handle => handle;
|
|
|
|
[Preserve(Conditional = true)]
|
|
internal DispatchObject(IntPtr handle, bool owns)
|
|
{
|
|
if (handle == IntPtr.Zero)
|
|
{
|
|
throw new ArgumentNullException("handle");
|
|
}
|
|
this.handle = handle;
|
|
if (!owns)
|
|
{
|
|
dispatch_retain(handle);
|
|
}
|
|
}
|
|
|
|
internal DispatchObject()
|
|
{
|
|
}
|
|
|
|
[DllImport("libc")]
|
|
private static extern IntPtr dispatch_release(IntPtr o);
|
|
|
|
[DllImport("libc")]
|
|
private static extern IntPtr dispatch_retain(IntPtr o);
|
|
|
|
~DispatchObject()
|
|
{
|
|
Dispose(disposing: false);
|
|
}
|
|
|
|
public void Dispose()
|
|
{
|
|
Dispose(disposing: true);
|
|
GC.SuppressFinalize(this);
|
|
}
|
|
|
|
protected virtual void Dispose(bool disposing)
|
|
{
|
|
if (handle != IntPtr.Zero)
|
|
{
|
|
dispatch_release(handle);
|
|
handle = IntPtr.Zero;
|
|
}
|
|
}
|
|
|
|
public static bool operator ==(DispatchObject a, DispatchObject b)
|
|
{
|
|
if ((object)a == null)
|
|
{
|
|
if ((object)b == null)
|
|
{
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
if ((object)b == null)
|
|
{
|
|
return false;
|
|
}
|
|
return a.handle == b.handle;
|
|
}
|
|
|
|
public static bool operator !=(DispatchObject a, DispatchObject b)
|
|
{
|
|
if ((object)a == null)
|
|
{
|
|
if ((object)b == null)
|
|
{
|
|
return false;
|
|
}
|
|
return true;
|
|
}
|
|
if ((object)b == null)
|
|
{
|
|
return true;
|
|
}
|
|
return a.handle != b.handle;
|
|
}
|
|
|
|
public override bool Equals(object other)
|
|
{
|
|
if (other == null)
|
|
{
|
|
return false;
|
|
}
|
|
return (other as DispatchQueue).handle == handle;
|
|
}
|
|
|
|
public override int GetHashCode()
|
|
{
|
|
return (int)handle;
|
|
}
|
|
|
|
protected void Check()
|
|
{
|
|
if (handle == IntPtr.Zero)
|
|
{
|
|
throw new ObjectDisposedException(GetType().ToString());
|
|
}
|
|
}
|
|
|
|
[DllImport("libc")]
|
|
private static extern void dispatch_set_target_queue(IntPtr queue, IntPtr target);
|
|
|
|
public void SetTargetQueue(DispatchQueue queue)
|
|
{
|
|
IntPtr target = (queue == null) ? IntPtr.Zero : queue.Handle;
|
|
dispatch_set_target_queue(handle, target);
|
|
}
|
|
}
|
|
}
|