1
by weidai
Initial revision |
1 |
// trdlocal.cpp - written and placed in the public domain by Wei Dai
|
2 |
||
3 |
#include "pch.h" |
|
75
by weidai
create DLL version, fix GetNextIV() bug in CTR and OFB modes |
4 |
|
5 |
#ifndef CRYPTOPP_IMPORTS
|
|
83
by weidai
fix for Unix |
6 |
#ifdef THREADS_AVAILABLE
|
75
by weidai
create DLL version, fix GetNextIV() bug in CTR and OFB modes |
7 |
|
1
by weidai
Initial revision |
8 |
#include "trdlocal.h" |
84
by weidai
fix for Unix |
9 |
|
10 |
#ifdef HAS_WINTHREADS
|
|
75
by weidai
create DLL version, fix GetNextIV() bug in CTR and OFB modes |
11 |
#include <windows.h> |
84
by weidai
fix for Unix |
12 |
#endif
|
1
by weidai
Initial revision |
13 |
|
14 |
NAMESPACE_BEGIN(CryptoPP) |
|
15 |
||
16 |
ThreadLocalStorage::Err::Err(const std::string& operation, int error) |
|
17 |
: OS_Error(OTHER_ERROR, "ThreadLocalStorage: " + operation + " operation failed with error 0x" + IntToString(error, 16), operation, error) |
|
18 |
{
|
|
19 |
}
|
|
20 |
||
21 |
ThreadLocalStorage::ThreadLocalStorage() |
|
22 |
{
|
|
23 |
#ifdef HAS_WINTHREADS
|
|
24 |
m_index = TlsAlloc(); |
|
25 |
if (m_index == TLS_OUT_OF_INDEXES) |
|
26 |
throw Err("TlsAlloc", GetLastError()); |
|
27 |
#else
|
|
28 |
int error = pthread_key_create(&m_index, NULL); |
|
29 |
if (error) |
|
30 |
throw Err("pthread_key_create", error); |
|
31 |
#endif
|
|
32 |
}
|
|
33 |
||
34 |
ThreadLocalStorage::~ThreadLocalStorage() |
|
35 |
{
|
|
36 |
#ifdef HAS_WINTHREADS
|
|
37 |
if (!TlsFree(m_index)) |
|
38 |
throw Err("TlsFree", GetLastError()); |
|
39 |
#else
|
|
40 |
int error = pthread_key_delete(m_index); |
|
41 |
if (error) |
|
42 |
throw Err("pthread_key_delete", error); |
|
43 |
#endif
|
|
44 |
}
|
|
45 |
||
46 |
void ThreadLocalStorage::SetValue(void *value) |
|
47 |
{
|
|
48 |
#ifdef HAS_WINTHREADS
|
|
49 |
if (!TlsSetValue(m_index, value)) |
|
50 |
throw Err("TlsSetValue", GetLastError()); |
|
51 |
#else
|
|
52 |
int error = pthread_setspecific(m_index, value); |
|
53 |
if (error) |
|
54 |
throw Err("pthread_key_getspecific", error); |
|
55 |
#endif
|
|
56 |
}
|
|
57 |
||
58 |
void *ThreadLocalStorage::GetValue() const |
|
59 |
{
|
|
60 |
#ifdef HAS_WINTHREADS
|
|
61 |
void *result = TlsGetValue(m_index); |
|
62 |
if (!result && GetLastError() != NO_ERROR) |
|
63 |
throw Err("TlsGetValue", GetLastError()); |
|
64 |
#else
|
|
65 |
void *result = pthread_getspecific(m_index); |
|
66 |
#endif
|
|
67 |
return result; |
|
68 |
}
|
|
69 |
||
70 |
NAMESPACE_END
|
|
71 |
||
72 |
#endif // #ifdef THREADS_AVAILABLE |
|
75
by weidai
create DLL version, fix GetNextIV() bug in CTR and OFB modes |
73 |
#endif
|