summaryrefslogtreecommitdiff
path: root/private.c
diff options
context:
space:
mode:
authorrpj <rpj>2000-12-29 07:08:44 +0000
committerrpj <rpj>2000-12-29 07:08:44 +0000
commit0c2cb3fb140fb0d12586587001cb1ca238cf8c25 (patch)
tree72caf359f0e3d2aea2c833c8061b65f971f91381 /private.c
parentbab1896412f2d292ebd8d44bc9d6ddb58a8702b0 (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.c57
1 files changed, 42 insertions, 15 deletions
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 */