nlib
SharedCriticalSection.h
[詳解]
1 
2 /*--------------------------------------------------------------------------------*
3  Project: CrossRoad
4  Copyright (C)Nintendo All rights reserved.
5 
6  These coded instructions, statements, and computer programs contain proprietary
7  information of Nintendo and/or its licensed developers and are protected by
8  national and international copyright laws. They may not be disclosed to third
9  parties or copied or duplicated in any form, in whole or in part, without the
10  prior written consent of Nintendo.
11 
12  The content herein is highly confidential and should be handled accordingly.
13  *--------------------------------------------------------------------------------*/
14 
15 #pragma once
16 #ifndef INCLUDE_NN_NLIB_THREADING_SHAREDCRITICALSECTION_H_
17 #define INCLUDE_NN_NLIB_THREADING_SHAREDCRITICALSECTION_H_
18 
19 #include "nn/nlib/Config.h"
20 #include "nn/nlib/DateTime.h"
21 
22 NLIB_NAMESPACE_BEGIN
23 namespace threading {
24 
25 class NLIB_CAPABILITY("mutex") SharedCriticalSection NLIB_FINAL {
26  public:
27 #if defined(__cpp_constexpr) && defined(NLIB_CXX11_DEFAULTED_AND_DELETED_FUNCTIONS)
28  constexpr SharedCriticalSection() NLIB_NOEXCEPT = default;
29 #else
30  SharedCriticalSection() NLIB_NOEXCEPT {
31  errno_t e = nlib_rwlock_init(&rwock_);
32  NLIB_ASSERT_NOERR(e);
33  NLIB_UNUSED(e);
34  }
35 #endif
36  ~SharedCriticalSection() NLIB_NOEXCEPT {
37  errno_t e = nlib_rwlock_destroy(&rwock_);
38  NLIB_ASSERT_NOERR(e);
39  NLIB_UNUSED(e);
40  }
41 
42  void lock_shared() NLIB_NOEXCEPT NLIB_ACQUIRE_SHARED() {
43  errno_t e = nlib_rwlock_rdlock(&rwock_);
44  NLIB_UNUSED(e);
45  NLIB_ASSERT_NOERR(e);
46  }
47  NLIB_CHECK_RESULT bool try_lock_shared() NLIB_NOEXCEPT NLIB_TRY_ACQUIRE_SHARED(true) {
48  errno_t e = nlib_rwlock_tryrdlock(&rwock_);
49  NLIB_ASSERT(e == 0 || e == EBUSY);
50  return e == 0;
51  }
52  NLIB_CHECK_RESULT bool try_lock_shared_for(const TimeSpan& timeout) NLIB_NOEXCEPT
53  NLIB_TRY_ACQUIRE_SHARED(true) {
54  errno_t e = nlib_rwlock_tryrdlock_for(&rwock_, timeout.ToTimeValue().tick);
55  NLIB_ASSERT(e == 0 || e == ETIMEDOUT);
56  return e == 0;
57  }
58  NLIB_CHECK_RESULT bool try_lock_shared_until(const DateTime& abstime) NLIB_NOEXCEPT
59  NLIB_TRY_ACQUIRE_SHARED(true) {
60  errno_t e = nlib_rwlock_tryrdlock_until(&rwock_, abstime.ToTimeValue().tick);
61  NLIB_ASSERT(e == 0 || e == ETIMEDOUT);
62  return e == 0;
63  }
64  void unlock_shared() NLIB_NOEXCEPT NLIB_RELEASE_SHARED() {
65  errno_t e = nlib_rwlock_rdunlock(&rwock_);
66  NLIB_UNUSED(e);
67  NLIB_ASSERT_NOERR(e);
68  }
69 
70  void lock() NLIB_NOEXCEPT NLIB_ACQUIRE() {
71  errno_t e = nlib_rwlock_wrlock(&rwock_);
72  NLIB_UNUSED(e);
73  NLIB_ASSERT_NOERR(e);
74  }
75  NLIB_CHECK_RESULT bool try_lock() NLIB_NOEXCEPT NLIB_TRY_ACQUIRE(true) {
76  errno_t e = nlib_rwlock_trywrlock(&rwock_);
77  NLIB_ASSERT(e == 0 || e == EBUSY);
78  return e == 0;
79  }
81  NLIB_NOEXCEPT NLIB_TRY_ACQUIRE(true) {
82  errno_t e = nlib_rwlock_trywrlock_for(&rwock_, timeout.ToTimeValue().tick);
83  NLIB_ASSERT(e == 0 || e == ETIMEDOUT);
84  return e == 0;
85  }
87  NLIB_NOEXCEPT NLIB_TRY_ACQUIRE(true) {
88  errno_t e = nlib_rwlock_trywrlock_until(&rwock_, abstime.ToTimeValue().tick);
89  NLIB_ASSERT(e == 0 || e == ETIMEDOUT);
90  return e == 0;
91  }
92  void unlock() NLIB_NOEXCEPT NLIB_RELEASE() {
93  errno_t e = nlib_rwlock_wrunlock(&rwock_);
94  NLIB_UNUSED(e);
95  NLIB_ASSERT_NOERR(e);
96  }
97 
98  private:
99 #if defined(__cpp_constexpr) && defined(NLIB_CXX11_DEFAULTED_AND_DELETED_FUNCTIONS)
101 #else
102  nlib_rwlock rwock_;
103 #endif
104  friend class CondVarForSharedCriticalSection;
106 };
107 
109  public:
110 #if defined(__cpp_constexpr) && defined(NLIB_CXX11_DEFAULTED_AND_DELETED_FUNCTIONS)
111  constexpr CondVarForSharedCriticalSection() NLIB_NOEXCEPT = default;
112 #else
113  CondVarForSharedCriticalSection() NLIB_NOEXCEPT {
114  errno_t e = nlib_condrwlock_init(&condrwlock_);
115  NLIB_ASSERT_NOERR(e);
116  NLIB_UNUSED(e);
117  }
118 #endif
120  errno_t e = nlib_condrwlock_destroy(&condrwlock_);
121  NLIB_ASSERT_NOERR(e);
122  NLIB_UNUSED(e);
123  }
124  void Notify() NLIB_NOEXCEPT {
125  errno_t e = nlib_condrwlock_signal(&condrwlock_);
126  NLIB_UNUSED(e);
127  NLIB_ASSERT_NOERR(e);
128  }
129  void NotifyAll() NLIB_NOEXCEPT {
130  errno_t e = nlib_condrwlock_broadcast(&condrwlock_);
131  NLIB_UNUSED(e);
132  NLIB_ASSERT_NOERR(e);
133  }
134 
135  errno_t WaitReader(SharedCriticalSection& lock) NLIB_NOEXCEPT { // NOLINT
136  return nlib_condrwlock_wait(&condrwlock_, &lock.rwock_, 1);
137  }
138  errno_t WaitReader(nlib_rwlock& lock) NLIB_NOEXCEPT { // NOLINT
139  return nlib_condrwlock_wait(&condrwlock_, &lock, 1);
140  }
141  errno_t Wait(SharedCriticalSection& lock) NLIB_NOEXCEPT { // NOLINT
142  return nlib_condrwlock_wait(&condrwlock_, &lock.rwock_, 0);
143  }
144  errno_t Wait(nlib_rwlock& lock) NLIB_NOEXCEPT { // NOLINT
145  return nlib_condrwlock_wait(&condrwlock_, &lock, 0);
146  }
147 
149  const TimeSpan& timeout) NLIB_NOEXCEPT {
150  return nlib_condrwlock_wait_for(&condrwlock_, &lock.rwock_,
151  timeout.ToTimeValue().tick, 1);
152  }
154  const TimeSpan& timeout) NLIB_NOEXCEPT {
155  return nlib_condrwlock_wait_for(&condrwlock_, &lock,
156  timeout.ToTimeValue().tick, 1);
157  }
159  const TimeSpan& timeout) NLIB_NOEXCEPT {
160  return nlib_condrwlock_wait_for(&condrwlock_, &lock.rwock_,
161  timeout.ToTimeValue().tick, 0);
162  }
164  const TimeSpan& timeout) NLIB_NOEXCEPT {
165  return nlib_condrwlock_wait_for(&condrwlock_, &lock,
166  timeout.ToTimeValue().tick, 0);
167  }
168 
170  const DateTime& datetime) NLIB_NOEXCEPT {
171  return nlib_condrwlock_wait_until(&condrwlock_, &lock.rwock_,
172  datetime.ToTimeValue().tick, 1);
173  }
175  const DateTime& datetime) NLIB_NOEXCEPT {
176  return nlib_condrwlock_wait_until(&condrwlock_, &lock,
177  datetime.ToTimeValue().tick, 1);
178  }
180  const DateTime& datetime) NLIB_NOEXCEPT {
181  return nlib_condrwlock_wait_until(&condrwlock_, &lock.rwock_,
182  datetime.ToTimeValue().tick, 0);
183  }
185  const DateTime& datetime) NLIB_NOEXCEPT {
186  return nlib_condrwlock_wait_until(&condrwlock_, &lock,
187  datetime.ToTimeValue().tick, 0);
188  }
189 
190  private:
191 #if defined(__cpp_constexpr) && defined(NLIB_CXX11_DEFAULTED_AND_DELETED_FUNCTIONS)
193 #else
194  nlib_condrwlock condrwlock_;
195 #endif
197 };
198 
199 
200 } // namespace threading
201 NLIB_NAMESPACE_END
202 
203 #endif // INCLUDE_NN_NLIB_THREADING_SHAREDCRITICALSECTION_H_
SharedCriticalSection, nlib_rwlock用の条件変数です。CondVarと同様に使うことができます。 ...
errno_t nlib_rwlock_rdunlock(nlib_rwlock *rwlock) NLIB_RELEASE_SHARED(*rwlock)
読み込みロックを解放します。
errno_t WaitFor(nlib_rwlock &lock, const TimeSpan &timeout) noexcept
ライトロックをアンロックして、条件変数のシグナルを期間を指定して待ちます。 nlib_condrwlock_wait_for()...
void lock_shared() noexcept NLIB_ACQUIRE_SHARED()
読み込みロックを取得しクリティカルセクションに入ります。取得できるまでブロックします。 ...
errno_t nlib_condrwlock_wait(nlib_condrwlock *cond, nlib_rwlock *rwlock, int rdlock)
rwlockをアンロックし、条件変数を待機します。実行が再開したらrwlockを再ロックします。 ...
bool try_lock_shared() noexcept NLIB_TRY_ACQUIRE_SHARED(true)
読み込みロックを取得しクリティカルセクションに入ることを試みます。
errno_t nlib_rwlock_tryrdlock(nlib_rwlock *rwlock) NLIB_TRY_ACQUIRE_SHARED(0
読み込みロックを取得しクリティカルセクションに入ることを試みます。
errno_t nlib_condrwlock_wait_until(nlib_condrwlock *cond, nlib_rwlock *rwlock, nlib_time abstime, int rdlock)
rwlockをアンロックし、条件変数を待機します。実行が再開したらrwlockを再ロックします。 ...
struct nlib_rwlock_ nlib_rwlock
リードライトロックオブジェクトの型です。
Definition: Platform.h:875
#define NLIB_DISALLOW_COPY_AND_ASSIGN(TypeName)
TypeName で指定されたクラスのコピーコンストラクタと代入演算子を禁止します。
Definition: Config.h:179
bool try_lock_until(const DateTime &abstime) noexcept NLIB_TRY_ACQUIRE(true)
書き込みロックを取得しクリティカルセクションに入ることを試みます。タイムアウトします。 ...
~CondVarForSharedCriticalSection() noexcept
デストラクタです。
void Notify() noexcept
ウェイトしているスレッドの1つ以上にシグナルします。nlib_condrwlock_signal()もご覧ください。 ...
#define NLIB_CHECK_RESULT
関数の呼び出し元が戻り値をチェックする必要があることを示します。
errno_t WaitReader(SharedCriticalSection &lock) noexcept
リードロックをアンロックして条件変数のシグナルを待ちます。 nlib_condrwlock_wait()もご覧ください。 ...
errno_t nlib_rwlock_wrlock(nlib_rwlock *rwlock) NLIB_ACQUIRE(*rwlock)
書き込みロックを取得しクリティカルセクションに入ります。取得できるまでブロックします。 ...
errno_t WaitUntil(SharedCriticalSection &lock, const DateTime &datetime) noexcept
ライトロックをアンロックして、条件変数のシグナルを日時を指定して待ちます。 nlib_condrwlock_wait_until...
errno_t nlib_rwlock_destroy(nlib_rwlock *rwlock) NLIB_EXCLUDES(*rwlock)
リードライトロックオブジェクトを破壊します。
errno_t nlib_condrwlock_wait_for(nlib_condrwlock *cond, nlib_rwlock *rwlock, nlib_duration duration, int rdlock)
rwlockをアンロックし、条件変数を待機します。実行が再開したらrwlockを再ロックします。 ...
errno_t nlib_condrwlock_signal(nlib_condrwlock *cond)
リードライトロック用条件変数cond を待っているスレッドの1つの実行を再開させます。
errno_t WaitReaderFor(nlib_rwlock &lock, const TimeSpan &timeout) noexcept
リードロックをアンロックして、条件変数のシグナルを期間を指定して待ちます。 nlib_condrwlock_wait_for()...
日時を表すクラスです。
Definition: DateTime.h:246
errno_t WaitReaderFor(SharedCriticalSection &lock, const TimeSpan &timeout) noexcept
リードロックをアンロックして、条件変数のシグナルを期間を指定して待ちます。 nlib_condrwlock_wait_for()...
リードライトロックを実装しています。複数のスレッドが同時にデータを読み、単一のスレッドがデータを書き...
errno_t nlib_condrwlock_init(nlib_condrwlock *cond)
リードライトロック用条件変数を初期化します。
bool try_lock() noexcept NLIB_TRY_ACQUIRE(true)
書き込みロックを取得しクリティカルセクションに入ることを試みます。
errno_t WaitReader(nlib_rwlock &lock) noexcept
リードロックをアンロックして条件変数のシグナルを待ちます。 nlib_condrwlock_wait()もご覧ください。 ...
struct nlib_condrwlock_ nlib_condrwlock
リードライトロック用の条件変数の型です。
errno_t Wait(SharedCriticalSection &lock) noexcept
ライトロックをアンロックして条件変数のシグナルを待ちます。 nlib_condrwlock_wait()もご覧ください。 ...
#define NLIB_CONDRWLOCK_INITIALIZER
nlib_condrwlockを静的に初期化するための定数です。
Definition: Platform.h:1045
errno_t nlib_rwlock_rdlock(nlib_rwlock *rwlock) NLIB_ACQUIRE_SHARED(*rwlock)
読み込みロックを取得しクリティカルセクションに入ります。取得できるまでブロックします。 ...
#define NLIB_RWLOCK_INITIALIZER
nlib_rwlockを静的に初期化するための定数です。
Definition: Platform.h:877
errno_t nlib_rwlock_wrunlock(nlib_rwlock *rwlock) NLIB_RELEASE(*rwlock)
書き込みロックを解放します。
errno_t WaitReaderUntil(nlib_rwlock &lock, const DateTime &datetime) noexcept
リードロックをアンロックして、条件変数のシグナルを日時を指定して待ちます。 nlib_condrwlock_wait_until...
時刻や時間を扱うためのクラスが定義されています。
errno_t Wait(nlib_rwlock &lock) noexcept
ライトロックをアンロックして条件変数のシグナルを待ちます。 nlib_condrwlock_wait()もご覧ください。 ...
#define NLIB_NOEXCEPT
環境に合わせてnoexcept 又は同等の定義がされます。
Definition: Config.h:105
errno_t nlib_rwlock_tryrdlock_for(nlib_rwlock *rwlock, nlib_duration duration) NLIB_TRY_ACQUIRE_SHARED(0
読み込みロックを取得しクリティカルセクションに入ることを試みます。タイムアウトします。 ...
開発環境別の設定が書かれるファイルです。
errno_t nlib_condrwlock_destroy(nlib_condrwlock *cond)
リードライトロック用条件変数を破壊します。
void unlock_shared() noexcept NLIB_RELEASE_SHARED()
読み込みロックを解放します。
errno_t nlib_rwlock_trywrlock_for(nlib_rwlock *rwlock, nlib_duration duration) NLIB_TRY_ACQUIRE(0
書き込みロックを取得しクリティカルセクションに入ることを試みます。タイムアウトします。 ...
errno_t WaitUntil(nlib_rwlock &lock, const DateTime &datetime) noexcept
ライトロックをアンロックして、条件変数のシグナルを日時を指定して待ちます。 nlib_condrwlock_wait_until...
void unlock() noexcept NLIB_RELEASE()
書き込みロックを解放します。
errno_t nlib_rwlock_trywrlock(nlib_rwlock *rwlock) NLIB_TRY_ACQUIRE(0
書き込みロックを取得しクリティカルセクションに入ることを試みます。
bool try_lock_shared_for(const TimeSpan &timeout) noexcept NLIB_TRY_ACQUIRE_SHARED(true)
読み込みロックを取得しクリティカルセクションに入ることを試みます。タイムアウトします。 ...
errno_t nlib_rwlock_tryrdlock_until(nlib_rwlock *rwlock, nlib_time abstime) NLIB_TRY_ACQUIRE_SHARED(0
読み込みロックを取得しクリティカルセクションに入ることを試みます。タイムアウトします。 ...
errno_t nlib_condrwlock_broadcast(nlib_condrwlock *cond)
リードライトロック用条件変数cond を待っているスレッド全ての実行を再開させます。
void lock() noexcept NLIB_ACQUIRE()
書き込みロックを取得しクリティカルセクションに入ります。取得できるまでブロックします。 ...
bool try_lock_shared_until(const DateTime &abstime) noexcept NLIB_TRY_ACQUIRE_SHARED(true)
読み込みロックを取得しクリティカルセクションに入ることを試みます。タイムアウトします。 ...
errno_t nlib_rwlock_init(nlib_rwlock *rwlock) NLIB_EXCLUDES(*rwlock)
リードライトロックを初期化します。
#define NLIB_FINAL
利用可能であればfinalが定義されます。そうでない場合は空文字列です。
Definition: Config.h:245
時間を表すクラスです。
Definition: DateTime.h:97
errno_t WaitFor(SharedCriticalSection &lock, const TimeSpan &timeout) noexcept
ライトロックをアンロックして、条件変数のシグナルを期間を指定して待ちます。 nlib_condrwlock_wait_for()...
errno_t WaitReaderUntil(SharedCriticalSection &lock, const DateTime &datetime) noexcept
リードロックをアンロックして、条件変数のシグナルを日時を指定して待ちます。 nlib_condrwlock_wait_until...
bool try_lock_for(const TimeSpan &timeout) noexcept NLIB_TRY_ACQUIRE(true)
書き込みロックを取得しクリティカルセクションに入ることを試みます。タイムアウトします。 ...
void NotifyAll() noexcept
ウェイトしているスレッド全てにシグナルします。nlib_condrwlock_broadcast()もご覧ください。 ...
errno_t nlib_rwlock_trywrlock_until(nlib_rwlock *rwlock, nlib_time abstime) NLIB_TRY_ACQUIRE(0
書き込みロックを取得しクリティカルセクションに入ることを試みます。タイムアウトします。 ...
int errno_t
intのtypedefで、戻り値としてPOSIXのエラー値を返すことを示します。
Definition: NMalloc.h:37