実はクラッシュ対策しただけ
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 の時代から、クラッシュは稀にしか起こらないので、理論上は解消しているはず…なんですけどねぇ。どんなもんでしょうか
関連記事
- 何がちがう?NYAOS 3.x と NYAGOS 4.0
- nyagosスクリプト解説 - CMD.EXEで化けさせず、nyagosの中だけプロンプトをカラー化 … スクリプトが要修正でした(コメント追記)