【发布时间】:2014-02-07 20:38:37
【问题描述】:
我有一个 C++ 应用程序,其中包含几个自定义/本机 JavaScript 对象,多年来一直在 js 1.7.0 上运行良好,但鉴于已添加的所有新功能,是时候更新到 SpiderMonkey 24。我有构建了新库并对我们的应用程序进行了必要的更改(以便它编译、链接和运行),但是 我在调用 JS_DestroyContext 时遇到了一致的错误(它在执行 GC 时崩溃了)。如果我使用 JS_DestroyContextNoGC,我不会遇到崩溃,尽管我认为这意味着我的应用程序将在其他时间泄漏内存或崩溃(这个假设准确吗?) . Migrating_to_SpiderMonkey_24 指南到处都是......在此处插入详细信息......所以这并不是特别有用。我的假设是这个错误与我对新版本的 SpiderMonkey 对线程的要求缺乏了解有关。
基本上,我的应用程序创建了一堆 JSRuntime(每个逻辑服务一个),并在每个内部创建了一堆相关的 JS_NewContext(每个连接到每个逻辑服务一个),并在每个中定义了一些自定义对象。该应用程序是多线程的,上下文中的脚本可以在线程池中的任何线程上运行。我提供了自定义锁定,这样任何时候都不会在同一个运行时中执行两个上下文。当脚本需要运行时,我会进行自定义锁定,并另外使用 JSAutoRequest 和 JSAutoCompartment 包装执行。
1) 我的方法是否足够? 1b) 我是否必须锁定以便同时没有两个运行时处于活动状态?
2) 我没有使用 --enable-threadsafe 编译 SpiderMonkey(当我编译时,我无法在 x64 上使用 NSPR 编译它,它确实编译正常)...考虑到我的使用情况,这是必需的吗?
3) (其次)性能并不重要,所以我确实使用 --disable-ion --disable-yarr-jit 编译它;这足以关闭所有 JIT 吗?我注意到图书馆还是有点大。
非常感谢任何指点...我不想不得不恢复到 1.7.0...
【问题讨论】:
标签: c++ spidermonkey