1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73
|
/*
* The Sleuth Kit
*
* Brian Carrier [carrier <at> sleuthkit [dot] org]
* Copyright (c) 2010-2011 Brian Carrier. All Rights reserved
*
* This software is distributed under the Common Public License 1.0
*/
#include "tsk_base_i.h"
#ifdef TSK_WIN32
#include <windows.h>
namespace tsk {
class GetTlsIndex {
public:
GetTlsIndex() {
tlsIndex = TlsAlloc();
}
~GetTlsIndex() {
TlsFree(tlsIndex);
}
DWORD GetIndex() {
return tlsIndex;
}
private:
static DWORD tlsIndex;
};
DWORD GetTlsIndex::tlsIndex;
static GetTlsIndex getTlsIndex;
}
/*
* There's no destructor model in Win32 as with pthreads.
* A DLLMain could do the job, but we're not a DLL.
*/
extern "C"
void *tsk_error_win32_get_per_thread_(unsigned struct_size) {
DWORD index = tsk::getTlsIndex.GetIndex();
void *ptr = TlsGetValue( index );
if (ptr == 0) {
ptr = malloc(struct_size);
memset(ptr, 0, struct_size);
TlsSetValue(index, ptr);
}
return ptr;
}
/*
* Threads must call this on exit to avoid a leak.
*/
extern "C"
void tsk_error_win32_thread_cleanup() {
DWORD index = tsk::getTlsIndex.GetIndex();
void *ptr = TlsGetValue(index);
if (ptr != 0) {
free(ptr);
TlsSetValue(index, 0);
}
}
#endif /*TSK_WIN32*/
|