32bit整数値を持つハンドルの実装を支援するクラスです。
[詳解]
#include "nn/nlib/HandleMaker.h"
template<class HBODY>
class nn::nlib::HandleMaker< HBODY >
32bit整数値を持つハンドルの実装を支援するクラスです。
- テンプレート引数
-
- 説明
- 32bit整数値(以降ハンドル)とオブジェクト(以降ハンドルの実体)との関連付けを行う仕組みを提供するクラスです。
HandleMaker
を利用すると以下のような特徴を持つハンドルを簡単に提供することが可能になります。
- ハンドルを通したハンドルの実体へのアクセスはスレッドセーフになります。
- ハンドルをクローズした後にそのハンドル(つまり無効なハンドル)を利用した場合でも、クラッシュせずにエラー(一般には
EBADF
)を返すことができます。
- 上記は異なるスレッドからクローズされた場合も同様です。
- ハンドルとなる整数値はすぐには再利用されないので、意図しないハンドルの実体へのアクセスを避けることができます。
- -1, 0, 1, 2, 3はハンドルの値として割り当てられることはありません。
- 以下が簡単なハンドルを定義するコード例になります。
class MyHandleBody {
public:
static const size_t N = 128;
public:
MyHandleBody() {
valid_ = false;
}
~MyHandleBody() noexcept {
assert(!valid_);
}
assert(!valid_);
{
}
valid_ = true;
return 0;
}
if (!valid_) {
return EBADF;
}
{
}
valid_ = false;
return 0;
}
if (!valid_) {
return EBADF;
}
{
}
return 0;
}
private:
bool valid_;
};
errno_t myhandle_open(
int* handle) {
MyHandleBody* p = new(std::nothrow) MyHandleBody();
if (!p) return ENOMEM;
e = p->Initialize()
delete p;
return e;
}
e = maker.AttachHandleBody(handle, p);
(void)p->Finalize();
delete p;
return e;
}
return 0;
}
errno_t myhandle_access(
int handle, ......) {
e = maker.GetHandleAccess(handle, &access);
e = access->access_method(......);
return e;
}
errno_t myhandle_close(
int handle) {
e = maker.GetHandleAccess(handle, &access);
e = access->Finalize();
return e;
}
HandleMaker.h の 87 行目に定義があります。
◆ AttachHandleBody()
ハンドルの実体に関連付けられるハンドルを取得します。
- 引数
-
[out] | handle | body に関連付けられるハンドルへのポインタ |
[in] | body | ハンドルに関連付けるハンドルの実体 |
- 戻り値
-
0 | 成功しました。 |
ENFILE | 割り当てることのできるハンドルがありません。 |
HandleMaker.h の 191 行目に定義があります。
◆ GetHandleAccess()
ハンドルからハンドルの実体へのアクセスを得ます。
- 引数
-
- 戻り値
-
0 | 成功しました。 |
EBADF | ハンドルが有効ではありません。 |
HandleMaker.h の 258 行目に定義があります。
このクラス詳解は次のファイルから抽出されました: