00001
00002
00003 #include "pch.h"
00004 #include "trdlocal.h"
00005
00006 #ifdef THREADS_AVAILABLE
00007
00008 NAMESPACE_BEGIN(CryptoPP)
00009
00010 ThreadLocalStorage::Err::Err(const std::string& operation, int error)
00011 : OS_Error(OTHER_ERROR, "ThreadLocalStorage: " + operation + " operation failed with error 0x" + IntToString(error, 16), operation, error)
00012 {
00013 }
00014
00015 ThreadLocalStorage::ThreadLocalStorage()
00016 {
00017 #ifdef HAS_WINTHREADS
00018 m_index = TlsAlloc();
00019 if (m_index == TLS_OUT_OF_INDEXES)
00020 throw Err("TlsAlloc", GetLastError());
00021 #else
00022 int error = pthread_key_create(&m_index, NULL);
00023 if (error)
00024 throw Err("pthread_key_create", error);
00025 #endif
00026 }
00027
00028 ThreadLocalStorage::~ThreadLocalStorage()
00029 {
00030 #ifdef HAS_WINTHREADS
00031 if (!TlsFree(m_index))
00032 throw Err("TlsFree", GetLastError());
00033 #else
00034 int error = pthread_key_delete(m_index);
00035 if (error)
00036 throw Err("pthread_key_delete", error);
00037 #endif
00038 }
00039
00040 void ThreadLocalStorage::SetValue(void *value)
00041 {
00042 #ifdef HAS_WINTHREADS
00043 if (!TlsSetValue(m_index, value))
00044 throw Err("TlsSetValue", GetLastError());
00045 #else
00046 int error = pthread_setspecific(m_index, value);
00047 if (error)
00048 throw Err("pthread_key_getspecific", error);
00049 #endif
00050 }
00051
00052 void *ThreadLocalStorage::GetValue() const
00053 {
00054 #ifdef HAS_WINTHREADS
00055 void *result = TlsGetValue(m_index);
00056 if (!result && GetLastError() != NO_ERROR)
00057 throw Err("TlsGetValue", GetLastError());
00058 #else
00059 void *result = pthread_getspecific(m_index);
00060 #endif
00061 return result;
00062 }
00063
00064 NAMESPACE_END
00065
00066 #endif // #ifdef THREADS_AVAILABLE