(empth_init_signals): Don't catch SIGINT and SIGTERM.

(empth_wait_for_shutdown): New.
(main): Use it to wait for shutdown signal, then shut down.  Closes
#770492.
(empth_exit): Remove the weird special case for main thread.

Implement empth_wait_for_shutdown() for EMPTH_LWP:
[EMPTH_LWP] (lwpInitSigWait, lwpSigWait, lwpSigWakeup): New.
Declaration of lwpSigWait was accidentally committed in the previous
revision of lwp.h.
[EMPTH_LWP] (lwpInitSystem): New parameter waitset, pass it on to
lwpInitSigWait().
[EMPTH_LWP] (lwpReschedule): Call lwpSigWakeup().
[EMPTH_LWP] (empth_init): Declare signals needed by
empth_wait_for_shutdown().
(empth_wait_for_shutdown): Implement on top of lwpSigWait().

Implement empth_wait_for_shutdown() for EMPTH_POSIX:
[EMPTH_POSIX] (empth_init): Block signals, so that
empth_wait_for_shutdown() can use sigwait() safely.
(empth_wait_for_shutdown): Implement on top of sigwait().

Implement empth_wait_for_shutdown() for EMPTH_W32:
(empth_wait_for_shutdown): Implement on top of loc_BlockMainThread().
This commit is contained in:
Markus Armbruster 2006-06-07 21:01:16 +00:00
parent f51769659c
commit 7183516d91
10 changed files with 251 additions and 71 deletions

View file

@ -276,31 +276,6 @@ loc_Exit_Handler(DWORD fdwCtrlType)
}
}
/************************
* empth_request_shutdown
*
* This wakes up the main thread so shutdown can proceed.
* This is done by signalling hShutdownEvent.
*/
void
empth_request_shutdown(void)
{
SetEvent(hShutdownEvent);
}
/************************
* loc_BlockMainThread
*
* This blocks up the main thread. loc_WakeupMainThread() is used
* wakeup the main so shutdown can proceed.
*/
static void
loc_BlockMainThread(void)
{
/* Get the MUTEX semaphore, wait the number of MS */
WaitForSingleObject(hShutdownEvent, INFINITE);
}
/************************
* empth_threadMain
*
@ -490,19 +465,12 @@ empth_exit(void)
{
empth_t *pThread = TlsGetValue(dwTLSIndex);
loc_debug("empth_exit");
loc_BlockThisThread();
loc_debug("empth_exit");
if (pThread->bMainThread) {
loc_BlockMainThread();
loc_RunThisThread();
shutdwn(0);
} else {
TlsSetValue(dwTLSIndex, NULL);
loc_FreeThreadInfo(pThread);
_endthread();
}
TlsSetValue(dwTLSIndex, NULL);
loc_FreeThreadInfo(pThread);
_endthread();
}
/************************
@ -606,6 +574,27 @@ empth_sleep(time_t until)
loc_RunThisThread();
}
/************************
* empth_request_shutdown
*
* This wakes up empth_wait_for_shutdown() so shutdown can proceed.
* This is done by signalling hShutdownEvent.
*/
void
empth_request_shutdown(void)
{
SetEvent(hShutdownEvent);
}
int
empth_wait_for_shutdown(void)
{
/* Get the MUTEX semaphore, wait the number of MS */
WaitForSingleObject(hShutdownEvent, INFINITE);
loc_RunThisThread();
return 0;
}
/************************
* empth_sem_create