diff options
author | Argyrios Kyrtzidis <akyrtzi@gmail.com> | 2012-06-12 00:21:31 +0000 |
---|---|---|
committer | Argyrios Kyrtzidis <akyrtzi@gmail.com> | 2012-06-12 00:21:31 +0000 |
commit | 8d19c86c9a2fb83d606aef7e6e0b43c886ec6bc5 (patch) | |
tree | 27023e3a392b7e534729678f59db918a248cc3cc /llvm/lib/Support/ThreadLocal.cpp | |
parent | 2fdc07ee8972b41032a98ed7699fed132557a78e (diff) | |
download | bcm5719-llvm-8d19c86c9a2fb83d606aef7e6e0b43c886ec6bc5.tar.gz bcm5719-llvm-8d19c86c9a2fb83d606aef7e6e0b43c886ec6bc5.zip |
For llvm::sys::ThreadLocalImpl instead of malloc'ing the platform-specific
thread local data, embed them in the class using a uint64_t and make sure
we get compiler errors if there's a platform where this is not big enough.
This makes ThreadLocal more safe for using it in conjunction with CrashRecoveryContext.
Related to crash in rdar://11434201.
llvm-svn: 158342
Diffstat (limited to 'llvm/lib/Support/ThreadLocal.cpp')
-rw-r--r-- | llvm/lib/Support/ThreadLocal.cpp | 11 |
1 files changed, 5 insertions, 6 deletions
diff --git a/llvm/lib/Support/ThreadLocal.cpp b/llvm/lib/Support/ThreadLocal.cpp index 08b12b658be..1030a2b97db 100644 --- a/llvm/lib/Support/ThreadLocal.cpp +++ b/llvm/lib/Support/ThreadLocal.cpp @@ -41,30 +41,29 @@ namespace llvm { using namespace sys; ThreadLocalImpl::ThreadLocalImpl() : data(0) { - pthread_key_t* key = new pthread_key_t; + typedef int SIZE_TOO_BIG[sizeof(pthread_key_t) <= sizeof(data) ? 1 : -1]; + pthread_key_t* key = reinterpret_cast<pthread_key_t*>(&data); int errorcode = pthread_key_create(key, NULL); assert(errorcode == 0); (void) errorcode; - data = (void*)key; } ThreadLocalImpl::~ThreadLocalImpl() { - pthread_key_t* key = static_cast<pthread_key_t*>(data); + pthread_key_t* key = reinterpret_cast<pthread_key_t*>(&data); int errorcode = pthread_key_delete(*key); assert(errorcode == 0); (void) errorcode; - delete key; } void ThreadLocalImpl::setInstance(const void* d) { - pthread_key_t* key = static_cast<pthread_key_t*>(data); + pthread_key_t* key = reinterpret_cast<pthread_key_t*>(&data); int errorcode = pthread_setspecific(*key, d); assert(errorcode == 0); (void) errorcode; } const void* ThreadLocalImpl::getInstance() { - pthread_key_t* key = static_cast<pthread_key_t*>(data); + pthread_key_t* key = reinterpret_cast<pthread_key_t*>(&data); return pthread_getspecific(*key); } |