firefox插件:创建一个新线程并发送nsIRunnable到它?

时间:2013-10-09 21:51:42

标签: multithreading firefox firefox-addon

为什么这会导致FireFox崩溃?将此代码复制并粘贴到浏览器控制台( Ctrl + Shift + J ):

function TestRunner(){}
TestRunner.prototype={
    classDescription:"TestRunner",
    classID:Components.ID("{09AA3487-7531-438D-B0B2-80BC24B584C0}"),
    contractID:"@yoy.be/TestRunner;1",
    QueryInterface:XPCOMUtils.generateQI([Components.interfaces.nsIRunnable]),
    run:function(){
        console.log("ping");
    }
};
Components.classes["@mozilla.org/thread-manager;1"].getService().newThread(0).dispatch(new TestRunner(),0);

2 个答案:

答案 0 :(得分:1)

从Firefox 4(-ish)开始,整个Javascript引擎变得远不那么线程安全,延伸到例如简单的事情,如只是"阅读"并发的字符串可能会导致内存损坏(因为这些读取实际上可能会为字符串绳索实现字符串视图)。

因此,我们决定不再支持调度javascript实现的nsIRunnable,因为没有安全的方法可以使用它,人们应尽可能切换到ChromeWorkers

编辑您在评论中说明了您要实施nsIChannel / nsIProtocolHandler。 AFAIK你可以实现nsIProtocolHandler和nsIChannel而不需要任何线程和二进制文件。如果您仍然需要线程和/或二进制文件,那么您的Javascript XPCOM(存根)组件将简单地#34;通过消息传递与ChromeWorker通信(传递ArrayBuffers /类型数组;这些是零拷贝)。然后,ChromeWorker将执行任何繁重的工作,包括任何js-ctypes调用与二进制文件的接口。

答案 1 :(得分:0)

您可以使用(chrome)worker在其他线程上运行非XPCOM JavaScript,并且可以将nsIRunnable的C ++实现分派给其他线程,但是您只能在主线程上使用XPConnect。这是因为XPConnect对象可以循环收集,循环收集器不是线程安全的。