summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--tsd.c56
1 files changed, 56 insertions, 0 deletions
diff --git a/tsd.c b/tsd.c
new file mode 100644
index 0000000..e17caf2
--- /dev/null
+++ b/tsd.c
@@ -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;
+}
+