我有一个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 ...
答案 0 :(得分:0)
仅在第二个问题上回答:
默认情况下,线程安全正在构建(自1.8.x版本起):
•“最近删除了对JS_THREADSAFE的支持,默认情况下现在启用了线程安全版本。”
https://developer.mozilla.org/en-US/docs/SpiderMonkey/Build_Documentation#Building_your_application