Esempio n. 1
0
        /// <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);
        }
Esempio n. 2
0
        /// <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);
        }