diff --git a/tsk/base/tsk_error_win32.cpp b/tsk/base/tsk_error_win32.cpp index c67b1e0e64e6e316b568bfa7b21f6e13c94978f5..0e7172cc550f1fb268298e60a912206b90b2cc80 100644 --- a/tsk/base/tsk_error_win32.cpp +++ b/tsk/base/tsk_error_win32.cpp @@ -15,22 +15,26 @@ #include <windows.h> -static DWORD tlsIndex; - namespace tsk { - static DWORD tlsIndex; - class GetTlsIndex { public: GetTlsIndex() { tlsIndex = TlsAlloc(); } + ~GetTlsIndex() { TlsFree(tlsIndex); } + + DWORD GetIndex() { + return tlsIndex; + } + private: + static DWORD tlsIndex; }; + DWORD GetTlsIndex::tlsIndex; static GetTlsIndex getTlsIndex; } @@ -40,11 +44,13 @@ namespace tsk { */ extern "C" void *tsk_error_win32_get_per_thread_(unsigned struct_size) { - void *ptr = TlsGetValue(tlsIndex); + + DWORD index = tsk::getTlsIndex.GetIndex(); + void *ptr = TlsGetValue( index ); if (ptr == 0) { ptr = malloc(struct_size); memset(ptr, 0, struct_size); - TlsSetValue(tlsIndex, ptr); + TlsSetValue(index, ptr); } return ptr; } @@ -54,10 +60,12 @@ void *tsk_error_win32_get_per_thread_(unsigned struct_size) { */ extern "C" void tsk_error_win32_thread_cleanup() { - void *ptr = TlsGetValue(tlsIndex); + + DWORD index = tsk::getTlsIndex.GetIndex(); + void *ptr = TlsGetValue(index); if (ptr != 0) { free(ptr); - TlsSetValue(tlsIndex, 0); + TlsSetValue(index, 0); } }