/// <summary> /// Sets the thread exit callback. /// </summary> private static unsafe int SetThreadExitCallbackMono(IntPtr callbackPtr) { int tlsIndex; CheckResult(NativeMethodsMono.pthread_key_create(new IntPtr(&tlsIndex), callbackPtr)); return(tlsIndex); }
/// <summary> /// Sets the thread exit callback, and returns an id to pass to <see cref="EnableCurrentThreadExitEvent"/>. /// </summary> /// <param name="callbackPtr"> /// Pointer to a callback function that matches <see cref="ThreadExitCallback"/>. /// </param> public static unsafe int SetThreadExitCallback(IntPtr callbackPtr) { Debug.Assert(callbackPtr != IntPtr.Zero); if (Os.IsWindows) { var res = NativeMethodsWindows.FlsAlloc(callbackPtr); if (res == NativeMethodsWindows.FLS_OUT_OF_INDEXES) { throw new InvalidOperationException("FlsAlloc failed: " + Marshal.GetLastWin32Error()); } return(res); } if (Os.IsMacOs) { int tlsIndex; var res = NativeMethodsMacOs.pthread_key_create(new IntPtr(&tlsIndex), callbackPtr); NativeMethodsLinux.CheckResult(res); return(tlsIndex); } if (Os.IsLinux) { int tlsIndex; var res = Os.IsMono ? NativeMethodsMono.pthread_key_create(new IntPtr(&tlsIndex), callbackPtr) : NativeMethodsLinux.pthread_key_create(new IntPtr(&tlsIndex), callbackPtr); NativeMethodsLinux.CheckResult(res); return(tlsIndex); } throw new InvalidOperationException("Unsupported OS: " + Environment.OSVersion); }