diff options
author | Nick Mathewson <nickm@torproject.org> | 2015-08-12 10:49:19 -0400 |
---|---|---|
committer | Nick Mathewson <nickm@torproject.org> | 2015-08-18 08:56:23 -0400 |
commit | 9ec94f1d22a87fbf86f721c6106f78f85b8be33c (patch) | |
tree | 9f2e36dad0208158c77be8a986e49973a4401988 /src/common/compat_winthreads.c | |
parent | e2a6a7ec6178834c3de7a3be614679120e2c00c8 (diff) | |
download | tor-9ec94f1d22a87fbf86f721c6106f78f85b8be33c.tar.gz tor-9ec94f1d22a87fbf86f721c6106f78f85b8be33c.zip |
Use thread-local storage to block event_queue recursion.
Diffstat (limited to 'src/common/compat_winthreads.c')
-rw-r--r-- | src/common/compat_winthreads.c | 27 |
1 files changed, 27 insertions, 0 deletions
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; |