#pragma once
#include <pthread.h>
#include "util/tc_common.h"
namespace local {
template<typename T>
class ThreadLocalPointer {
public:
typedef pthread_key_t SlotType;
typedef T DataType;
ThreadLocalPointer()
: m_slot()
{
int ret = pthread_key_create(&m_slot, [](void * p){
DataType * td = static_cast<DataType *>(p);
if (td) {
delete td;
}
});
if (ret != 0 || 0 == m_slot) {
throw std::runtime_error("pthread_key_create error " + taf::TC_Common::tostr(ret));
}
}
~ThreadLocalPointer()
{
pthread_key_delete(m_slot);
}
DataType * get()
{
return static_cast<DataType *>(pthread_getspecific(m_slot));
}
void set(DataType* ptr)
{
DataType * old = static_cast<DataType *>(pthread_getspecific(m_slot));
if(old != NULL && old != ptr) {
delete old;
}
int ret = pthread_setspecific(m_slot, static_cast<void *>(ptr));
if(ret != 0) {
throw std::runtime_error("pthread_setspecific error " + taf::TC_Common::tostr(ret));
}
}
private:
ThreadLocalPointer(const ThreadLocalPointer & lt) = delete;
ThreadLocalPointer & operator=(const ThreadLocalPointer & lt) = delete;
SlotType m_slot;
};
}