search
LoginSignup
3
Help us understand the problem. What are the problem?

More than 5 years have passed since last update.

posted at

何がちがう?NYAGOS 4.0 と 4.1β

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

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 の時代から、クラッシュは稀にしか起こらないので、理論上は解消しているはず…なんですけどねぇ。どんなもんでしょうか

関連記事

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
What you can do with signing up
3
Help us understand the problem. What are the problem?