diff --git a/ecmascript/daemon/daemon_thread.cpp b/ecmascript/daemon/daemon_thread.cpp index 48411d44a3..6f5bc093b0 100644 --- a/ecmascript/daemon/daemon_thread.cpp +++ b/ecmascript/daemon/daemon_thread.cpp @@ -79,7 +79,7 @@ void DaemonThread::WaitFinished() if (IsRunning()) { CheckAndPostTask(TerminateDaemonTask(nullptr)); thread_->join(); - thread_.release(); + thread_.reset(); Taskpool::GetCurrentTaskpool()->Destroy(GetThreadId()); } ASSERT(!IsInRunningState()); diff --git a/ecmascript/mem/heap-inl.h b/ecmascript/mem/heap-inl.h index 93be4b189f..f5ad155c1c 100644 --- a/ecmascript/mem/heap-inl.h +++ b/ecmascript/mem/heap-inl.h @@ -515,7 +515,7 @@ TaggedObject *Heap::AllocateSharedNonMovableSpaceFromTlab(JSThread *thread, size return nullptr; } size_t newTlabSize = sNonMovableTlab_->ComputeSize(); - object = SharedHeap::GetInstance()->AllocateSNonMovableTlab(thread, newTlabSize); + object = sHeap_->AllocateSNonMovableTlab(thread, newTlabSize); if (object == nullptr) { sNonMovableTlab_->DisableNewTlab(); return nullptr; @@ -524,7 +524,8 @@ TaggedObject *Heap::AllocateSharedNonMovableSpaceFromTlab(JSThread *thread, size sNonMovableTlab_->Reset(begin, begin + newTlabSize, begin + size); auto topAddress = sNonMovableTlab_->GetTopAddress(); auto endAddress = sNonMovableTlab_->GetEndAddress(); - thread_->ReSetSNonMovableSpaceAllocationAddress(topAddress, endAddress); + thread->ReSetSNonMovableSpaceAllocationAddress(topAddress, endAddress); + sHeap_->TryTriggerConcurrentMarking(thread); return object; } @@ -541,7 +542,7 @@ TaggedObject *Heap::AllocateSharedOldSpaceFromTlab(JSThread *thread, size_t size return nullptr; } size_t newTlabSize = sOldTlab_->ComputeSize(); - object = SharedHeap::GetInstance()->AllocateSOldTlab(thread, newTlabSize); + object = sHeap_->AllocateSOldTlab(thread, newTlabSize); if (object == nullptr) { sOldTlab_->DisableNewTlab(); return nullptr; @@ -550,7 +551,8 @@ TaggedObject *Heap::AllocateSharedOldSpaceFromTlab(JSThread *thread, size_t size sOldTlab_->Reset(begin, begin + newTlabSize, begin + size); auto topAddress = sOldTlab_->GetTopAddress(); auto endAddress = sOldTlab_->GetEndAddress(); - thread_->ReSetSOldSpaceAllocationAddress(topAddress, endAddress); + thread->ReSetSOldSpaceAllocationAddress(topAddress, endAddress); + sHeap_->TryTriggerConcurrentMarking(thread); return object; } @@ -751,11 +753,13 @@ TaggedObject *SharedHeap::AllocateNonMovableOrHugeObject(JSThread *thread, JSHCl const_cast(thread->GetEcmaVM()->GetHeap())->AllocateSharedNonMovableSpaceFromTlab(thread, size); if (object == nullptr) { object = reinterpret_cast(sNonMovableSpace_->Allocate(thread, size)); + CHECK_SOBJ_AND_THROW_OOM_ERROR(thread, object, size, sNonMovableSpace_, + "SharedHeap::AllocateNonMovableOrHugeObject"); + object->SetClass(thread, hclass); + TryTriggerConcurrentMarking(thread); + } else { + object->SetClass(thread, hclass); } - CHECK_SOBJ_AND_THROW_OOM_ERROR(thread, object, size, sNonMovableSpace_, - "SharedHeap::AllocateNonMovableOrHugeObject"); - object->SetClass(thread, hclass); - TryTriggerConcurrentMarking(thread); #if defined(ECMASCRIPT_SUPPORT_HEAPPROFILER) OnAllocateEvent(thread->GetEcmaVM(), object, size); #endif @@ -772,10 +776,10 @@ TaggedObject *SharedHeap::AllocateNonMovableOrHugeObject(JSThread *thread, size_ const_cast(thread->GetEcmaVM()->GetHeap())->AllocateSharedNonMovableSpaceFromTlab(thread, size); if (object == nullptr) { object = reinterpret_cast(sNonMovableSpace_->Allocate(thread, size)); + CHECK_SOBJ_AND_THROW_OOM_ERROR(thread, object, size, sNonMovableSpace_, + "SharedHeap::AllocateNonMovableOrHugeObject"); + TryTriggerConcurrentMarking(thread); } - CHECK_SOBJ_AND_THROW_OOM_ERROR(thread, object, size, sNonMovableSpace_, - "SharedHeap::AllocateNonMovableOrHugeObject"); - TryTriggerConcurrentMarking(thread); #if defined(ECMASCRIPT_SUPPORT_HEAPPROFILER) OnAllocateEvent(thread->GetEcmaVM(), object, size); #endif @@ -798,10 +802,12 @@ TaggedObject *SharedHeap::AllocateOldOrHugeObject(JSThread *thread, JSHClass *hc const_cast(thread->GetEcmaVM()->GetHeap())->AllocateSharedOldSpaceFromTlab(thread, size); if (object == nullptr) { object = reinterpret_cast(sOldSpace_->Allocate(thread, size)); + CHECK_SOBJ_AND_THROW_OOM_ERROR(thread, object, size, sOldSpace_, "SharedHeap::AllocateOldOrHugeObject"); + object->SetClass(thread, hclass); + TryTriggerConcurrentMarking(thread); + } else { + object->SetClass(thread, hclass); } - CHECK_SOBJ_AND_THROW_OOM_ERROR(thread, object, size, sOldSpace_, "SharedHeap::AllocateOldOrHugeObject"); - object->SetClass(thread, hclass); - TryTriggerConcurrentMarking(thread); #if defined(ECMASCRIPT_SUPPORT_HEAPPROFILER) OnAllocateEvent(thread->GetEcmaVM(), object, size); #endif @@ -818,9 +824,9 @@ TaggedObject *SharedHeap::AllocateOldOrHugeObject(JSThread *thread, size_t size) const_cast(thread->GetEcmaVM()->GetHeap())->AllocateSharedOldSpaceFromTlab(thread, size); if (object == nullptr) { object = reinterpret_cast(sOldSpace_->Allocate(thread, size)); + CHECK_SOBJ_AND_THROW_OOM_ERROR(thread, object, size, sOldSpace_, "SharedHeap::AllocateOldOrHugeObject"); + TryTriggerConcurrentMarking(thread); } - CHECK_SOBJ_AND_THROW_OOM_ERROR(thread, object, size, sOldSpace_, "SharedHeap::AllocateOldOrHugeObject"); - TryTriggerConcurrentMarking(thread); return object; } diff --git a/ecmascript/mem/heap.cpp b/ecmascript/mem/heap.cpp index 3cc9bde8e2..a722a51b83 100644 --- a/ecmascript/mem/heap.cpp +++ b/ecmascript/mem/heap.cpp @@ -2017,7 +2017,7 @@ void Heap::NotifyMemoryPressure(bool inHighMemoryPressure) void Heap::NotifyFinishColdStart(bool isMainThread) { - if (!SetOnStartupEvent(false)) { + if (!FinishStartupEvent()) { return; } ASSERT(!OnStartupEvent()); diff --git a/ecmascript/mem/heap.h b/ecmascript/mem/heap.h index 70e69326b3..3dcd17f22f 100644 --- a/ecmascript/mem/heap.h +++ b/ecmascript/mem/heap.h @@ -132,10 +132,12 @@ public: virtual AppSensitiveStatus GetSensitiveStatus() const = 0; - virtual bool SetOnStartupEvent(bool startup) = 0; + virtual bool FinishStartupEvent() = 0; virtual bool OnStartupEvent() const = 0; + virtual void NotifyPostFork() = 0; + virtual void TryTriggerIdleCollection() = 0; virtual void TryTriggerIncrementalMarking() = 0; @@ -459,10 +461,13 @@ public: return smartGCStats_.sensitiveStatus_; } - bool SetOnStartupEvent(bool onStartup) override + bool FinishStartupEvent() override { LockHolder lock(smartGCStats_.sensitiveStatusMutex_); - smartGCStats_.onStartupEvent_ = onStartup; + if (!smartGCStats_.onStartupEvent_) { + return false; + } + smartGCStats_.onStartupEvent_ = false; if (!InSensitiveStatus()) { smartGCStats_.sensitiveStatusCV_.Signal(); } @@ -475,6 +480,12 @@ public: return smartGCStats_.onStartupEvent_; } + void NotifyPostFork() override + { + LockHolder lock(smartGCStats_.sensitiveStatusMutex_); + smartGCStats_.onStartupEvent_ = true; + } + void WaitSensitiveStatusFinished() { LockHolder lock(smartGCStats_.sensitiveStatusMutex_); @@ -1201,21 +1212,21 @@ public: return smartGCStats_.sensitiveStatus_.compare_exchange_strong(expect, status, std::memory_order_seq_cst); } - bool SetOnStartupEvent(bool onStartup) override + bool FinishStartupEvent() override { - sHeap_->SetOnStartupEvent(onStartup); - bool expect = OnStartupEvent(); - return smartGCStats_.onStartupEvent_.compare_exchange_strong(expect, onStartup, std::memory_order_release); + sHeap_->FinishStartupEvent(); + return smartGCStats_.onStartupEvent_.exchange(false, std::memory_order_relaxed) == true; } bool OnStartupEvent() const override { - return smartGCStats_.onStartupEvent_.load(std::memory_order_acquire); + return smartGCStats_.onStartupEvent_.load(std::memory_order_relaxed); } - void NotifyPostFork() + void NotifyPostFork() override { - smartGCStats_.onStartupEvent_.store(true, std::memory_order_release); + sHeap_->NotifyPostFork(); + smartGCStats_.onStartupEvent_.store(true, std::memory_order_relaxed); LOG_GC(INFO) << "SmartGC: enter app cold start"; } diff --git a/ecmascript/mem/rset_worklist_handler-inl.h b/ecmascript/mem/rset_worklist_handler-inl.h index e6294b6c1c..effc065d94 100644 --- a/ecmascript/mem/rset_worklist_handler-inl.h +++ b/ecmascript/mem/rset_worklist_handler-inl.h @@ -126,7 +126,7 @@ inline void RSetWorkListHandler::WaitFinishedThenMergeBack() inline bool RSetWorkListHandler::TryMergeBack() { - return (reinterpret_cast*>(&initialized_)->exchange(false) == true); + return reinterpret_cast*>(&initialized_)->exchange(false, std::memory_order_relaxed) == true; } inline void RSetWorkListHandler::MergeBackForAllItem() diff --git a/ecmascript/mem/shared_heap/shared_gc_marker.cpp b/ecmascript/mem/shared_heap/shared_gc_marker.cpp index 679362dd96..ee602f6d75 100644 --- a/ecmascript/mem/shared_heap/shared_gc_marker.cpp +++ b/ecmascript/mem/shared_heap/shared_gc_marker.cpp @@ -115,7 +115,7 @@ void SharedGCMarker::ProcessMarkStack(uint32_t threadId) auto cb = [&](ObjectSlot slot) { MarkValue(threadId, slot); }; - auto visitor = [this, threadId, cb](TaggedObject *root, ObjectSlot start, ObjectSlot end, + EcmaObjectRangeVisitor visitor = [this, threadId, cb](TaggedObject *root, ObjectSlot start, ObjectSlot end, VisitObjectArea area) { if (area == VisitObjectArea::IN_OBJECT) { if (VisitBodyInObj(root, start, end, cb)) {