diff options
Diffstat (limited to 'src/common')
-rw-r--r-- | src/common/compat_pthreads.c | 27 | ||||
-rw-r--r-- | src/common/compat_threads.h | 13 | ||||
-rw-r--r-- | src/common/compat_winthreads.c | 27 |
3 files changed, 67 insertions, 0 deletions
diff --git a/src/common/compat_pthreads.c b/src/common/compat_pthreads.c index b78ab3d871..4b32fc93d2 100644 --- a/src/common/compat_pthreads.c +++ b/src/common/compat_pthreads.c @@ -275,6 +275,33 @@ tor_cond_signal_all(tor_cond_t *cond) pthread_cond_broadcast(&cond->cond); } +int +tor_threadlocal_init(tor_threadlocal_t *threadlocal) +{ + int err = pthread_key_create(&threadlocal->key, NULL); + return err ? -1 : 0; +} + +void +tor_threadlocal_destroy(tor_threadlocal_t *threadlocal) +{ + pthread_key_delete(threadlocal->key); + memset(threadlocal, 0, sizeof(tor_threadlocal_t)); +} + +void * +tor_threadlocal_get(tor_threadlocal_t *threadlocal) +{ + return pthread_getspecific(threadlocal->key); +} + +void +tor_threadlocal_set(tor_threadlocal_t *threadlocal, void *value) +{ + int err = pthread_setspecific(threadlocal->key, value); + tor_assert(err == 0); +} + /** Set up common structures for use by threading. */ void tor_threads_init(void) diff --git a/src/common/compat_threads.h b/src/common/compat_threads.h index acf3083f37..a1b5056a40 100644 --- a/src/common/compat_threads.h +++ b/src/common/compat_threads.h @@ -111,5 +111,18 @@ typedef struct alert_sockets_s { int alert_sockets_create(alert_sockets_t *socks_out, uint32_t flags); void alert_sockets_close(alert_sockets_t *socks); +typedef struct tor_threadlocal_s { +#ifdef _WIN32 + DWORD index; +#else + pthread_key_t key; +#endif +} tor_threadlocal_t; + +int tor_threadlocal_init(tor_threadlocal_t *threadlocal); +void tor_threadlocal_destroy(tor_threadlocal_t *threadlocal); +void *tor_threadlocal_get(tor_threadlocal_t *threadlocal); +void tor_threadlocal_set(tor_threadlocal_t *threadlocal, void *value); + #endif diff --git a/src/common/compat_winthreads.c b/src/common/compat_winthreads.c index 71b994c4e4..3d9e236d8b 100644 --- a/src/common/compat_winthreads.c +++ b/src/common/compat_winthreads.c @@ -123,6 +123,33 @@ tor_cond_signal_all(tor_cond_t *cond) } int +tor_threadlocal_init(tor_threadlocal_t *threadlocal) +{ + threadlocal->index = TlsAlloc(); + return (threadlocal->index == TLS_OUT_OF_INDEXES) ? -1 : 0; +} + +void +tor_threadlocal_destroy(tor_threadlocal_t *threadlocal) +{ + TlsFree(threadlocal->index); + memset(threadlocal, 0, sizeof(tor_threadlocal_t)); +} + +void * +tor_threadlocal_get(tor_threadlocal_t *threadlocal) +{ + return TlsGetValue(threadlocal->index); +} + +void +tor_threadlocal_set(tor_threadlocal_t *threadlocal, void *value) +{ + BOOL ok = TlsSetValue(threadlocal->index, value); + tor_assert(ok); +} + +int tor_cond_wait(tor_cond_t *cond, tor_mutex_t *lock_, const struct timeval *tv) { CRITICAL_SECTION *lock = &lock_->mutex; |