19 OldMarkingStackBlockProcess,
27 NewMarkingStackBlockProcess,
34template <
int BlockSize>
37template <
int BlockSize>
40template <
int BlockSize>
42 global_empty_ =
new List();
43 if (global_mutex_ ==
nullptr) {
44 global_mutex_ =
new Mutex();
48template <
int BlockSize>
51 global_empty_ =
nullptr;
54template <
int BlockSize>
57template <
int BlockSize>
62template <
int BlockSize>
68 while (!full_.IsEmpty()) {
71 global_empty_->Push(block);
73 while (!partial_.IsEmpty()) {
76 global_empty_->Push(block);
82template <
int BlockSize>
85 while (!partial_.IsEmpty()) {
86 full_.Push(partial_.Pop());
88 return full_.PopAll();
91template <
int BlockSize>
93 while (block !=
nullptr) {
101template <
int BlockSize>
106 bool was_empty = IsEmptyLocked();
108 if (was_empty) ml.Notify();
111 global_empty_->Push(block);
115 bool was_empty = IsEmptyLocked();
116 partial_.Push(block);
117 if (was_empty) ml.Notify();
121template <
int BlockSize>
136 if (!full_.IsEmpty()) {
140 if (!partial_.IsEmpty()) {
142 return partial_.Pop();
145 if (num_busy->
load() == 0) {
172template <
int BlockSize>
177 if (!partial_.IsEmpty()) {
178 return partial_.Pop();
181 return PopEmptyBlock();
184template <
int BlockSize>
188 if (!global_empty_->IsEmpty()) {
189 return global_empty_->Pop();
195template <
int BlockSize>
199 if (!full_.IsEmpty()) {
201 }
else if (!partial_.IsEmpty()) {
202 return partial_.Pop();
208template <
int BlockSize>
211 return IsEmptyLocked();
214template <
int BlockSize>
216 return full_.IsEmpty() && partial_.IsEmpty();
219template <
int BlockSize>
226template <
int BlockSize>
229 head_ = head_->next_;
235template <
int BlockSize>
243template <
int BlockSize>
245 ASSERT(block->next_ ==
nullptr);
246 block->next_ = head_;
261template <
int BlockSize>
267 block = block->
next()) {
272template <
int BlockSize>
static float next(float f)
SkBlockAllocator::Block Block
SkIDChangeListener::List List
#define DEBUG_ASSERT(cond)
static void TrimGlobalEmpty()
Block * PopNonFullBlock()
static Mutex * global_mutex_
Block * WaitForWork(RelaxedAtomic< uintptr_t > *num_busy, bool abort)
static List * global_empty_
void PushAll(Block *blocks)
void VisitObjectPointers(ObjectPointerVisitor *visitor)
static constexpr intptr_t kMaxGlobalEmpty
void PushBlockImpl(Block *block)
Block * PopNonEmptyBlock()
StoreBuffer * store_buffer() const
Monitor::WaitResult Wait(int64_t millis=Monitor::kNoTimeout)
bool IsOwnedByCurrentThread() const
virtual void VisitPointers(ObjectPtr *first, ObjectPtr *last)=0
PointerBlock< Size > * next() const
void set_next(PointerBlock< Size > *next)
void VisitObjectPointers(ObjectPointerVisitor *visitor)
T load(std::memory_order order=std::memory_order_relaxed) const
T fetch_add(T arg, std::memory_order order=std::memory_order_relaxed)
T fetch_sub(T arg, std::memory_order order=std::memory_order_relaxed)
void PushBlock(Block *block, ThresholdPolicy policy)
void ScheduleInterrupts(uword interrupt_bits)
static Thread * Current()
void StoreBufferBlockProcess(StoreBuffer::ThresholdPolicy policy)
void OldMarkingStackBlockProcess()
IsolateGroup * isolate_group() const
void NewMarkingStackBlockProcess()
#define MSAN_UNPOISON(ptr, len)
DEFINE_LEAF_RUNTIME_ENTRY(void, StoreBufferBlockProcess, 1, Thread *thread)
it will be possible to load the file into Perfetto s trace viewer disable asset Prevents usage of any non test fonts unless they were explicitly Loaded via prefetched default font Indicates whether the embedding started a prefetch of the default font manager before creating the engine run In non interactive keep the shell running after the Dart script has completed enable serial On low power devices with low core running concurrent GC tasks on threads can cause them to contend with the UI thread which could potentially lead to jank This option turns off all concurrent GC activities domain network policy
#define END_LEAF_RUNTIME_ENTRY