Add TriggerConcurrentMarking in AllocateFromTlab

Issue:https://gitee.com/openharmony/arkcompiler_ets_runtime/issues/IAFAIR

Signed-off-by: chentianyu <chentianyu31@huawei.com>
Change-Id: Ia6881a8d2597b0ff598de62d1f0f7fea33743af7
This commit is contained in:
chentianyu 2024-07-24 16:23:46 +08:00
parent aa56134aeb
commit 745e0a9ebd
6 changed files with 47 additions and 30 deletions

View File

@ -79,7 +79,7 @@ void DaemonThread::WaitFinished()
if (IsRunning()) {
CheckAndPostTask(TerminateDaemonTask(nullptr));
thread_->join();
thread_.release();
thread_.reset();
Taskpool::GetCurrentTaskpool()->Destroy(GetThreadId());
}
ASSERT(!IsInRunningState());

View File

@ -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<Heap*>(thread->GetEcmaVM()->GetHeap())->AllocateSharedNonMovableSpaceFromTlab(thread, size);
if (object == nullptr) {
object = reinterpret_cast<TaggedObject *>(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<Heap*>(thread->GetEcmaVM()->GetHeap())->AllocateSharedNonMovableSpaceFromTlab(thread, size);
if (object == nullptr) {
object = reinterpret_cast<TaggedObject *>(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<Heap*>(thread->GetEcmaVM()->GetHeap())->AllocateSharedOldSpaceFromTlab(thread, size);
if (object == nullptr) {
object = reinterpret_cast<TaggedObject *>(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<Heap*>(thread->GetEcmaVM()->GetHeap())->AllocateSharedOldSpaceFromTlab(thread, size);
if (object == nullptr) {
object = reinterpret_cast<TaggedObject *>(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;
}

View File

@ -2017,7 +2017,7 @@ void Heap::NotifyMemoryPressure(bool inHighMemoryPressure)
void Heap::NotifyFinishColdStart(bool isMainThread)
{
if (!SetOnStartupEvent(false)) {
if (!FinishStartupEvent()) {
return;
}
ASSERT(!OnStartupEvent());

View File

@ -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";
}

View File

@ -126,7 +126,7 @@ inline void RSetWorkListHandler::WaitFinishedThenMergeBack()
inline bool RSetWorkListHandler::TryMergeBack()
{
return (reinterpret_cast<std::atomic<bool>*>(&initialized_)->exchange(false) == true);
return reinterpret_cast<std::atomic<bool>*>(&initialized_)->exchange(false, std::memory_order_relaxed) == true;
}
inline void RSetWorkListHandler::MergeBackForAllItem()

View File

@ -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)) {