TLSHolder.tlh 1.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. #pragma once
  2. template <class C, typename T> class TLSHolder
  3. {
  4. public:
  5. TLSHolder ()
  6. {
  7. Create ();
  8. }
  9. TLSHolder (T * from)
  10. {
  11. Create (from);
  12. }
  13. ~TLSHolder ()
  14. {
  15. Close ();
  16. }
  17. public:
  18. static DWORD TLSIndex;
  19. protected:
  20. static T * Create ()
  21. {
  22. void * p = TlsGetValue (TLSIndex);
  23. if (! p)
  24. {
  25. p = new T;
  26. C::Init ((T *) p);
  27. BOOL rc = TlsSetValue (TLSIndex, p);
  28. if (! rc)
  29. {
  30. #ifdef _DEBUG
  31. DWORD code = GetLastError ();
  32. #endif
  33. delete p;
  34. }
  35. }
  36. return Get ();
  37. }
  38. static T * Create (T * from)
  39. {
  40. void * p = TlsGetValue (TLSIndex);
  41. if (! p)
  42. {
  43. p = from->Clone ();
  44. // C::Init ((T *) p);
  45. BOOL rc = TlsSetValue (TLSIndex, p);
  46. if (! rc)
  47. {
  48. #ifdef _DEBUG
  49. DWORD code = GetLastError ();
  50. #endif
  51. delete p;
  52. }
  53. }
  54. return Get ();
  55. }
  56. static void Close ()
  57. {
  58. T * p = Get ();
  59. delete p;
  60. BOOL rc = TlsSetValue (TLSIndex, 0);
  61. if (! rc)
  62. {
  63. #ifdef _DEBUG
  64. DWORD code = GetLastError ();
  65. putchar (' ');
  66. #endif
  67. }
  68. }
  69. public:
  70. static T * Get ()
  71. {
  72. void * p = TlsGetValue (TLSIndex);
  73. return (T *) p;
  74. }
  75. };