ヽ(´・肉・`)ノログ

How do we fighting without fighting?

elixirの–no-haltオプションはどう実装されているか

elixir には,サーバーなどを起動させるコマンドの場合に,コマンドを終了させない --no-halt というオプションがある.

% elixir --help 2>&1 | grep no-halt
  --no-halt         Does not halt the Erlang VM after execution

これはどのように実装されているのだろうか.

lib/elixir/lib/kernel/cli.ex#L158-L160

defp parse_shared(["--no-halt"|t], config) do
  parse_shared t, %{config | halt: false}
end

--no-halt を設定されると config に含まれる :haltfalse となるようだ.

lib/elixir/lib/kernel/cli.ex#L4-L6

@blank_config %{commands: [], output: ".", compile: [],
                halt: true, compiler_options: [], errors: [],
                pa: [], pz: [], verbose_compile: false}

初期値は true である.

lib/mix/lib/mix/tasks/run.ex#L67

unless Keyword.get(opts, :halt, true), do: :timer.sleep(:infinity)

:halttrue でない場合は :timer.sleep(:infinity) で待ち続けるようになっている.

まとめ

--no-halt:timer.sleep(:infinity) で実装されている.

このエントリーをはてなブックマークに追加