RAIIをやりやすく。
気が付けば解放保証人みたいな扱い。
そしてそれすらにもなっていないことに気付く。
リソース管理とデストラクタとGCのメモリ回収がごっちゃになってるんだなぁ。
- BUGS:
- 最早module名が内容とあっていない
typedef RaiiException;
abstract class Raii;
RAII基盤
Killメソッドを実装すれば後は自殺するだけさ。
あくまでデストラクタ時にKill()しようとするだけであってGCに一任するものじゃないよ。
protected bool Suicide;
protected abstract void Kill();
final bool kill();
手軽に自殺。
呼び出した後にRaii.Suicideはfalseに設定される。
Suicideの内容は判定されない。
- Returns:
- 自殺と判定された場合はtrue、自殺に見せかけた他殺とか自殺未遂ならfalseを返す。
const final bool suicide();
身辺整理フラグ。
- Returns:
- 準備できているならtrue、まだならfalseを返す。
abstract interface IRaii;
Raiiを強制。
protected abstract void Kill();
template MixInKillResource(alias ResourceName,alias ResourceHandle,alias KillFunc,alias KillFuncFailValue)
リソースハンドル削除用テンプレート。
限られた用途に限り有効。
- Params:
- ResourceName
- リソース名@直接は関係なし。
- ResourceHandle
- 解放すべきリソースハンドル。
- KillFunc
- ResourceHandleを引数として受け取る処理。
成功すると(未実装のKillFuncFailで判定)ResourceHandleはResourceHandle.initが代入される。
- KillFuncFail
- KillFuncの失敗値。
abstract interface IWait;
enum WAIT;
FAILED
OBJECT_0
指定したオブジェクトがシグナル状態になったことを意味します。
ABANDONED
指定されたオブジェクトは、放棄されたミューテックスオブジェクトでした(あるスレッドが所有権を持っていましたが、そのスレッドは所有権を解放しないで終了しました)。この関数を呼び出した結果、そのミューテックスオブジェクトの所有権は呼び出し側スレッドに移り、そのミューテックスは非シグナル状態に設定されました。
IO_COMPLETION
1 つまたは複数の I/O 完了ルーチンが、実行の目的でキューに置かれています。
TIMEOUT
タイムアウト時間が経過し、指定されたオブジェクトが非シグナル状態であったことを意味します。
abstract const WAIT wait(size_t TimeOutMs
);
- Params:
- size_t TimeOutMs
- タイムアウト時間を、ミリ秒(ms)単位で指定します。
タイムアウト時間が経過すると、オブジェクトが非シグナル状態であっても、制御を返します。
0 を指定すると、この関数は指定されたオブジェクトの状態を調べ、即座に制御を返します。
INFINITE を指定すると、オブジェクトがシグナル状態になるまで待機し続けます。
class HandleRaiiException: etc.negui.system.exception.NeGuiException;
class HandleRaii: etc.negui.system.raii.Raii, etc.negui.system.raii.IHandle;
ハンドルオブジェクト専用RAII。
Windowsで大活躍のHANDLEをサポートするけど作ったのがnemuxi.drawを作った後だったので足枷。
protected HANDLE Handle;
this(HANDLE Handle
, bool Suicide
);
コンストラクタ。
- Params:
- HANDLE Handle
- 設定するハンドル。
- bool Suicide
- 死亡フラグ。
template MixInHandleRaiiClass()
HandleRaiiのコンストラクタ統一。
class SuperHandle: HandleRaii, IRaii {
mixin HandleRaiiClass;
override void Kill() {
del(Handle);
}
}
class ExHandle: SuperHandle {
mixin HandleRaiiClass;
}
auto ex = ExHandle(handle, true);
abstract interface IInitialize;
初期化が必要。
abstract void initialize();