[K/N] Fix state switch in CAdapterGenerator ^KT-52692
Merge-request: KT-MR-6429 Merged-by: Alexander Shabalin <Alexander.Shabalin@jetbrains.com>
This commit is contained in:
committed by
Space
parent
83d7524232
commit
ac395b21ea
+3
@@ -982,12 +982,15 @@ internal class CAdapterGenerator(val context: Context) : DeclarationDescriptorVi
|
|||||||
|};
|
|};
|
||||||
|
|
|
|
||||||
|static void DisposeStablePointerImpl(${prefix}_KNativePtr ptr) {
|
|static void DisposeStablePointerImpl(${prefix}_KNativePtr ptr) {
|
||||||
|
| Kotlin_initRuntimeIfNeeded();
|
||||||
|
| ScopedRunnableState stateGuard;
|
||||||
| DisposeStablePointer(ptr);
|
| DisposeStablePointer(ptr);
|
||||||
|}
|
|}
|
||||||
|static void DisposeStringImpl(const char* ptr) {
|
|static void DisposeStringImpl(const char* ptr) {
|
||||||
| DisposeCString((char*)ptr);
|
| DisposeCString((char*)ptr);
|
||||||
|}
|
|}
|
||||||
|static ${prefix}_KBoolean IsInstanceImpl(${prefix}_KNativePtr ref, const ${prefix}_KType* type) {
|
|static ${prefix}_KBoolean IsInstanceImpl(${prefix}_KNativePtr ref, const ${prefix}_KType* type) {
|
||||||
|
| Kotlin_initRuntimeIfNeeded();
|
||||||
| ScopedRunnableState stateGuard;
|
| ScopedRunnableState stateGuard;
|
||||||
| KObjHolder holder;
|
| KObjHolder holder;
|
||||||
| return IsInstance(DerefStablePointer(ref, holder.slot()), (const KTypeInfo*)type);
|
| return IsInstance(DerefStablePointer(ref, holder.slot()), (const KTypeInfo*)type);
|
||||||
|
|||||||
@@ -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) {
|
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) {
|
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) {
|
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) {
|
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) {
|
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*) {
|
extern "C" void Kotlin_native_internal_GC_collect(ObjHeader*) {
|
||||||
auto* threadData = mm::ThreadRegistry::Instance().CurrentThreadData();
|
auto* threadData = mm::ThreadRegistry::Instance().CurrentThreadData();
|
||||||
|
AssertThreadState(threadData, ThreadState::kRunnable);
|
||||||
threadData->gc().ScheduleAndWaitFullGCWithFinalizers();
|
threadData->gc().ScheduleAndWaitFullGCWithFinalizers();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -436,7 +445,9 @@ extern "C" void Kotlin_Any_share(ObjHeader* thiz) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
extern "C" RUNTIME_NOTHROW void PerformFullGC(MemoryState* memory) {
|
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) {
|
extern "C" bool TryAddHeapRef(const ObjHeader* object) {
|
||||||
@@ -467,6 +478,7 @@ extern "C" RUNTIME_NOTHROW void* CreateStablePointer(ObjHeader* object) {
|
|||||||
return nullptr;
|
return nullptr;
|
||||||
|
|
||||||
auto* threadData = mm::ThreadRegistry::Instance().CurrentThreadData();
|
auto* threadData = mm::ThreadRegistry::Instance().CurrentThreadData();
|
||||||
|
AssertThreadState(threadData, ThreadState::kRunnable);
|
||||||
return mm::StableRefRegistry::Instance().RegisterStableRef(threadData, object);
|
return mm::StableRefRegistry::Instance().RegisterStableRef(threadData, object);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -478,14 +490,19 @@ extern "C" RUNTIME_NOTHROW void DisposeStablePointerFor(MemoryState* memoryState
|
|||||||
if (!pointer)
|
if (!pointer)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
auto* threadData = memoryState->GetThreadData();
|
||||||
|
AssertThreadState(threadData, ThreadState::kRunnable);
|
||||||
|
|
||||||
auto* node = static_cast<mm::StableRefRegistry::Node*>(pointer);
|
auto* node = static_cast<mm::StableRefRegistry::Node*>(pointer);
|
||||||
mm::StableRefRegistry::Instance().UnregisterStableRef(memoryState->GetThreadData(), node);
|
mm::StableRefRegistry::Instance().UnregisterStableRef(threadData, node);
|
||||||
}
|
}
|
||||||
|
|
||||||
extern "C" RUNTIME_NOTHROW OBJ_GETTER(DerefStablePointer, void* pointer) {
|
extern "C" RUNTIME_NOTHROW OBJ_GETTER(DerefStablePointer, void* pointer) {
|
||||||
if (!pointer)
|
if (!pointer)
|
||||||
RETURN_OBJ(nullptr);
|
RETURN_OBJ(nullptr);
|
||||||
|
|
||||||
|
AssertThreadState(ThreadState::kRunnable);
|
||||||
|
|
||||||
auto* node = static_cast<mm::StableRefRegistry::Node*>(pointer);
|
auto* node = static_cast<mm::StableRefRegistry::Node*>(pointer);
|
||||||
ObjHeader* object = **node;
|
ObjHeader* object = **node;
|
||||||
RETURN_OBJ(object);
|
RETURN_OBJ(object);
|
||||||
@@ -496,6 +513,7 @@ extern "C" RUNTIME_NOTHROW OBJ_GETTER(AdoptStablePointer, void* pointer) {
|
|||||||
RETURN_OBJ(nullptr);
|
RETURN_OBJ(nullptr);
|
||||||
|
|
||||||
auto* threadData = mm::ThreadRegistry::Instance().CurrentThreadData();
|
auto* threadData = mm::ThreadRegistry::Instance().CurrentThreadData();
|
||||||
|
AssertThreadState(threadData, ThreadState::kRunnable);
|
||||||
auto* node = static_cast<mm::StableRefRegistry::Node*>(pointer);
|
auto* node = static_cast<mm::StableRefRegistry::Node*>(pointer);
|
||||||
ObjHeader* object = **node;
|
ObjHeader* object = **node;
|
||||||
// Make sure `object` stays in the rootset: put it on the stack before removing it from `StableRefRegistry`.
|
// Make sure `object` stays in the rootset: put it on the stack before removing it from `StableRefRegistry`.
|
||||||
|
|||||||
Reference in New Issue
Block a user