summaryrefslogtreecommitdiff
path: root/src/thread/pthread_exit.c
blob: 4966e2344cea13c405bbb4b1d57eca062b54098c (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
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);
}