From ac395b21ea06e9e00c07c49c1b3d2707174c22c2 Mon Sep 17 00:00:00 2001 From: Alexander Shabalin Date: Thu, 9 Jun 2022 13:01:17 +0000 Subject: [PATCH] [K/N] Fix state switch in CAdapterGenerator ^KT-52692 Merge-request: KT-MR-6429 Merged-by: Alexander Shabalin --- .../kotlin/backend/konan/CAdapterGenerator.kt | 3 ++ kotlin-native/runtime/src/mm/cpp/Memory.cpp | 30 +++++++++++++++---- 2 files changed, 27 insertions(+), 6 deletions(-) diff --git a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/CAdapterGenerator.kt b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/CAdapterGenerator.kt index aa61d29069e..7a70ccbc51e 100644 --- a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/CAdapterGenerator.kt +++ b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/CAdapterGenerator.kt @@ -982,12 +982,15 @@ internal class CAdapterGenerator(val context: Context) : DeclarationDescriptorVi |}; | |static void DisposeStablePointerImpl(${prefix}_KNativePtr ptr) { + | Kotlin_initRuntimeIfNeeded(); + | ScopedRunnableState stateGuard; | DisposeStablePointer(ptr); |} |static void DisposeStringImpl(const char* ptr) { | DisposeCString((char*)ptr); |} |static ${prefix}_KBoolean IsInstanceImpl(${prefix}_KNativePtr ref, const ${prefix}_KType* type) { + | Kotlin_initRuntimeIfNeeded(); | ScopedRunnableState stateGuard; | KObjHolder holder; | return IsInstance(DerefStablePointer(ref, holder.slot()), (const KTypeInfo*)type); diff --git a/kotlin-native/runtime/src/mm/cpp/Memory.cpp b/kotlin-native/runtime/src/mm/cpp/Memory.cpp index b94fad9eb18..aabf8ddb557 100644 --- a/kotlin-native/runtime/src/mm/cpp/Memory.cpp +++ b/kotlin-native/runtime/src/mm/cpp/Memory.cpp @@ -263,19 +263,27 @@ extern "C" RUNTIME_NOTHROW ALWAYS_INLINE void CheckCurrentFrame(ObjHeader** fram } extern "C" RUNTIME_NOTHROW void AddTLSRecord(MemoryState* memory, void** key, int size) { - memory->GetThreadData()->tls().AddRecord(key, size); + auto* threadData = memory->GetThreadData(); + AssertThreadState(threadData, ThreadState::kRunnable); + threadData->tls().AddRecord(key, size); } extern "C" RUNTIME_NOTHROW void CommitTLSStorage(MemoryState* memory) { - memory->GetThreadData()->tls().Commit(); + auto* threadData = memory->GetThreadData(); + AssertThreadState(threadData, ThreadState::kRunnable); + threadData->tls().Commit(); } extern "C" RUNTIME_NOTHROW void ClearTLS(MemoryState* memory) { - memory->GetThreadData()->tls().Clear(); + auto* threadData = memory->GetThreadData(); + AssertThreadState(threadData, ThreadState::kRunnable); + threadData->tls().Clear(); } extern "C" RUNTIME_NOTHROW ObjHeader** LookupTLS(void** key, int index) { - return mm::ThreadRegistry::Instance().CurrentThreadData()->tls().Lookup(key, index); + auto* threadData = mm::ThreadRegistry::Instance().CurrentThreadData(); + AssertThreadState(threadData, ThreadState::kRunnable); + return threadData->tls().Lookup(key, index); } extern "C" RUNTIME_NOTHROW void GC_RegisterWorker(void* worker) { @@ -295,6 +303,7 @@ extern "C" RUNTIME_NOTHROW void GC_CollectorCallback(void* worker) { extern "C" void Kotlin_native_internal_GC_collect(ObjHeader*) { auto* threadData = mm::ThreadRegistry::Instance().CurrentThreadData(); + AssertThreadState(threadData, ThreadState::kRunnable); threadData->gc().ScheduleAndWaitFullGCWithFinalizers(); } @@ -436,7 +445,9 @@ extern "C" void Kotlin_Any_share(ObjHeader* thiz) { } extern "C" RUNTIME_NOTHROW void PerformFullGC(MemoryState* memory) { - memory->GetThreadData()->gc().ScheduleAndWaitFullGCWithFinalizers(); + auto* threadData = memory->GetThreadData(); + AssertThreadState(threadData, ThreadState::kRunnable); + threadData->gc().ScheduleAndWaitFullGCWithFinalizers(); } extern "C" bool TryAddHeapRef(const ObjHeader* object) { @@ -467,6 +478,7 @@ extern "C" RUNTIME_NOTHROW void* CreateStablePointer(ObjHeader* object) { return nullptr; auto* threadData = mm::ThreadRegistry::Instance().CurrentThreadData(); + AssertThreadState(threadData, ThreadState::kRunnable); return mm::StableRefRegistry::Instance().RegisterStableRef(threadData, object); } @@ -478,14 +490,19 @@ extern "C" RUNTIME_NOTHROW void DisposeStablePointerFor(MemoryState* memoryState if (!pointer) return; + auto* threadData = memoryState->GetThreadData(); + AssertThreadState(threadData, ThreadState::kRunnable); + auto* node = static_cast(pointer); - mm::StableRefRegistry::Instance().UnregisterStableRef(memoryState->GetThreadData(), node); + mm::StableRefRegistry::Instance().UnregisterStableRef(threadData, node); } extern "C" RUNTIME_NOTHROW OBJ_GETTER(DerefStablePointer, void* pointer) { if (!pointer) RETURN_OBJ(nullptr); + AssertThreadState(ThreadState::kRunnable); + auto* node = static_cast(pointer); ObjHeader* object = **node; RETURN_OBJ(object); @@ -496,6 +513,7 @@ extern "C" RUNTIME_NOTHROW OBJ_GETTER(AdoptStablePointer, void* pointer) { RETURN_OBJ(nullptr); auto* threadData = mm::ThreadRegistry::Instance().CurrentThreadData(); + AssertThreadState(threadData, ThreadState::kRunnable); auto* node = static_cast(pointer); ObjHeader* object = **node; // Make sure `object` stays in the rootset: put it on the stack before removing it from `StableRefRegistry`.