拡張機能開発: nsIThreadManager利用時における定義済みコアオブジェクトの挙動

Firefox拡張機能を相変わらず作っております。
スレッドではまったのでメモ。


時間がかかる処理を行うので、Firefox3から導入されたnsIThreadManagerを利用して、マルチスレッディングで楽しようとコーディング。

MDC: The Thread Manager
https://developer.mozilla.org/ja/The_Thread_Manager

本家のサンプルのほぼそのまんまです。


で、です。
スレッド処理に切り替える前、デバッグ出力する際に、String(obj) として文字列に変換してやっていました。objがnullな可能性もあったので。

var obj = null;
dump("obj=" + String(obj));    // ここで停止

そして、スレッドで処理するように書き換えた後、このコードを実行してみると、そこでプログラムが停止。Firefoxすら反応しなくなる。
原因が、よく分からないながら、String()を外すと動き出す。


同様に、

var x = Math.ceil( xxxx/ yyyy);

な感じの処理をおこなっている場所でも、停止。


どーやら、スレッド内で、デフォルトで用意されている「定義済みコアオブジェクト」というものに触れると停止するよう。

註: DOM はスレッドセーフではないので、バックグラウンドスレッドから DOM や ユーザーインタフェースにアクセスしてはいけません。クラッシュの原因となります。


MDCのページのこの1文がすごく気になる。
まさか、 「定義済みコアオブジェクト」はスレッドセーフではない? とか?
ソースでも読んで確認してみたほうがいいのかしら・・・。