mirror of
https://gitee.com/openharmony/arkcompiler_ets_runtime
synced 2024-10-06 23:54:03 +00:00
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:
parent
aa56134aeb
commit
745e0a9ebd
@ -79,7 +79,7 @@ void DaemonThread::WaitFinished()
|
||||
if (IsRunning()) {
|
||||
CheckAndPostTask(TerminateDaemonTask(nullptr));
|
||||
thread_->join();
|
||||
thread_.release();
|
||||
thread_.reset();
|
||||
Taskpool::GetCurrentTaskpool()->Destroy(GetThreadId());
|
||||
}
|
||||
ASSERT(!IsInRunningState());
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
@ -2017,7 +2017,7 @@ void Heap::NotifyMemoryPressure(bool inHighMemoryPressure)
|
||||
|
||||
void Heap::NotifyFinishColdStart(bool isMainThread)
|
||||
{
|
||||
if (!SetOnStartupEvent(false)) {
|
||||
if (!FinishStartupEvent()) {
|
||||
return;
|
||||
}
|
||||
ASSERT(!OnStartupEvent());
|
||||
|
@ -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";
|
||||
}
|
||||
|
||||
|
@ -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()
|
||||
|
@ -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)) {
|
||||
|
Loading…
Reference in New Issue
Block a user