こんにちは、川合です。
今日は将来の「ぐいぐい01」でシグナルの扱いがどう変わるかを説明
します。これを参考にプログラミングすれば、ぐいぐい00からぐいぐい
01に移行しても、ソースの書き換えが減らせます。
なおもちろんこんな新しい取り決めを無視して今まで通りプログラミ
ングしてかまいません。それがぐいぐい00の仕様なんですから。
---
1.rewindコードの扱い
rewindは特殊シグナルで、シグナルボックスを折り返すためのもので
す。ぐいぐい00では、このコードの直後に必ず一般シグナルが存在する
ことを保証していましたが、ぐいぐい01では保証しません。
2.「end of signal」コードの扱い
ぐいぐい00ではこれが0に固定されていますが、ぐいぐい01では任意
の32bit整数を指定できるようになります。もちろん0でもいいです。
3.シグナル属性の新設
これが最大の変更点です。普通の32bitシグナルの場合、最初の8bit
がシグナル属性として使われます。したがって好きな値には出来ません
。またその次の8bitもリザーブになる可能性があります。・・・もちろ
ん上位16bitは自由です。だから実際は、
switch (getsignal() >> 16) { ...
などとするだけのことです。
---
64bitシグナルやそれ以上の長さのシグナルの場合も、最初の8bitも
しくは16bitがリザーブになるだけで残りの48bitかそれ以上は、完全に
プログラマブルです。
さてこのシグナル属性について説明します。最初の8bitには意味が割
り振られており、次の8bitは将来のためのリザーブです。
bit0-3 : シグナル長 0-15 (0だと32bit、1だと64bit、2だと96bit)
bit4-6 : シグナルプライオリティ
bit7 : 必ず0
bit8-15 : リザーブ (結局アプリに開放する可能性もあり)
複数のシグナルボックスに対応した場合、その配信先にな
るかもしれない。
シグナルプライオリティというのは、こういうことです。シグナルに
は絶対に取りこぼしたくないような重要なシグナルや、まあ非常時なら
取りこぼしてもよいシグナルなどがあるでしょう。それを区別するため
のフィールドです。もっとも優先度が低いシグナルは、シグナルボック
スが半分以上埋まっているだけで、捨てられます(この事実をシグナル
ボックスフルというシグナルで通知させることも可能)。優先度が最高
だとシグナルボックスが満タンになるまで捨てません。
ちなみにぐいぐい00ではプライオリティを設定できないので、どのシ
グナルも最高の優先度をもつとして扱います。だからあふれるまで溜ま
った後は、みさかいなく捨てられます。何かが捨てられたということは
検知できますが、何が捨てられたかを知ることは出来ません。
シグナル長に関してですが、これは重要です。間違えるとシステムが
シグナルの一貫性を保てなくなるので、チェックして問題が見付かった
時点でそのタスクは強制終了させられるかもしれません。bit7の必ず0
の部分も守らなくてはいけません。ここを1にしてdefinesignalすると
即座にエラーにされるでしょう(もっともぐいぐい01ではdefinesignal
が既に無効になっている可能性の方が高いですが)。
なお、rewindコードやend of signalコードは一般シグナルではない
のでこのようなフィールドはなく、自由に使える予定です。
---
この仕様が実現すれば、シグナル処理のシステム側の効率が2倍に改
善する見込みです。ということでぐいぐい01では不便をおかけしますが
ご了承ください。
それでは。
--
川合 秀実(KAWAI Hidemi)
OSASK計画代表 / システム設計開発担当
E-mail:kawai !Atmark! imasy.org
Homepage http://www.imasy.org/~kawai/