diff options
author | rpj <rpj> | 2000-12-29 07:08:44 +0000 |
---|---|---|
committer | rpj <rpj> | 2000-12-29 07:08:44 +0000 |
commit | 0c2cb3fb140fb0d12586587001cb1ca238cf8c25 (patch) | |
tree | 72caf359f0e3d2aea2c833c8061b65f971f91381 /private.c | |
parent | bab1896412f2d292ebd8d44bc9d6ddb58a8702b0 (diff) |
./ChangeLog:
2000-12-29 Ross Johnson <rpj@special.ise.canberra.edu.au>
* 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 <rpj@special.ise.canberra.edu.au>
* 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 <rpj@special.ise.canberra.edu.au>
* 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.
Diffstat (limited to 'private.c')
-rw-r--r-- | private.c | 57 |
1 files changed, 42 insertions, 15 deletions
@@ -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 */ |