summaryrefslogtreecommitdiff
path: root/ptw32_threadStart.c
diff options
context:
space:
mode:
Diffstat (limited to 'ptw32_threadStart.c')
-rw-r--r--ptw32_threadStart.c55
1 files changed, 23 insertions, 32 deletions
diff --git a/ptw32_threadStart.c b/ptw32_threadStart.c
index b7c5748..5c0fe0e 100644
--- a/ptw32_threadStart.c
+++ b/ptw32_threadStart.c
@@ -109,12 +109,8 @@ static terminate_function
void
ptw32_terminate ()
{
- pthread_t self = pthread_self ();
- ptw32_thread_t * sp = (ptw32_thread_t *) self.p;
-
set_terminate (ptw32_oldTerminate);
- (void) pthread_mutex_destroy (&sp->cancelLock);
- ptw32_callUserDestroyRoutines (self);
+ (void) pthread_win32_thread_detach_np ();
terminate ();
}
@@ -193,7 +189,7 @@ ptw32_threadStart (void *vthreadParms)
switch (ei[0])
{
case PTW32_EPS_CANCEL:
- status = PTHREAD_CANCELED;
+ status = sp->exitStatus = PTHREAD_CANCELED;
#ifdef _UWIN
if (--pthread_count <= 0)
exit (0);
@@ -203,7 +199,7 @@ ptw32_threadStart (void *vthreadParms)
status = sp->exitStatus;
break;
default:
- status = PTHREAD_CANCELED;
+ status = sp->exitStatus = PTHREAD_CANCELED;
break;
}
}
@@ -227,13 +223,13 @@ ptw32_threadStart (void *vthreadParms)
switch (setjmp_rc)
{
case PTW32_EPS_CANCEL:
- status = PTHREAD_CANCELED;
+ status = sp->exitStatus = PTHREAD_CANCELED;
break;
case PTW32_EPS_EXIT:
status = sp->exitStatus;
break;
default:
- status = PTHREAD_CANCELED;
+ status = sp->exitStatus = PTHREAD_CANCELED;
break;
}
}
@@ -310,9 +306,8 @@ ptw32_threadStart (void *vthreadParms)
(void) pthread_mutex_lock (&sp->cancelLock);
sp->state = PThreadStateException;
(void) pthread_mutex_unlock (&sp->cancelLock);
- (void) pthread_mutex_destroy (&sp->cancelLock);
+ (void) pthread_win32_thread_detach_np ();
(void) set_terminate (ptw32_oldTerminate);
- ptw32_callUserDestroyRoutines (self);
throw;
/*
@@ -330,27 +325,23 @@ ptw32_threadStart (void *vthreadParms)
#endif /* __CLEANUP_C */
#endif /* __CLEANUP_SEH */
- if (sp->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);
- }
+#if defined(PTW32_STATIC_LIB)
+ /*
+ * We need to cleanup the pthread now if we have
+ * been statically linked, in which case the cleanup
+ * in dllMain won't get done. Joinable threads will
+ * only be partially cleaned up and must be fully cleaned
+ * up by pthread_join() or pthread_detach().
+ *
+ * Note: if this library has been statically linked,
+ * 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()).
+ * For the dll, dllMain will do the cleanup automatically.
+ */
+ (void) pthread_win32_thread_detach_np ();
+#endif
#if ! defined (__MINGW32__) || defined (__MSVCRT__) || defined (__DMC__)
_endthreadex ((unsigned) status);