focus-creative-games/hybridclr

关于新版本对InitializeRuntimeMetadata的修改

AlanLiu90 opened this issue · 2 comments

发现上次反馈问题时,我可能没说清楚。那个崩溃问题主要不是这一处内存可见性问题导致的,而是另一个线程可能先看到上层函数的s_Il2CppMethodInitializedtrue,再看到metadata的初始化结果,所以可能出现使用了metadata默认值的问题。

考虑到直接使用Load Acquire和Store Release对s_Il2CppMethodInitialized进行读写,会增加太多不必要的开销,所以我本地只修改了写的部分,降低崩溃的概率:

if (initialized != NULL)
{
	il2cpp::os::Atomic::FullMemoryBarrier();
        *metadataPointer = (uintptr_t)initialized;
        il2cpp::os::Atomic::FullMemoryBarrier();     // <----
}

使用我发的那个复现工程测试,是没有崩溃了(实际项目还没有发布新版本,不确定效果怎么样),不知道有没有更好的解决方法?

另外,这是Unity的问题跟踪链接:https://issuetracker.unity3d.com/issues/android-application-crash-when-methods-are-called-in-multiple-threads

没注意到官方修改用的ExchangePointer实际上是seq_cst类型的原子操作,跟我本地的改动是等价的。

ok.暂时就这样。