著作一覧 |
soraさんのparallelテストでWin32OLEが死ぬのだが、これが死ぬのが当然な死に方でちょっと弱る。
仕組み上、テストがメインスレッドではないスレッドで実行される。
そこまではそれなりに良い(はず)。というのは、助田さんがメインスレッド以外で呼ばれたときのために、個々のスレッドでCoInitializeしているからだ。
が、実はこの対応自体がいまひとつだった。というのは、そのスレッドの終了時にCoUninitializeするからだ。
通常であればこれは正しい。
しかし、Rubyの場合、オブジェクトの解放はGC起動となっている。
つまり、あるスレッドでCoCreateしたオブジェクトが、そのスレッドが終了した後に解放される可能性があるということだ。
当然、元のスレッドは存在しないので、GCが行われているスレッドでのRelease呼び出しとなる。プロクシが必要な呼び出しであれば、そこで死ぬ。
ということは、クロススレッドを前提としたGIT経由のアクセスだけではなく、オブジェクトの生成はすべてメインスレッドに寄せるか、スレッド終結時に、そのスレッドで生成したオブジェクトの解放をするといった処理が必要となるのではないだろうか(というか、存在しなくなったスレッドで生成したオブジェクトってそもそも廃棄できるのだろうか?)
ジェズイットを見習え |
むずかしいものやのう。<br>こっちのWindowsのHDDが死にそうなのでwindows対応はほぼ任せてしまうことになるかも。<br>よろしくおねがいします。
ほーい(安請け合い)