From 0c2cb3fb140fb0d12586587001cb1ca238cf8c25 Mon Sep 17 00:00:00 2001 From: rpj Date: Fri, 29 Dec 2000 07:08:44 +0000 Subject: ./ChangeLog: 2000-12-29 Ross Johnson * Makefile: Back-out "for" loops which don't work. * GNUmakefile: Remove the fake.a target; add the "realclean" target; don't remove built libs under the "clean" target. * config.h: Add a guard against multiple inclusion. * semaphore.h: Add some defines from config.h to make semaphore.h independent of config.h when building apps. * pthread.h (_errno): Back-out previous fix until we know how to fix it properly. * implement.h (lockCount): Add missing element to pthread_mutex_t_. * sync.c (pthread_join): Spelling fix in comment. * private.c (ptw32_threadStart): Reset original termination function (C++). (ptw32_threadStart): Cleanup detached threads early in case the library is statically linked. (ptw32_callUserDestroyRoutines): Remove [SEH] __try block from destructor call so that unhandled exceptions will be passed through to the system; call terminate() from [C++] try block for the same reason. * tsd.c (pthread_getspecific): Add comment. * mutex.c (pthread_mutex_init): Initialise new elements in pthread_mutex_t. (pthread_mutex_unlock): Invert "pthread_equal()" test. 2000-12-28 Ross Johnson * semaphore.c (mode_t): Use ifndef HAVE_MODE_T to include definition. * config.h.in (HAVE_MODE_T): Added. (_UWIN): Start adding defines for the UWIN package. ./tests/ChangeLog: 2000-12-29 Ross Johnson * GNUmakefile: Add mutex4 test; ensure libpthreadw32.a is removed for "clean" target. * Makefile: Add mutex4 test. * exception3.c: Remove SEH code; automatically pass the test under SEH (which is an N/A environment). * mutex4.c: New test. * eyal1.c (do_work_unit): Add a dummy "if" to force the optimiser to retain code; reduce thread work loads. * condvar8.c (main): Add an additional "assert" for debugging; increase pthread_cond_signal timeout. --- private.c | 57 ++++++++++++++++++++++++++++++++++++++++++--------------- 1 file changed, 42 insertions(+), 15 deletions(-) (limited to 'private.c') diff --git a/private.c b/private.c index 977eb67..ee3ab52 100644 --- a/private.c +++ b/private.c @@ -240,7 +240,7 @@ ptw32_threadStart (ThreadParms * threadParms) void *(*start) (void *); void *arg; -#ifdef _MSC_VER +#if defined(_MSC_VER) && !defined(__cplusplus) DWORD ei[] = {0,0,0}; #endif @@ -354,6 +354,7 @@ ptw32_threadStart (ThreadParms * threadParms) */ status = self->exitStatus = PTHREAD_CANCELED; (void) pthread_mutex_destroy(&self->cancelLock); + (void) set_terminate(ptw32_oldTerminate); ptw32_callUserDestroyRoutines(self); throw; @@ -362,6 +363,8 @@ ptw32_threadStart (ThreadParms * threadParms) */ } + (void) set_terminate(ptw32_oldTerminate); + #else /* __cplusplus */ /* @@ -375,7 +378,32 @@ ptw32_threadStart (ThreadParms * threadParms) #endif /* _MSC_VER */ (void) pthread_mutex_destroy(&self->cancelLock); - ptw32_callUserDestroyRoutines(self); + +#if 1 + if (self->detachState == PTHREAD_CREATE_DETACHED) + { + /* + * We need to cleanup the pthread now in case we have + * been statically linked, in which case the cleanup + * in dllMain won't get done. Joinable threads will + * be cleaned up by pthread_join(). + * + * Note that implicitly created pthreads (those created + * for Win32 threads which have called pthreads routines) + * must be cleaned up explicitly by the application + * (by calling pthread_win32_thread_detach_np()) if + * this library has been statically linked. For the dll, + * dllMain will do the cleanup automatically. + */ + (void) pthread_win32_thread_detach_np (); + } + else + { + ptw32_callUserDestroyRoutines (self); + } +#else + ptw32_callUserDestroyRoutines (self); +#endif #if ! defined (__MINGW32__) || defined (__MSVCRT__) _endthreadex ((unsigned) status); @@ -611,21 +639,15 @@ ptw32_callUserDestroyRoutines (pthread_t thread) #if defined(_MSC_VER) && !defined(__cplusplus) - __try - { /* * Run the caller's cleanup routine. + * + * If an exception occurs we let the system handle it + * as an unhandled exception. Since we are leaving the + * thread we should not get any internal pthreads + * exceptions. */ (*(k->destructor)) (value); - } - __except (EXCEPTION_EXECUTE_HANDLER) - { - /* - * A system unexpected exception had occurred - * running the user's destructor. - * We get control back within this block. - */ - } #else /* _MSC_VER && !__cplusplus */ #ifdef __cplusplus @@ -640,10 +662,15 @@ ptw32_callUserDestroyRoutines (pthread_t thread) catch (...) { /* - * A system unexpected exception had occurred + * A system unexpected exception has occurred * running the user's destructor. - * We get control back within this block. + * We get control back within this block in case + * the application has set up it's own terminate + * handler. Since we are leaving the thread we + * should not get any internal pthreads + * exceptions. */ + terminate(); } #else /* __cplusplus */ -- cgit v1.2.3