/// <summary> /// Adds a callback to be called on the host after all currently enqueued items /// in the stream have completed /// </summary> /// <param name="callback"></param> /// <param name="userData">Not supported</param> public void EnqueueHostCallback(StreamCallback callback, object userData = null) { ThrowIfDisposed(); if (callback == null) { throw new ArgumentNullException(nameof(callback)); } if (callbackHandle.IsAllocated) { callbackHandle.Free(); } if (userDataHandle.IsAllocated) { userDataHandle.Free(); } IntPtr userDataPtr = IntPtr.Zero; if (userData != null) { userDataHandle = GCHandle.Alloc(userData); userDataPtr = GCHandle.ToIntPtr(userDataHandle); } callbackInternal = new StreamCallbackInternal( delegate(IntPtr rawStream, int status, IntPtr rawUserData) { var streamObj = new Stream(rawStream) { IsEnabledDispose = false }; var userDataObj = GCHandle.FromIntPtr(rawUserData).Target; callback(streamObj, status, userDataObj); }); callbackHandle = GCHandle.Alloc(callbackInternal); IntPtr callbackPtr = Marshal.GetFunctionPointerForDelegate(callbackInternal); NativeMethods.cuda_Stream_enqueueHostCallback( ptr, callbackPtr, userDataPtr); GC.KeepAlive(this); }
/// <summary> /// Adds a callback to be called on the host after all currently enqueued items /// in the stream have completed /// </summary> /// <param name="callback"></param> /// <param name="userData">Not supported</param> public void EnqueueHostCallback(StreamCallback callback, object userData = null) { ThrowIfDisposed(); if (callback == null) throw new ArgumentNullException("callback"); if (callbackHandle.IsAllocated) callbackHandle.Free(); if (userDataHandle.IsAllocated) userDataHandle.Free(); IntPtr userDataPtr = IntPtr.Zero; if (userData != null) { userDataHandle = GCHandle.Alloc(userData); userDataPtr = GCHandle.ToIntPtr(userDataHandle); } callbackInternal = new StreamCallbackInternal( delegate(IntPtr rawStream, int status, IntPtr rawUserData) { var streamObj = new Stream(rawStream) {IsEnabledDispose = false}; var userDataObj = GCHandle.FromIntPtr(rawUserData).Target; callback(streamObj, status, userDataObj); }); callbackHandle = GCHandle.Alloc(callbackInternal); IntPtr callbackPtr = Marshal.GetFunctionPointerForDelegate(callbackInternal); NativeMethods.cuda_Stream_enqueueHostCallback( ptr, callbackPtr, userDataPtr); }