LoginSignup
3
3

More than 5 years have passed since last update.

何がちがう?NYAGOS 4.0 と 4.1β

Posted at

実はクラッシュ対策しただけ

NYAGOS 4.0 では、パイプライン等の平行動作のために複数の goroutine から同一の Lua インスタンスを利用することがあり、それが原因と思われる panic(クラッシュ)を起こす問題がありました。おそらくはLuaスタックに矛盾を起こした結果ではないかと思われます(推測)。

4.1β では、それを回避するために、コマンド発行の度に別の Lua インスタンスを都度新規作成して、競合を回避して安定をはかりました。

ただし、別のインスタンスでは変数領域が完全に別になり、nyagos.alias[] 等に代入された関数(以下コールバック関数)自身すら、新しいインスタンス(goroutine)から見えないという問題があります。

その対策として 4.1βではグローバルテーブル nyagos[] 以下と share[] 以下に代入された変数・関数については、Go言語側で本体を保持し、新インスタンスの同テーブル経由で参照できるようにしました。(内部的にはメタテーブルの __newindex__index メソッドで代入・参照を横取りしています)

とはいえ、これによって、従来稼動していた Lua スクリプトの互換性が損われる結果となりました。NYAGOS 4.0 で動作していたスクリプトが4.1 にて同様に動くには、下記の修正が必要です。

  • コールバック関数から参照される static な変数は、全て share[] 下へ移動する

    • share[] 直下の変数・関数は、全てのコールバック関数より参照可能
    • (注意)変更の検出は share[] の直下しかされない。つまり
      • OK:share.foo = { '1','2','3' }
      • NG:share.foo[1] = 'x' (階層が一つ深いため、変更が検出されず、データ本体まで修正が届かない)
      • OK:local t = share.foo ; t[1] = 'x' ; share.foo = t(でも、テーブル全体のコピーが走るので、ずばり遅い)
  • nyagos.alias[] , nyagos.on_command_not_found には代入できるのは 関数だけで、クロージャは代入できない

    • つまり、local 宣言された変数も参照できない
    • nyagos.prompt も同様だが、改善を検討中

NYAGOS 4.1 は、現在 beta として公開中です。4.0 の時代から、クラッシュは稀にしか起こらないので、理論上は解消しているはず…なんですけどねぇ。どんなもんでしょうか

関連記事

3
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
3