diff options
author | jan.nijtmans <nijtmans@users.sourceforge.net> | 2017-04-12 12:00:11 (GMT) |
---|---|---|
committer | jan.nijtmans <nijtmans@users.sourceforge.net> | 2017-04-12 12:00:11 (GMT) |
commit | ece45e7fb6469e3ee3ad49f168f8711fb36f93ce (patch) | |
tree | db4a77927de2a4d6c6cf2bc672ebda4098b9b1a0 /unix/tclUnixNotfy.c | |
parent | 6f3388528ef453d29fbddba3f5a054d2f5268207 (diff) | |
parent | 473bfc0f18451046035f638732a609fc86d5a0aa (diff) | |
download | tcl-ece45e7fb6469e3ee3ad49f168f8711fb36f93ce.zip tcl-ece45e7fb6469e3ee3ad49f168f8711fb36f93ce.tar.gz tcl-ece45e7fb6469e3ee3ad49f168f8711fb36f93ce.tar.bz2 |
merge trunkinitsubsystems
Diffstat (limited to 'unix/tclUnixNotfy.c')
-rw-r--r-- | unix/tclUnixNotfy.c | 86 |
1 files changed, 16 insertions, 70 deletions
diff --git a/unix/tclUnixNotfy.c b/unix/tclUnixNotfy.c index 2b648ca..6b7669d 100644 --- a/unix/tclUnixNotfy.c +++ b/unix/tclUnixNotfy.c @@ -1,7 +1,5 @@ -#define AT_FORK_INIT_VALUE 0 -#define RESET_ATFORK_MUTEX 1 /* - * tclUnixNotify.c -- + * tclUnixNotfy.c -- * * This file contains the implementation of the select()-based * Unix-specific notifier, which is the lowest-level part of the Tcl @@ -41,7 +39,7 @@ typedef struct FileHandler { * handlers are ready to fire. */ -typedef struct FileHandlerEvent { +typedef struct { Tcl_Event header; /* Information that is standard for all * events. */ int fd; /* File descriptor that is ready. Used to find @@ -56,7 +54,7 @@ typedef struct FileHandlerEvent { * writable, and exception conditions. */ -typedef struct SelectMasks { +typedef struct { fd_set readable; fd_set writable; fd_set exception; @@ -103,7 +101,7 @@ typedef struct ThreadSpecificData { * event is ready to be processed by signaling * this condition variable. */ #endif /* __CYGWIN__ */ - int waitCVinitialized; /* Variable to flag initialization of the structure */ + int waitCVinitialized; /* Variable to flag initialization of the structure */ int eventReady; /* True if an event is ready to be processed. * Used as condition flag together with waitCV * above. */ @@ -152,8 +150,8 @@ static int triggerPipe = -1; * The notifierMutex locks access to all of the global notifier state. */ -pthread_mutex_t notifierInitMutex = PTHREAD_MUTEX_INITIALIZER; -pthread_mutex_t notifierMutex = PTHREAD_MUTEX_INITIALIZER; +static pthread_mutex_t notifierInitMutex = PTHREAD_MUTEX_INITIALIZER; +static pthread_mutex_t notifierMutex = PTHREAD_MUTEX_INITIALIZER; /* * The following static indicates if the notifier thread is running. * @@ -195,11 +193,9 @@ static Tcl_ThreadId notifierThread; */ #ifdef TCL_THREADS -static void NotifierThreadProc(ClientData clientData); +static TCL_NORETURN void NotifierThreadProc(ClientData clientData); #if defined(HAVE_PTHREAD_ATFORK) -static int atForkInit = AT_FORK_INIT_VALUE; -static void AtForkPrepare(void); -static void AtForkParent(void); +static int atForkInit = 0; static void AtForkChild(void); #endif /* HAVE_PTHREAD_ATFORK */ #endif /* TCL_THREADS */ @@ -256,7 +252,7 @@ extern unsigned char __stdcall TranslateMessage(const MSG *); * Threaded-cygwin specific constants and functions in this file: */ -static const WCHAR NotfyClassName[] = L"TclNotifier"; +static const WCHAR className[] = L"TclNotifier"; static DWORD __stdcall NotifierProc(void *hwnd, unsigned int message, void *wParam, void *lParam); #endif /* TCL_THREADS && __CYGWIN__ */ @@ -345,7 +341,7 @@ Tcl_InitNotifier(void) class.hInstance = TclWinGetTclInstance(); class.hbrBackground = NULL; class.lpszMenuName = NULL; - class.lpszClassName = NotfyClassName; + class.lpszClassName = className; class.lpfnWndProc = NotifierProc; class.hIcon = NULL; class.hCursor = NULL; @@ -370,7 +366,7 @@ Tcl_InitNotifier(void) */ if (!atForkInit) { - int result = pthread_atfork(AtForkPrepare, AtForkParent, AtForkChild); + int result = pthread_atfork(NULL, NULL, AtForkChild); if (result) { Tcl_Panic("Tcl_InitNotifier: pthread_atfork failed"); @@ -433,9 +429,11 @@ Tcl_FinalizeNotifier( "unable to write q to triggerPipe"); } close(triggerPipe); + pthread_mutex_lock(¬ifierMutex); while(triggerPipe != -1) { pthread_cond_wait(¬ifierCV, ¬ifierMutex); } + pthread_mutex_unlock(¬ifierMutex); if (notifierThreadRunning) { int result = pthread_join((pthread_t) notifierThread, NULL); @@ -1141,7 +1139,7 @@ Tcl_WaitForEvent( *---------------------------------------------------------------------- */ -static void +static TCL_NORETURN void NotifierThreadProc( ClientData clientData) /* Not used. */ { @@ -1349,54 +1347,6 @@ NotifierThreadProc( /* *---------------------------------------------------------------------- * - * AtForkPrepare -- - * - * Lock the notifier in preparation for a fork. - * - * Results: - * None. - * - * Side effects: - * None. - * - *---------------------------------------------------------------------- - */ - -static void -AtForkPrepare(void) -{ -#if RESET_ATFORK_MUTEX == 0 - pthread_mutex_lock(¬ifierInitMutex); -#endif -} - -/* - *---------------------------------------------------------------------- - * - * AtForkParent -- - * - * Unlock the notifier in the parent after a fork. - * - * Results: - * None. - * - * Side effects: - * None. - * - *---------------------------------------------------------------------- - */ - -static void -AtForkParent(void) -{ -#if RESET_ATFORK_MUTEX == 0 - pthread_mutex_unlock(¬ifierInitMutex); -#endif -} - -/* - *---------------------------------------------------------------------- - * * AtForkChild -- * * Unlock and reinstall the notifier in the child after a fork. @@ -1416,12 +1366,8 @@ AtForkChild(void) if (notifierThreadRunning == 1) { pthread_cond_destroy(¬ifierCV); } -#if RESET_ATFORK_MUTEX == 0 - pthread_mutex_unlock(¬ifierInitMutex); -#else pthread_mutex_init(¬ifierInitMutex, NULL); pthread_mutex_init(¬ifierMutex, NULL); -#endif pthread_cond_init(¬ifierCV, NULL); /* @@ -1453,8 +1399,8 @@ AtForkChild(void) */ #ifdef __CYGWIN__ DestroyWindow(tsdPtr->hwnd); - tsdPtr->hwnd = CreateWindowExW(NULL, NotfyClassName, - NotfyClassName, 0, 0, 0, 0, 0, NULL, NULL, + tsdPtr->hwnd = CreateWindowExW(NULL, className, + className, 0, 0, 0, 0, 0, NULL, NULL, TclWinGetTclInstance(), NULL); ResetEvent(tsdPtr->event); #else |