diff options
author | rpj <rpj> | 1999-08-12 01:32:02 +0000 |
---|---|---|
committer | rpj <rpj> | 1999-08-12 01:32:02 +0000 |
commit | 9af51e470791639995bb34bd3198014dc11e2fef (patch) | |
tree | 8b06f29abbaf8d1cc027bab0731a9fe79db69413 /exit.c | |
parent | 77d0a6ff70ef2bb480c927e563340fc501ec0930 (diff) |
Merged patches to main trunk.
Diffstat (limited to 'exit.c')
-rw-r--r-- | exit.c | 57 |
1 files changed, 55 insertions, 2 deletions
@@ -51,7 +51,60 @@ pthread_exit (void *value_ptr) * ------------------------------------------------------ */ { - _pthread_callUserDestroyRoutines((pthread_t) pthread_getspecific(_pthread_selfThreadKey)); + pthread_t self = pthread_self(); + + /* If the current thread is implicit it was not started through + pthread_create(), therefore we cleanup and end the thread + here. Otherwise we raise an exception to unwind the exception + stack. The exception will be caught by _pthread_threadStart(), + which will cleanup and end the thread for us. + */ + + if (self->implicit) + { + _pthread_callUserDestroyRoutines(self); + + _endthreadex ((unsigned) value_ptr); + + /* Never reached */ + } + else + { +#ifdef _MSC_VER + + DWORD exceptionInformation[3]; + + exceptionInformation[0] = (DWORD) (_PTHREAD_EPS_EXIT); + exceptionInformation[1] = (DWORD) (value_ptr); + exceptionInformation[2] = (DWORD) (0); + + RaiseException ( + EXCEPTION_PTHREAD_SERVICES, + 0, + 3, + exceptionInformation); + +#else /* ! _MSC_VER */ + +#ifdef __cplusplus + + self->exceptionInformation = value_ptr; + throw Pthread_exception_exit(); + +#else /* ! __cplusplus */ + + (void) pthread_pop_cleanup( 1 ); + + _pthread_callUserDestroyRoutines(self); + + _endthreadex ((unsigned) value_ptr); + +#endif /* __cplusplus */ + +#endif /* _MSC_VER */ + + } + + /* Never reached. */ - _endthreadex ((unsigned) value_ptr); } |