summaryrefslogtreecommitdiff
path: root/src/thread/pthread_setspecific.c
blob: 171cef41e8305173d00c3aea7a0377a7d614aed2 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include "pthread_impl.h"

int pthread_setspecific(pthread_key_t k, const void *x)
{
	struct pthread *self = pthread_self();
	/* Handle the case of the main thread */
	if (!self->tsd) {
		if (!x) return 0;
		if (!(self->tsd = calloc(sizeof(void *), PTHREAD_KEYS_MAX)))
			return ENOMEM;
	}
	/* Avoid unnecessary COW */
	if (self->tsd[k] != x) {
		self->tsd[k] = (void *)x;
		self->tsd_used = 1;
	}
	return 0;
}