めのん@ひとりプログラミング同好会

このブログはすべてフィクションであり、実在の人物、団体とは一切関係ありません

Zig版ASP3カーネルのsns_ker

こんにちは、めのんです!

本当は前回書いてしまおうと思っていたんですけど、長くなったので先送りにしたサービスコールsns_kerを今回は見ていきたいと思います。 大したことはないと思うので今回はすぐ終わると思います(たぶん💧)。

sns_kerの定義はkernel/sys_manage.zigにあります。

pub fn sns_ker() bool {
    traceLog("snsKerEnter", .{});
    var state = !startup.kerflg;
    traceLog("snsKerLeave", .{ state });
    return state;
}

これ自体はとくに見所はありませんね。 せっかく内容をのぞいてみたので、今回はグローバル変数のstartup.kerflgについても少し詳しく見ていくことにします。

このグローバル変数、実はsta_kerやext_kerにも登場していました。 お気付きになったでしょうか?

定義自体はいつものstartup.zigにあります。

pub var kerflg: bool = false;

これも何の変哲もない変数定義です。

私が気になったのは、こうしたグローバル変数の初期化タイミングです。 Cであればこういう初期化子付きの静的変数というのはスタートアップルーチンで初期化されます。

C++であれば、初期化子が定数の場合はCと同じように静的初期化されますが、そうでない場合はいったん静的初期化されたあと動的初期化されることになっています。 動的初期化のタイミングは厳密なことはともかく、実際にはスタートアップルーチンかmain関数の先頭で行われることが多いようです。 ただし、翻訳単位が異なればその動的初期化の順序は不定になるといいます。

じゃあ、Zigはどうなんだろうと思って調べてみました。 constの場合はcompitime-knownでそれ以外はruntime-knownとのことなんですが、具体的なところがよくわかりません。 この辺り、必要なら実験も交えながらもう少し調べてみる必要がありそうです。

今回はこれぐらいにしておきます。

それでは!!