Solution46
CMutex.cpp
[詳解]
1 //=============================================================================
2 /// @file
3 /// ミューテックスクラス実装ファイル
4 ///
5 /// ミューテックスクラス実装ファイルです。
6 ///
7 /// $Id: CMutex.cpp 245 2019-03-20 15:03:41Z admin $
8 /// $Date: 2019-03-21 00:03:41 +0900 (2019/03/21 (木)) $
9 /// $Author: admin $
10 ///
11 /// @attention なし
12 
13 #pragma managed( push, off )
14 
15 //=============================================================================
16 // インクルードファイル
17 #include <CMutex.h>
18 #include <LibUtility.h>
19 
20 //=============================================================================
21 // 共通ライブラリ名前空間
22 namespace LibCommon {
23  //=========================================================================
24  // ミューテックスクラス
25  //=========================================================================
26  // 構築子と解体子
27  //-------------------------------------------------------------------------
28  // コンストラクタ
29  CMutex::CMutex() noexcept
30  // 基底クラスコンストラクタ
31  : CSync()
32  // メンバ変数初期化
33  , m_dwLockCount( 0 )
34  {}
35 
36  //-------------------------------------------------------------------------
37  // デストラクタ
38  CMutex::~CMutex() noexcept {
39  // クローズする
40  Close();
41  }
42 
43  //=========================================================================
44  // 公開関数
45  //-------------------------------------------------------------------------
46  // クローズ関数
47  void CMutex::Close() noexcept {
48  // 基底クラスの関数を実行する
49  CSync::Close();
50 
51  // メンバ変数をクリアする
52  m_dwLockCount = 0;
53  }
54 
55  //-------------------------------------------------------------------------
56  // リリース関数
57  bool CMutex::Release() noexcept {
58  // 処理ブロック
59  bool result = false;
60  do {
61  // ミューテックス所有権を解放する
62  if ( 0 == ::ReleaseMutex( m_hObject ) ) {
63  // 致命的エラー!
65  break;
66  }
67 
68  // 成功!
69  result = true;
70  } while ( false );
71 
72  // 実行結果を返す
73  return result;
74  }
75 
76  //-------------------------------------------------------------------------
77  // ロック関数
78  bool CMutex::Lock( DWORD dwTime ) noexcept {
79  // 処理ブロック
80  bool result = false;
81  do {
82  // ロックカウントを調べる
83  if ( UINT_MAX == m_dwLockCount ) {
84  // 致命的エラー!
86  break;
87  }
88  // ウェイトする
89  else if ( !Wait( dwTime ) ) {
90  // 待機時間を調べる
91  if ( INFINITE == dwTime ) {
92  // 致命的エラー!
94  }
95 
96  // 失敗!
97  break;
98  }
99 
100  // ロックカウントをインクリメントする
101  ++m_dwLockCount;
102 
103  // 成功!
104  result = true;
105  } while ( false );
106 
107  // 実行結果を返す
108  return result;
109  }
110 
111  //-------------------------------------------------------------------------
112  // ロック解除関数
113  bool CMutex::Unlock() noexcept {
114  // 処理ブロック
115  bool result = false;
116  do {
117  // ロックカウントを調べる
118  if ( 0 == m_dwLockCount ) {
119  // 致命的エラー!
121  break;
122  }
123  // リリースする
124  else if ( 0 == ::ReleaseMutex( m_hObject ) ) {
125  // 致命的エラー!
127  break;
128  }
129 
130  // ロックカウントをデクリメントする
131  --m_dwLockCount;
132 
133  // 成功!
134  result = true;
135  } while ( false );
136 
137  // 実行結果を返す
138  return result;
139  }
140 
141  //-------------------------------------------------------------------------
142  // 作成関数
143  bool CMutex::Create( wchar_t const* pszObjectName ) noexcept {
144  // 処理ブロック
145  bool result = false;
146  do {
147  // オブジェクトハンドルを調べる
148  if ( nullptr != m_hObject ) {
149  // クローズする
150  Close();
151  }
152 
153  // オブジェクト名を調べる
154  wchar_t szBuffer[ MAX_PATH ];
155  if ( nullptr != pszObjectName ) {
156  // オブジェクト名に拡張子を追加する
157  ::wcscpy_s( szBuffer, pszObjectName );
158  ::wcscat_s( szBuffer, OBJECT_NAME_EXT );
159  pszObjectName = szBuffer;
160  }
161 
162  // ミューテックスを作成する
163  m_hObject = ::CreateMutexW( nullptr, false, pszObjectName );
164  if ( nullptr == m_hObject ) {
165  // 失敗!
166  break;
167  }
168  // エラーコードを調べる
169  else if ( ERROR_ALREADY_EXISTS != ::GetLastError() ) {
170  // 新規作成フラグをセットする
171  m_bIsCreate = true;
172  }
173 
174  // 成功!
175  result = true;
176  } while ( false );
177 
178  // 実行結果を返す
179  return result;
180  }
181 
182  //-------------------------------------------------------------------------
183  // オープン関数
184  bool CMutex::Open( wchar_t const* pszObjectName ) noexcept {
185  // 処理ブロック
186  bool result = false;
187  do {
188  // オブジェクト名を調べる
189  if ( nullptr == pszObjectName ) {
190  // 失敗!
191  break;
192  }
193  // オブジェクトハンドルを調べる
194  else if ( nullptr != m_hObject ) {
195  // クローズする
196  Close();
197  }
198 
199  // オブジェクト名に拡張子を追加する
200  wchar_t szBuffer[ MAX_PATH ];
201  ::wcscpy_s( szBuffer, pszObjectName );
202  ::wcscat_s( szBuffer, OBJECT_NAME_EXT );
203  pszObjectName = szBuffer;
204 
205  // ミューテックスをオープンする
206  m_hObject = ::OpenMutexW( MUTEX_ALL_ACCESS, false, pszObjectName );
207  if ( nullptr == m_hObject ) {
208  // 失敗!
209  break;
210  }
211 
212  // 成功!
213  result = true;
214  } while ( false );
215 
216  // 実行結果を返す
217  return result;
218  }
219 
220  //=====================================================================
221  // 静的限定公開文字列定数
222  wchar_t const* const CMutex::OBJECT_NAME_EXT = L".CMutex";
223 }
224 
225 #pragma managed( pop )
virtual void Close() noexcept
クローズ関数
Definition: CSync.cpp:45
#define NotifyFatalError()
致命的エラー発生通知マクロ
Definition: LibUtility.h:22
DWORD m_dwLockCount
ロックカウント
Definition: CMutex.h:143
virtual bool Unlock() noexcept override
ロック解除関数
Definition: CMutex.cpp:113
同期クラス
Definition: CSync.h:30
bool m_bIsCreate
新規作成フラグ
Definition: CSync.h:153
virtual bool Wait(DWORD dwTime=INFINITE) noexcept
ウェイト関数
Definition: CSync.cpp:59
共通ライブラリ名前空間
Definition: CArray.h:23
virtual bool Create(wchar_t const *pszObjectName=nullptr) noexcept
作成関数
Definition: CMutex.cpp:143
virtual bool Lock(DWORD dwTime=INFINITE) noexcept override
ロック関数
Definition: CMutex.cpp:78
HANDLE m_hObject
オブジェクトハンドル
Definition: CSync.h:152
CMutex() noexcept
コンストラクタ
Definition: CMutex.cpp:29
ミューテックスクラスヘッダファイル
virtual bool Release() noexcept override
リリース関数
Definition: CMutex.cpp:57
virtual ~CMutex() noexcept
デストラクタ
Definition: CMutex.cpp:38
virtual void Close() noexcept override
クローズ関数
Definition: CMutex.cpp:47
virtual bool Open(wchar_t const *pszObjectName) noexcept
オープン関数
Definition: CMutex.cpp:184
ユーティリティライブラリヘッダファイル
static wchar_t const *const OBJECT_NAME_EXT
オブジェクト名拡張子
Definition: CMutex.h:138