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 : idx_(), is_idx_valid_(false) {}
16  if (is_idx_valid_) return EALREADY;
17  errno_t e = nlib_tls_alloc(&idx_, destr_func);
18  if (e == 0) is_idx_valid_ = true;
19  return e;
20  }
22  if (is_idx_valid_) {
23  nlib_tls_free(idx_);
24  is_idx_valid_ = false;
25  }
26  }
27  T* Get() const NLIB_NOEXCEPT {
28  void* p;
29  errno_t e = nlib_tls_getvalue(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(idx_, NULL);
38  return obj;
39  }
41  T* obj = this->Get();
42  if (obj) {
43  delete obj;
44  }
45  return nlib_tls_setvalue(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 idx_;
53  bool is_idx_valid_;
54 };
55 
56 } // namespace threading
57 NLIB_NAMESPACE_END
58 
59 #endif // INCLUDE_NN_NLIB_THREADING_TLS_H_
errno_t Reset(T *p=0) noexcept
設定したスレッド固有のポインタを置き換えます。
Definition: Tls.h:40
T & operator*() const noexcept
ポインタの参照外しを行います。
Definition: Tls.h:34
T * Release() noexcept
設定したスレッド固有のポインタを解放します。
Definition: Tls.h:35
T * operator->() const noexcept
ポインタを返します。
Definition: Tls.h:33
errno_t nlib_tls_setvalue(nlib_tls tls, const void *value)
TLSスロットに値を格納します。
T * Get() const noexcept
設定したスレッド固有のポインタを取得します。
Definition: Tls.h:27
errno_t Init() noexcept
スレッドローカルストレージを初期化します。
Definition: Tls.h:15
pthread_key_t nlib_tls
TLSスロットのIDを示す型です。
NLIB_CHECK_RESULT errno_t nlib_tls_alloc(nlib_tls *tls, nlib_tls_destructor destr)
TLSスロットに対する新しいIDを確保します。
スレッドローカルストレージを扱うためのクラスです。
Definition: Tls.h:12
constexpr Tls() noexcept
デフォルトコンストラクタです。
Definition: Tls.h:14
#define NLIB_NOEXCEPT
環境に合わせてnoexcept 又は同等の定義がされます。
Definition: Config.h:86
#define NLIB_CEXPR
利用可能であればconstexprが定義されます。そうでない場合は空文字列です。
Definition: Config.h:80
~Tls() noexcept
デストラクタです。ポインタはdeleteされます。
Definition: Tls.h:21
開発環境別の設定が書かれるファイルです。
#define NLIB_FINAL
利用可能であればfinalが定義されます。そうでない場合は空文字列です。
Definition: Config.h:211
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