diff options
author | rpj <rpj> | 1998-07-24 03:58:18 +0000 |
---|---|---|
committer | rpj <rpj> | 1998-07-24 03:58:18 +0000 |
commit | 0c57f42f9e1bd459a95596b4d70e06f9a7b31148 (patch) | |
tree | 8788724fc18cc2c083f589b361562606558b2608 /create.c | |
parent | e4f6e6fbec7ea7b7a7c358ed0167672714bf991e (diff) |
* sync.c (pthread_join): Save valueptr arg in joinvalueptr for
pthread_exit() to use.
* private.c (_pthread_new_thread_entry): Initialise joinvalueptr to
NULL.
* create.c (_pthread_start_call): Rewrite to facilitate joins.
pthread_exit() will do a longjmp() back to here. Does appropriate
cleanup and exit/return from the thread.
(pthread_create): _beginthreadex() now passes a pointer to our
thread table entry instead of just the call member of that entry.
* implement.h (_pthread_threads_thread): New member
void ** joinvalueptr.
(_pthread_call_t): New member jmpbuf env.
* exit.c (pthread_exit): Major rewrite to handle joins and handing
value pointer to joining thread. Uses longjmp() back to
_pthread_start_call().
Diffstat (limited to 'create.c')
-rw-r--r-- | create.c | 34 |
1 files changed, 23 insertions, 11 deletions
@@ -12,26 +12,38 @@ #include "implement.h" unsigned -_pthread_start_call(void * call) +_pthread_start_call(void * thisarg) { /* We're now in a running thread. Any local variables here are on this threads private stack so we're safe to leave data in them until we leave. */ - _pthread_call_t * this; + _pthread_threads_thread__t * this = thisarg; + _pthread_call_t * call; unsigned (*func)(void *); void * arg; unsigned ret; + int from; - this = (_pthread_call_t *) call; - func = call->routine; - arg = call->arg; + func = this->call.routine; + arg = this->call.arg; - ret = (*func)(arg); + /* FIXME: Should we be using sigsetjmp() here instead. */ + from = setjmp(this->call.env); - /* If we get to here then we're returning naturally and haven't - been cancelled. We need to cleanup and remove the thread - from the threads table. */ - _pthread_vacuum(); + if (from == 0) + { + ret = (*func)(arg); + + _pthread_vacuum(); + } + else + { + /* func() called pthread_exit() which called longjmp(). */ + _pthread_vacuum(); + + /* Never returns. */ + _endthreadex(0); + } return ret; } @@ -75,7 +87,7 @@ pthread_create(pthread_t *thread, handle = (HANDLE) _beginthreadex(security, attr_copy->stacksize, _pthread_start_call, - (void *) &(this->call), + (void *) this, flags, &threadID); |