Main Page | Namespace List | Class Hierarchy | Alphabetical List | Class List | File List | Class Members | File Members

trdlocal.cpp

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

Generated on Wed Jul 21 19:15:35 2004 for Crypto++ by doxygen 1.3.7-20040704