X-Git-Url: http://demsky.eecs.uci.edu/git/?a=blobdiff_plain;f=lib%2FSupport%2FThreadLocal.cpp;h=2dec9eb417f5bf4324e7b014c825a16c2664e9c8;hb=78832c6e7d33094c6ef9e99b07dac6f60c0a1207;hp=1030a2b97db4694b1028c6bfccb3c01f41a9fb81;hpb=793537d21f8aa46458a5733d96816ba8bddeef50;p=oota-llvm.git diff --git a/lib/Support/ThreadLocal.cpp b/lib/Support/ThreadLocal.cpp index 1030a2b97db..2dec9eb417f 100644 --- a/lib/Support/ThreadLocal.cpp +++ b/lib/Support/ThreadLocal.cpp @@ -12,6 +12,7 @@ //===----------------------------------------------------------------------===// #include "llvm/Config/config.h" +#include "llvm/Support/Compiler.h" #include "llvm/Support/ThreadLocal.h" //===----------------------------------------------------------------------===// @@ -23,11 +24,20 @@ // Define all methods as no-ops if threading is explicitly disabled namespace llvm { using namespace sys; -ThreadLocalImpl::ThreadLocalImpl() { } +ThreadLocalImpl::ThreadLocalImpl() : data() { } ThreadLocalImpl::~ThreadLocalImpl() { } -void ThreadLocalImpl::setInstance(const void* d) { data = const_cast(d);} -const void* ThreadLocalImpl::getInstance() { return data; } -void ThreadLocalImpl::removeInstance() { data = 0; } +void ThreadLocalImpl::setInstance(const void* d) { + static_assert(sizeof(d) <= sizeof(data), "size too big"); + void **pd = reinterpret_cast(&data); + *pd = const_cast(d); +} +const void* ThreadLocalImpl::getInstance() { + void **pd = reinterpret_cast(&data); + return *pd; +} +void ThreadLocalImpl::removeInstance() { + setInstance(0); +} } #else @@ -40,10 +50,10 @@ void ThreadLocalImpl::removeInstance() { data = 0; } namespace llvm { using namespace sys; -ThreadLocalImpl::ThreadLocalImpl() : data(0) { - typedef int SIZE_TOO_BIG[sizeof(pthread_key_t) <= sizeof(data) ? 1 : -1]; +ThreadLocalImpl::ThreadLocalImpl() : data() { + static_assert(sizeof(pthread_key_t) <= sizeof(data), "size too big"); pthread_key_t* key = reinterpret_cast(&data); - int errorcode = pthread_key_create(key, NULL); + int errorcode = pthread_key_create(key, nullptr); assert(errorcode == 0); (void) errorcode; } @@ -68,7 +78,7 @@ const void* ThreadLocalImpl::getInstance() { } void ThreadLocalImpl::removeInstance() { - setInstance(0); + setInstance(nullptr); } }