예제 #1
0
        unsafe public static void Free(NativeOverlapped *nativeOverlappedPtr)
        {
            if (nativeOverlappedPtr == null)
            {
                throw new ArgumentNullException("nativeOverlappedPtr");
            }

            // Debugging aid
            if (nativeOverlappedPtr->ReservedCOR1 == unchecked ((int)0xdeadbeef))
            {
                throw new InvalidOperationException(Environment.GetResourceString("InvalidOperation_OverlappedFreedTwice"));
            }
            nativeOverlappedPtr->ReservedCOR1 = unchecked ((int)0xdeadbeef);

#if _DEBUG
            nativeOverlappedPtr->InternalHigh = unchecked ((int)0xdeadbeef);
            nativeOverlappedPtr->InternalLow  = unchecked ((int)0xdeadbeef);
            nativeOverlappedPtr->OffsetHigh   = unchecked ((int)0xdeadbeef);
            nativeOverlappedPtr->OffsetLow    = unchecked ((int)0xdeadbeef);
            nativeOverlappedPtr->EventHandle  = unchecked ((int)0xdeadbeef);
#endif

            GCHandle eeHandleForAr = (*nativeOverlappedPtr).ReservedClasslib;
            eeHandleForAr.__InternalFree();
            (*nativeOverlappedPtr).ReservedCOR2.__InternalFree();
            if (nativeOverlappedPtr->ReservedCOR3 != (IntPtr)null)
            {
#if _DEBUG
                if (nativeOverlappedPtr->ReservedCOR3 == (IntPtr) unchecked ((int)0xdeadbeef))
                {
                    throw new InvalidOperationException(Environment.GetResourceString("InvalidOperation_OverlappedFreedTwice"));
                }
#endif
                CodeAccessSecurityEngine.ReleaseDelayedCompressedStack(nativeOverlappedPtr->ReservedCOR3);
            }

#if _DEBUG
            nativeOverlappedPtr->ReservedCOR3 = new IntPtr(unchecked ((int)0xdeadbeef));
#endif

            FreeNativeOverlapped(nativeOverlappedPtr);
        }