将JS 1.7.0迁移到SpiderMonkey 24后,JS_DestoryContext中出现错误

fault in JS_DestroyContext after migrating js 1.7.0 to SpiderMonkey 24

本文关键字:JS DestoryContext 错误 迁移 SpiderMonkey      更新时间:2023-10-16

我有一个C++应用程序,它有几个自定义/本地JavaScript对象,多年来一直在js 1.7.0上运行良好,但鉴于已经添加的所有新功能,是时候更新到SpiderMonkey 24了。我已经构建了新的库,并对我们的应用程序进行了必要的更改(以便它编译、链接和运行),但我在调用JS_DestoryContext时遇到了一致的错误(它在执行GC时崩溃)。如果我使用JS_DestoryContentNoGC,我不会得到崩溃,尽管我认为这意味着我的应用程序将在其他时间泄漏内存或崩溃(这个假设准确吗?)。Migrating_to_SpiderMonkey_24指南中充斥着。。。在此处插入详细信息。。。所以这并没有特别大的帮助。我的假设是,这个错误与我不了解新版SpiderMonkey在线程方面的要求有关。

基本上,我的应用程序创建了一堆JSRuntime(每个逻辑服务一个),在每个JSRuntime中创建了一组相关的JS_NewContext(每个到逻辑服务的连接一个)并在每个JS_NewContext中定义了一些自定义对象。应用程序是多线程的,上下文上的脚本可以在线程池中的任何线程上运行。我提供了自定义锁定,这样在任何时候都不会有两个上下文在同一运行时中执行。当脚本需要运行时,我会执行自定义锁定,并使用JSAutoRequest和JSAutoCompartment包装执行。

1) 我的方法足够吗?1b)我是否必须锁定,以便同时没有两个运行时处于活动状态?

2) 我没有用--enable threadsafe编译SpiderMonkey(当我这样做的时候,我无法在x64上用NSPR编译它,它确实编译得很好)。。。考虑到我的使用,这是必需的吗?

3) (其次)性能不是关键的,所以我用--disable-ion--disable-yarr-jit编译了它;这足以关闭所有JIT吗?我注意到图书馆还是大了一点。

非常感谢你的指点。。。我不想回到1.7.0…

仅回答第二个问题:

线程安全是默认构建的(自1.8.x版本以来):

•"最近删除了对JS_THREADSAFE的支持,现在默认启用线程安全构建。">

https://developer.mozilla.org/en-US/docs/SpiderMonkey/Build_Documentation#Building_your_application