From 60108071ddb18120e043ed4cb9ab186e4746c02f Mon Sep 17 00:00:00 2001 From: Svyatoslav Scherbina Date: Thu, 20 Feb 2020 09:52:55 +0300 Subject: [PATCH] Ensure shared cyclic collector doesn't get dangling root during deinit --- runtime/src/main/cpp/CyclicCollector.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/runtime/src/main/cpp/CyclicCollector.cpp b/runtime/src/main/cpp/CyclicCollector.cpp index d7f12009b65..02c2dedad6d 100644 --- a/runtime/src/main/cpp/CyclicCollector.cpp +++ b/runtime/src/main/cpp/CyclicCollector.cpp @@ -134,7 +134,7 @@ class CyclicCollector { CHECK_CALL(pthread_create(&gcThread_, nullptr, gcWorkerRoutine, this), "Cannot start collector thread") } - ~CyclicCollector() { + void terminate() { { Locker locker(&lock_); terminateCollector_ = true; @@ -144,6 +144,9 @@ class CyclicCollector { // TODO: improve waiting for collector termination. while (atomicGet(&terminateCollector_)) {} releasePendingUnlocked(nullptr); + } + + ~CyclicCollector() { pthread_cond_destroy(&cond_); pthread_mutex_destroy(&lock_); pthread_mutex_destroy(×tampLock_); @@ -431,6 +434,7 @@ void cyclicDeinit() { #if WITH_WORKERS RuntimeAssert(cyclicCollector != nullptr, "Must be inited"); auto* local = cyclicCollector; + local->terminate(); cyclicCollector = nullptr; konanDestructInstance(local); #endif // WITH_WORKERS