fiber

fib: fiber{
  try{
    "begin".p;
    yield;
  }
  finally{
    "end".p;
  }
}

fib(); // 一回しかファイバーを起動しない

というように、finallyがついているtryの途中でファイバーが死んだ場合でも、
ちゃんとfinally節が実行されるつもりでしたが、試したら実行されませんたでした。


これはダメだということで、Fiberクラスのデストラクタで処理しようとしたらうまくいきません。
デストラクタが走る際、依存しているほかのオブジェクトのデストラクタがすでに実行されている場合があるためでした。


ちゃんとファイナライザを搭載しないと解決しないということで、C++レベルでファイナライザを追加することに。


しかし、ファイナライザはややこしいです。
ファイナライザ処理中に死ぬ予定であるオブジェクトが復活することがある、
ということに気づかず、なぜアクセス違反で停止してしまうのか悩みました。


おそらくちゃんと実装でき、上の例はちゃんとfinally節が実行されるようになりました。


次の悩みは、ファイナライザをXtalレベルに露出するかどうかです。
ファイナライザを持つオブジェクトが増えると、GCの負荷が増えるので問題です。