Help us understand the problem. What is going on with this article?

何がちがう?NYAGOS 4.0 と 4.1β

More than 3 years have passed since last update.

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

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

関連記事

zetamatta
「趣味で Go 言語を書いているものだ」
https://github.com/zetamatta
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした