mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2025-01-31 12:41:49 +01:00
ThreadLocal: Return a mutable pointer if templated with a non-const type
It makes more sense for ThreadLocal<const T>::get to return a const T* and ThreadLocal<T>::get to return a T*. llvm-svn: 224225
This commit is contained in:
parent
7be100deb9
commit
5756ece9cb
@ -36,7 +36,7 @@ namespace llvm {
|
||||
ThreadLocalImpl();
|
||||
virtual ~ThreadLocalImpl();
|
||||
void setInstance(const void* d);
|
||||
const void* getInstance();
|
||||
void *getInstance();
|
||||
void removeInstance();
|
||||
};
|
||||
|
||||
|
@ -31,7 +31,7 @@ void ThreadLocalImpl::setInstance(const void* d) {
|
||||
void **pd = reinterpret_cast<void**>(&data);
|
||||
*pd = const_cast<void*>(d);
|
||||
}
|
||||
const void* ThreadLocalImpl::getInstance() {
|
||||
void *ThreadLocalImpl::getInstance() {
|
||||
void **pd = reinterpret_cast<void**>(&data);
|
||||
return *pd;
|
||||
}
|
||||
@ -72,7 +72,7 @@ void ThreadLocalImpl::setInstance(const void* d) {
|
||||
(void) errorcode;
|
||||
}
|
||||
|
||||
const void* ThreadLocalImpl::getInstance() {
|
||||
void *ThreadLocalImpl::getInstance() {
|
||||
pthread_key_t* key = reinterpret_cast<pthread_key_t*>(&data);
|
||||
return pthread_getspecific(*key);
|
||||
}
|
||||
|
@ -21,6 +21,6 @@ using namespace sys;
|
||||
ThreadLocalImpl::ThreadLocalImpl() : data() { }
|
||||
ThreadLocalImpl::~ThreadLocalImpl() { }
|
||||
void ThreadLocalImpl::setInstance(const void* d) { data = const_cast<void*>(d);}
|
||||
const void* ThreadLocalImpl::getInstance() { return data; }
|
||||
void *ThreadLocalImpl::getInstance() { return data; }
|
||||
void ThreadLocalImpl::removeInstance() { setInstance(0); }
|
||||
}
|
||||
|
@ -34,7 +34,7 @@ ThreadLocalImpl::~ThreadLocalImpl() {
|
||||
TlsFree(*tls);
|
||||
}
|
||||
|
||||
const void* ThreadLocalImpl::getInstance() {
|
||||
void *ThreadLocalImpl::getInstance() {
|
||||
DWORD* tls = reinterpret_cast<DWORD*>(&data);
|
||||
return TlsGetValue(*tls);
|
||||
}
|
||||
|
@ -1,6 +1,6 @@
|
||||
//===- llvm/unittest/Support/ThreadLocalTest.cpp - Therad Local tests ---===//
|
||||
//===- llvm/unittest/Support/ThreadLocalTest.cpp - ThreadLocal tests ------===//
|
||||
//
|
||||
// The LLVM Compiler Infrastructure
|
||||
// The LLVM Compiler Infrastructure
|
||||
//
|
||||
// This file is distributed under the University of Illinois Open Source
|
||||
// License. See LICENSE.TXT for details.
|
||||
@ -9,6 +9,7 @@
|
||||
|
||||
#include "llvm/Support/ThreadLocal.h"
|
||||
#include "gtest/gtest.h"
|
||||
#include <type_traits>
|
||||
|
||||
using namespace llvm;
|
||||
using namespace sys;
|
||||
@ -25,6 +26,10 @@ struct S {
|
||||
TEST_F(ThreadLocalTest, Basics) {
|
||||
ThreadLocal<const S> x;
|
||||
|
||||
static_assert(
|
||||
std::is_const<std::remove_pointer<decltype(x.get())>::type>::value,
|
||||
"ThreadLocal::get didn't return a pointer to const object");
|
||||
|
||||
EXPECT_EQ(nullptr, x.get());
|
||||
|
||||
S s;
|
||||
@ -33,6 +38,20 @@ TEST_F(ThreadLocalTest, Basics) {
|
||||
|
||||
x.erase();
|
||||
EXPECT_EQ(nullptr, x.get());
|
||||
|
||||
ThreadLocal<S> y;
|
||||
|
||||
static_assert(
|
||||
!std::is_const<std::remove_pointer<decltype(y.get())>::type>::value,
|
||||
"ThreadLocal::get returned a pointer to const object");
|
||||
|
||||
EXPECT_EQ(nullptr, y.get());
|
||||
|
||||
y.set(&s);
|
||||
EXPECT_EQ(&s, y.get());
|
||||
|
||||
y.erase();
|
||||
EXPECT_EQ(nullptr, y.get());
|
||||
}
|
||||
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user