ThreadLocalStorage.h 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. #ifndef HV_THREAD_LOCAL_STORAGE_H_
  2. #define HV_THREAD_LOCAL_STORAGE_H_
  3. #include "hexport.h"
  4. #include "hplatform.h"
  5. #ifdef OS_WIN
  6. #define hthread_key_t DWORD
  7. #define INVALID_HTHREAD_KEY 0xFFFFFFFF
  8. #define hthread_key_create(pkey) *pkey = TlsAlloc()
  9. #define hthread_key_delete TlsFree
  10. #define hthread_get_value TlsGetValue
  11. #define hthread_set_value TlsSetValue
  12. #else
  13. #define hthread_key_t pthread_key_t
  14. #define INVALID_HTHREAD_KEY 0xFFFFFFFF
  15. #define hthread_key_create(pkey) pthread_key_create(pkey, NULL)
  16. #define hthread_key_delete pthread_key_delete
  17. #define hthread_get_value pthread_getspecific
  18. #define hthread_set_value pthread_setspecific
  19. #endif
  20. #ifdef __cplusplus
  21. class HV_EXPORT ThreadLocalStorage {
  22. public:
  23. enum {
  24. THREAD_NAME = 0,
  25. EVENT_LOOP = 1,
  26. MAX_NUM = 16,
  27. };
  28. ThreadLocalStorage() {
  29. hthread_key_create(&key);
  30. }
  31. ~ThreadLocalStorage() {
  32. hthread_key_delete(key);
  33. }
  34. void set(void* val) {
  35. hthread_set_value(key, val);
  36. }
  37. void* get() {
  38. return hthread_get_value(key);
  39. }
  40. static void set(int idx, void* val) {
  41. return tls[idx].set(val);
  42. }
  43. static void* get(int idx) {
  44. return tls[idx].get();
  45. }
  46. static void setThreadName(const char* name) {
  47. set(THREAD_NAME, (void*)name);
  48. }
  49. static const char* threadName();
  50. private:
  51. hthread_key_t key;
  52. static ThreadLocalStorage tls[MAX_NUM];
  53. };
  54. #endif
  55. #endif // HV_THREAD_LOCAL_STORAGE_H_