Runtime::Win32
Class methods
close_event(handle : LibWin32::Handle) : Nil
Source固定長の UTF-16 配列へ、終端を残して詰める。
置き換えた側が常駐へ入ったことを伝える名前付きイベントを用意する(issue #29)。
起動より前に作る。子が知らせた後に作ると、その SetEvent を取り落とし、 常駐へ入っているのに期限まで待つことになる。
手動リセットにする。自動リセットだと、待ち始める前に来た知らせを 最初に見に行った 1 回で消費してしまい、以降は非シグナルに戻る。
同じ名前のイベントが前の置き換えから残っている場合に備えて、作った後に落としておく。 シグナルのまま渡されると、子を起動する前から「常駐へ入った」と読めてしまう。
今シグナルになっているかだけを見る。
期限を渡して OS の中で待つことはしない。WaitForSingleObject はスレッドを止めるため、 待っている間は他のファイバが進まず、WebSocket の接続維持まで止まる。 呼ぶ側が Crystal の sleep を挟んで見に来る。
release_single_instance
多重起動の抑止を解く(issue #10 第 2 段階)。
置き換えて新しい exe を起動するときに使う。 握ったまま起動すると、新しい側が「既に起動している」と判断して終わってしまう。 解いた後に起動が失敗した場合は取り直せるよう、握っていたかどうかを返す。
常駐へ入ったことを、置き換えて起動した側へ伝える(issue #29)。
渡された側かどうかは見ずに、常駐へ入るたびに知らせる。 待っている親がいなければ、その場で作ったイベントを立てて閉じるだけで終わる。 引数で渡された場合だけ知らせる形にすると、起動の経路を数えることになり、 数え漏らしたほうが黙って期限まで待たされる。