thread.h 1.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. /*
  2. * Copyright 2010-2018 Branimir Karadzic. All rights reserved.
  3. * License: https://github.com/bkaradzic/bx#license-bsd-2-clause
  4. */
  5. #ifndef BX_THREAD_H_HEADER_GUARD
  6. #define BX_THREAD_H_HEADER_GUARD
  7. #include "allocator.h"
  8. #include "mpscqueue.h"
  9. namespace bx
  10. {
  11. ///
  12. typedef int32_t (*ThreadFn)(class Thread* _self, void* _userData);
  13. ///
  14. class Thread
  15. {
  16. BX_CLASS(Thread
  17. , NO_COPY
  18. , NO_ASSIGNMENT
  19. );
  20. public:
  21. ///
  22. Thread();
  23. ///
  24. virtual ~Thread();
  25. ///
  26. void init(ThreadFn _fn, void* _userData = NULL, uint32_t _stackSize = 0, const char* _name = NULL);
  27. ///
  28. void shutdown();
  29. ///
  30. bool isRunning() const;
  31. ///
  32. int32_t getExitCode() const;
  33. ///
  34. void setThreadName(const char* _name);
  35. ///
  36. void push(void* _ptr);
  37. ///
  38. void* pop();
  39. private:
  40. friend struct ThreadInternal;
  41. int32_t entry();
  42. BX_ALIGN_DECL(16, uint8_t) m_internal[64];
  43. ThreadFn m_fn;
  44. void* m_userData;
  45. MpScUnboundedBlockingQueue<void> m_queue;
  46. Semaphore m_sem;
  47. uint32_t m_stackSize;
  48. int32_t m_exitCode;
  49. bool m_running;
  50. };
  51. ///
  52. class TlsData
  53. {
  54. public:
  55. ///
  56. TlsData();
  57. ///
  58. ~TlsData();
  59. ///
  60. void* get() const;
  61. ///
  62. void set(void* _ptr);
  63. private:
  64. BX_ALIGN_DECL(16, uint8_t) m_internal[64];
  65. };
  66. } // namespace bx
  67. #endif // BX_THREAD_H_HEADER_GUARD