diff options
Diffstat (limited to 'sync.c')
-rw-r--r-- | sync.c | 48 |
1 files changed, 48 insertions, 0 deletions
@@ -0,0 +1,48 @@ +/* + * sync.c + * + * Description: + * This translation unit implements functions related to thread + * synchronisation. + */ + +#include "pthread.h" + +int +pthread_join(pthread_t thread, void ** valueptr) +{ + LPDWORD exitcode; + pthread_t us = pthread_self(); + + /* First check if we are trying to join to ourselves. */ + if (pthread_equal(thread, us) == 0) + { + return EDEADLK; + } + + /* Wait on the kernel thread object. */ + switch (WaitForSingleObject(thread, INFINITE)) + { + case WAIT_FAILED: + /* The thread does not exist. */ + return ESRCH; + case WAIT_OBJECT_0: + /* The thread has finished. */ + break; + default: + /* This should never happen. */ + break; + } + + /* We don't get the exit code as a result of the last operation, + so we do it now. */ + + if (GetExitCodeThread(thread, exitcode) != TRUE) + { + return ESRCH; + } + + /* FIXME: this is wrong. */ + return &exitcode; +} + |