diff options
| author | Rich Felker <dalias@aerifal.cx> | 2011-02-12 00:22:29 -0500 | 
|---|---|---|
| committer | Rich Felker <dalias@aerifal.cx> | 2011-02-12 00:22:29 -0500 | 
| commit | 0b44a0315b47dd8eced9f3b7f31580cf14bbfc01 (patch) | |
| tree | 6eaef0d8a720fa3da580de87b647fff796fe80b3 /src/thread/pthread_exit.c | |
| download | musl-0b44a0315b47dd8eced9f3b7f31580cf14bbfc01.tar.gz | |
initial check-in, version 0.5.0v0.5.0
Diffstat (limited to 'src/thread/pthread_exit.c')
| -rw-r--r-- | src/thread/pthread_exit.c | 25 | 
1 files changed, 25 insertions, 0 deletions
diff --git a/src/thread/pthread_exit.c b/src/thread/pthread_exit.c new file mode 100644 index 00000000..4966e234 --- /dev/null +++ b/src/thread/pthread_exit.c @@ -0,0 +1,25 @@ +#include "pthread_impl.h" + +#undef pthread_self + +void pthread_exit(void *result) +{ +	int i; +	struct pthread *self = pthread_self(); +	self->result = result; + +	a_dec(&libc.threads_minus_1); +	if (libc.threads_minus_1 < 0) +		exit(0); + +	LOCK(&self->exitlock); + +	if (self->tsd_used) for (i=0; i<PTHREAD_KEYS_MAX; i++) +		if (self->tsd[i] && libc.tsd_keys[i]) +			libc.tsd_keys[i](self->tsd[i]); + +	if (self->detached && self->map_base) +		__unmapself(self->map_base, self->map_size); + +	__syscall_exit(0); +}  | 
