2015.06.01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30

MHI 5.0

この「にっき」には暴力シーンやグロテスクな表現が含まれています。

(2015.06.17) 2213

$ NYAGOS 4.0.9 とその狂気

パイプラインを実行するとクラッシュする不具合に苦しめられてました。 それはもう発狂するくらいに。

事の発端は svn のサブコマンドを勝手に拡張するコード:

nyagos.alias.svn = function(args)
    if args[1] == "amdc" then
        return "svn.exe status | findstr ^[AMDC]"
    end
    args[0] = "svn.exe"
    if args[1] == "exclude" then
        args[1] = "update"
        table.insert(args,2,"--set-depth=exclude")
    elseif args[1] == "emptyup" then
        args[1] = "update"
        table.insert(args,2,"--depth=empty")
    elseif args[1] == "emptyadd" then
        args[1] = "add"
        table.insert(args,2,"--depth=empty")
    end
    return args
end

を使うと、よくクラッシュすることでした。

でも、よくよく調べてみると、別にこの svn エイリアスを 使わない場合でも普通に発生するんですよね。

自分ではもう何が何やら分からんで情緒不安定になっていたんですが、 そんな折 @nocd5 さんが 調べてくださったところ、 (拡張子に応じてインタプリタ名を挿入するために設けたフックである) nyagos.argsfilter という Luaフィルターを呼ぶ箇所で クラッシュしていたことが判明しました。 (それまで、ずっと違うところだと勘違いしていた)

どうやら、コマンドラインでパイプラインを使った時に、 それぞれのパイプラインごとのゴルーチンで「同時に」 nyagos.argsfilter を呼び出していたようでした。 これをゴルーチンを走らせる前の段階で、個別に逐次呼び出すようにしたところ、 普通にパイプラインを使う分にはクラッシュしないようになりました。

もう、それでどれだけ安堵したことやら…

ただ、パイプライン上の「コマンド」として、 Luaエイリアスを複数書くと「理論上」また発生するはずなんですよね。 対策としては、コマンドごとに Lua のインスタンスを分けるか、 そもそも Lua エイリアスの複数起動を仕様としてできないようにするか、 いずれかなんですがー… でも

  • Lua のインスタンスを分けるのなら、Lua のデータも複写しなければいけないので、そのコストが大きい (こういう時 fork がある UNIX はいいなぁ)
  • 仕様を制限するのはあまりスマートな解決法でもないような気もする

という感じで、致命的でないのをいいことに、対応を先送りしてます。

しかし、プログラミングは楽しいけど、理解を越える不具合が出ると、 本当にあたまがおかしくなります、割とまじで。

.net(3) C++(3) Cygwin(12) GAME(3) Groovy(1) Linux(2) Lua(39) Mercurial(13) NYAOS(92) OS/2(7) Oracle(3) Perl(4) Python(22) SKK(4) Windows8(1) album(68) ckw(10) coLinux(1) vim(6) wifky(27) 書評(21) (9)

zetamattaのたいじゅー