1// ThreadLocal.h
2
3#ifndef THREAD_LOCAL_H
4#define THREAD_LOCAL_H
5
6#include <SupportDefs.h>
7
8// ThreadLocalFreeHandler
9class ThreadLocalFreeHandler {
10public:
11								ThreadLocalFreeHandler();
12	virtual						~ThreadLocalFreeHandler();
13
14	virtual	void				Free(void* data) = 0;
15};
16
17// ThreadLocal
18class ThreadLocal {
19public:
20								ThreadLocal(
21									ThreadLocalFreeHandler* freeHandler = NULL);
22								~ThreadLocal();
23
24			status_t			Set(void* data);
25			void				Unset();
26			void*				Get() const;
27
28private:
29			struct ThreadLocalMap;
30
31			ThreadLocalMap*		fMap;
32			ThreadLocalFreeHandler* fFreeHandler;
33};
34
35// ThreadLocalUnsetter
36class ThreadLocalUnsetter {
37public:
38	ThreadLocalUnsetter(ThreadLocal* threadLocal)
39		: fThreadLocal(threadLocal)
40	{
41	}
42
43	ThreadLocalUnsetter(ThreadLocal& threadLocal)
44		: fThreadLocal(&threadLocal)
45	{
46	}
47
48	~ThreadLocalUnsetter()
49	{
50		if (fThreadLocal)
51			fThreadLocal->Unset();
52	}
53
54private:
55	ThreadLocal*	fThreadLocal;
56};
57
58#endif	// THREAD_LOCAL_H
59