From 204098a7520205b4534044b3840f68cb1a6e20ae Mon Sep 17 00:00:00 2001 From: Martin Willi Date: Fri, 6 Dec 2013 11:33:40 +0100 Subject: thread-value: Immediately cleanup all Windows TLS values on destroy --- src/libstrongswan/threading/windows/thread.c | 36 +++++++++++++++++++++++++++- 1 file changed, 35 insertions(+), 1 deletion(-) (limited to 'src/libstrongswan/threading/windows/thread.c') diff --git a/src/libstrongswan/threading/windows/thread.c b/src/libstrongswan/threading/windows/thread.c index 5fa68bb91..35d56c47d 100644 --- a/src/libstrongswan/threading/windows/thread.c +++ b/src/libstrongswan/threading/windows/thread.c @@ -68,7 +68,7 @@ struct private_thread_t { array_t *cleanup; /** - * Thread specific values for this thread, as cleanup_t + * Thread specific values for this thread */ hashtable_t *tls; @@ -238,12 +238,44 @@ void* thread_tls_remove(void *key) thread = get_current_thread(); old = set_leak_detective(FALSE); + threads_lock->lock(threads_lock); value = thread->tls->remove(thread->tls, key); + threads_lock->unlock(threads_lock); set_leak_detective(old); return value; } +/** + * See header. + */ +void thread_tls_remove_all(void *key) +{ + private_thread_t *thread; + enumerator_t *enumerator; + void *value; + bool old; + + old = set_leak_detective(FALSE); + threads_lock->lock(threads_lock); + + enumerator = threads->create_enumerator(threads); + while (enumerator->enumerate(enumerator, NULL, &thread)) + { + value = thread->tls->remove(thread->tls, key); + if (value) + { + set_leak_detective(old); + thread_tls_cleanup(value); + set_leak_detective(FALSE); + } + } + enumerator->destroy(enumerator); + + threads_lock->unlock(threads_lock); + set_leak_detective(old); +} + /** * Thread cleanup data */ @@ -272,6 +304,7 @@ static void docleanup(private_thread_t *this) set_leak_detective(FALSE); } + threads_lock->lock(threads_lock); enumerator = this->tls->create_enumerator(this->tls); while (enumerator->enumerate(enumerator, NULL, &tls)) { @@ -282,6 +315,7 @@ static void docleanup(private_thread_t *this) set_leak_detective(FALSE); } enumerator->destroy(enumerator); + threads_lock->unlock(threads_lock); set_leak_detective(old); } -- cgit v1.2.3