1// ThreadLocal.cpp
2
3#include <new>
4
5#include <OS.h>
6
7#include "HashMap.h"
8#include "ThreadLocal.h"
9
10// ThreadLocalFreeHandler
11
12// constructor
13ThreadLocalFreeHandler::ThreadLocalFreeHandler()
14{
15}
16
17// destructor
18ThreadLocalFreeHandler::~ThreadLocalFreeHandler()
19{
20}
21
22
23// ThreadLocal
24
25// ThreadLocalMap
26struct ThreadLocal::ThreadLocalMap
27	: public SynchronizedHashMap<HashKey32<thread_id>, void*> {
28};
29
30// constructor
31ThreadLocal::ThreadLocal(ThreadLocalFreeHandler* freeHandler)
32	: fMap(NULL),
33	  fFreeHandler(freeHandler)
34{
35	fMap = new(std::nothrow) ThreadLocalMap;
36}
37
38// destructor
39ThreadLocal::~ThreadLocal()
40{
41	delete fMap;
42}
43
44// Set
45status_t
46ThreadLocal::Set(void* data)
47{
48	if (!fMap)
49		return B_NO_MEMORY;
50	thread_id thread = find_thread(NULL);
51	fMap->Lock();
52	// free old data, if any
53	if (fFreeHandler &&fMap->ContainsKey(thread))
54		fFreeHandler->Free(fMap->Get(thread));
55	// put the new data
56	status_t error = fMap->Put(thread, data);
57	fMap->Unlock();
58	return error;
59}
60
61// Unset
62void
63ThreadLocal::Unset()
64{
65	if (!fMap)
66		return;
67	thread_id thread = find_thread(NULL);
68	fMap->Lock();
69	if (fFreeHandler) {
70		if (fMap->ContainsKey(thread))
71			fFreeHandler->Free(fMap->Remove(thread));
72	} else
73		fMap->Remove(thread);
74	fMap->Unlock();
75}
76
77// Get
78void*
79ThreadLocal::Get() const
80{
81	if (!fMap)
82		return NULL;
83	return fMap->Get(find_thread(NULL));
84}
85
86