diff options
Diffstat (limited to 'tsd.c')
-rw-r--r-- | tsd.c | 56 |
1 files changed, 56 insertions, 0 deletions
@@ -0,0 +1,56 @@ +/* + * tsd.c + * + * Description: + * POSIX thread functions which implement thread-specific data (TSD). + */ + +#include "pthread.h" + +int +pthread_key_create(pthread_key_t *key, void (*destructor)(void *)) +{ + DWORD index; + + /* FIXME: the destructor function is ignored for now. This needs to + be managed via the same cleanup handler mechanism as user-define + cleanup handlers during a thread exit. */ + + if (destructor != NULL) + { + return EINVAL; + } + + index = TlsAlloc(); + if (index == 0xFFFFFFFF) + { + return EAGAIN; + } + + /* Only modify the `key' parameter if allocation was successful. */ + *key = index; + + return 0; +} + +int +pthread_setspecific(pthread_key_t key, void *value) +{ + return (TlsSetValue(key, value) == FALSE) ? EINVAL : 0; +} + +void * +pthread_getspecific(pthread_key_t key) +{ + /* FIXME: this code assumes that TlsGetValue returns NULL if the key + is not present in the TLS structure. Confirm. */ + + return TlsGetValue(key); +} + +int +pthread_key_delete(pthread_key_t key) +{ + return (TlsFree(key) == FALSE) ? EINVAL : 0; +} + |