#include <new>
#include <OS.h>
#include "HashMap.h"
#include "ThreadLocal.h"
ThreadLocalFreeHandler::ThreadLocalFreeHandler()
{
}
ThreadLocalFreeHandler::~ThreadLocalFreeHandler()
{
}
struct ThreadLocal::ThreadLocalMap
: public SynchronizedHashMap<HashKey32<thread_id>, void*> {
};
ThreadLocal::ThreadLocal(ThreadLocalFreeHandler* freeHandler)
: fMap(NULL),
fFreeHandler(freeHandler)
{
fMap = new(std::nothrow) ThreadLocalMap;
}
ThreadLocal::~ThreadLocal()
{
delete fMap;
}
status_t
ThreadLocal::Set(void* data)
{
if (!fMap)
return B_NO_MEMORY;
thread_id thread = find_thread(NULL);
fMap->Lock();
if (fFreeHandler &&fMap->ContainsKey(thread))
fFreeHandler->Free(fMap->Get(thread));
status_t error = fMap->Put(thread, data);
fMap->Unlock();
return error;
}
void
ThreadLocal::Unset()
{
if (!fMap)
return;
thread_id thread = find_thread(NULL);
fMap->Lock();
if (fFreeHandler) {
if (fMap->ContainsKey(thread))
fFreeHandler->Free(fMap->Remove(thread));
} else
fMap->Remove(thread);
fMap->Unlock();
}
void*
ThreadLocal::Get() const
{
if (!fMap)
return NULL;
return fMap->Get(find_thread(NULL));
}