68 lines
1.5 KiB
C
68 lines
1.5 KiB
C
|
#ifndef HV_THREAD_LOCAL_STORAGE_H_
|
||
|
#define HV_THREAD_LOCAL_STORAGE_H_
|
||
|
|
||
|
#include "hexport.h"
|
||
|
#include "hplatform.h"
|
||
|
|
||
|
#ifdef OS_WIN
|
||
|
|
||
|
#define hthread_key_t DWORD
|
||
|
#define INVALID_HTHREAD_KEY 0xFFFFFFFF
|
||
|
#define hthread_key_create(pkey) *pkey = TlsAlloc()
|
||
|
#define hthread_key_delete TlsFree
|
||
|
#define hthread_get_value TlsGetValue
|
||
|
#define hthread_set_value TlsSetValue
|
||
|
|
||
|
#else
|
||
|
|
||
|
#define hthread_key_t pthread_key_t
|
||
|
#define INVALID_HTHREAD_KEY 0xFFFFFFFF
|
||
|
#define hthread_key_create(pkey) pthread_key_create(pkey, NULL)
|
||
|
#define hthread_key_delete pthread_key_delete
|
||
|
#define hthread_get_value pthread_getspecific
|
||
|
#define hthread_set_value pthread_setspecific
|
||
|
|
||
|
#endif
|
||
|
|
||
|
#ifdef __cplusplus
|
||
|
namespace hv {
|
||
|
|
||
|
class HV_EXPORT ThreadLocalStorage {
|
||
|
public:
|
||
|
enum {
|
||
|
THREAD_NAME = 0,
|
||
|
EVENT_LOOP = 1,
|
||
|
MAX_NUM = 16,
|
||
|
};
|
||
|
ThreadLocalStorage() {
|
||
|
hthread_key_create(&key);
|
||
|
}
|
||
|
|
||
|
~ThreadLocalStorage() {
|
||
|
hthread_key_delete(key);
|
||
|
}
|
||
|
|
||
|
void set(void* val) {
|
||
|
hthread_set_value(key, val);
|
||
|
}
|
||
|
|
||
|
void* get() {
|
||
|
return hthread_get_value(key);
|
||
|
}
|
||
|
|
||
|
static void set(int idx, void* val);
|
||
|
static void* get(int idx);
|
||
|
|
||
|
static void setThreadName(const char* name);
|
||
|
static const char* threadName();
|
||
|
|
||
|
private:
|
||
|
hthread_key_t key;
|
||
|
static ThreadLocalStorage tls[MAX_NUM];
|
||
|
};
|
||
|
|
||
|
}
|
||
|
#endif
|
||
|
|
||
|
#endif // HV_THREAD_LOCAL_STORAGE_H_
|