nlib
Tls.h
[詳解]
1 
2 #pragma once
3 #ifndef INCLUDE_NN_NLIB_THREADING_TLS_H_
4 #define INCLUDE_NN_NLIB_THREADING_TLS_H_
5 
6 #include "nn/nlib/Config.h"
7 
8 NLIB_NAMESPACE_BEGIN
9 namespace threading {
10 
11 template <class T>
12 class Tls NLIB_FINAL {
13  public:
14  NLIB_CEXPR Tls() NLIB_NOEXCEPT : m_IdxValid(false) {}
16  if (m_IdxValid) return EALREADY;
17  errno_t e = nlib_tls_alloc(&m_Idx, destr_func);
18  if (e == 0) m_IdxValid = true;
19  return e;
20  }
22  if (m_IdxValid) {
23  nlib_tls_free(m_Idx);
24  m_IdxValid = false;
25  }
26  }
27  T* Get() const NLIB_NOEXCEPT {
28  void* p;
29  errno_t e = nlib_tls_getvalue(m_Idx, &p);
30  if (e != 0) return NULL;
31  return reinterpret_cast<T*>(p);
32  }
33  T* operator->() const NLIB_NOEXCEPT { return this->Get(); }
34  T& operator*() const NLIB_NOEXCEPT { return *this->Get(); }
36  T* obj = this->Get();
37  nlib_tls_setvalue(m_Idx, NULL);
38  return obj;
39  }
41  T* obj = this->Get();
42  if (obj) {
43  delete obj;
44  }
45  return nlib_tls_setvalue(m_Idx, p);
46  }
47 
48  private:
49  static void destr_func(void* p) NLIB_NOEXCEPT {
50  delete reinterpret_cast<T*>(p);
51  }
52  nlib_tls m_Idx;
53  bool m_IdxValid;
54 };
55 
56 } // namespace threading
57 NLIB_NAMESPACE_END
58 
59 #endif // INCLUDE_NN_NLIB_THREADING_TLS_H_
#define NLIB_NOEXCEPT
環境に合わせてnoexcept 又は同等の定義がされます。
Definition: Platform.h:2151
#define NLIB_FINAL
利用可能であればfinalが定義されます。そうでない場合は空文字列です。
errno_t Reset(T *p=0) noexcept
設定したスレッド固有のポインタを置き換えます。
Definition: Tls.h:40
T * Release() noexcept
設定したスレッド固有のポインタを解放します。
Definition: Tls.h:35
T * Get() const noexcept
設定したスレッド固有のポインタを取得します。
Definition: Tls.h:27
errno_t nlib_tls_setvalue(nlib_tls tls, const void *value)
TLSスロットに値を格納します。
errno_t Init() noexcept
スレッドローカルストレージを初期化します。
Definition: Tls.h:15
pthread_key_t nlib_tls
TLSスロットのIDを示す型です。
Definition: Platform.h:571
NLIB_CHECK_RESULT errno_t nlib_tls_alloc(nlib_tls *tls, nlib_tls_destructor destr)
TLSスロットに対する新しいIDを確保します。
#define NLIB_CEXPR
利用可能であればconstexprが定義されます。そうでない場合は空文字列です。
スレッドローカルストレージを扱うためのクラスです。
Definition: Tls.h:12
constexpr Tls() noexcept
デフォルトコンストラクタです。
Definition: Tls.h:14
~Tls() noexcept
デストラクタです。ポインタはdeleteされます。
Definition: Tls.h:21
開発環境別の設定が書かれるファイルです。
T & operator*() const noexcept
ポインタの参照外しを行います。
Definition: Tls.h:34
T * operator->() const noexcept
ポインタを返します。
Definition: Tls.h:33
errno_t nlib_tls_getvalue(nlib_tls tls, void **value)
TLSスロットから値を取り出します。
errno_t nlib_tls_free(nlib_tls tls)
TLSスロットに対応するIDを解放します。
int errno_t
intのtypedefで、戻り値としてPOSIXのエラー値を返すことを示します。
Definition: NMalloc.h:24