Index: runtime/vm/scavenger.h |
diff --git a/runtime/vm/scavenger.h b/runtime/vm/scavenger.h |
index fd4663de7decf7680a9cd26dc3581d2af389e295..4d35158ef392fa108c6c0ac52d3f01401f734a6b 100644 |
--- a/runtime/vm/scavenger.h |
+++ b/runtime/vm/scavenger.h |
@@ -123,14 +123,18 @@ class Scavenger { |
RawObject* FindObject(FindObjectVisitor* visitor) const; |
- uword TryAllocate(intptr_t size) { |
+ uword TryAllocate(intptr_t size) { return TryAllocateGC(size); } |
+ |
+ uword TryAllocateGC(intptr_t size) { |
ASSERT(Utils::IsAligned(size, kObjectAlignment)); |
ASSERT(heap_ != Dart::vm_isolate()->heap()); |
+ |
#if defined(DEBUG) |
if (FLAG_gc_at_alloc && !scavenging_) { |
Scavenge(); |
} |
#endif |
+ |
uword result = top_; |
intptr_t remaining = end_ - top_; |
if (remaining < size) { |
@@ -141,6 +145,39 @@ class Scavenger { |
top_ += size; |
ASSERT(to_->Contains(top_) || (top_ == to_->end())); |
+ |
+ return result; |
+ } |
+ |
+ uword TryAllocateInTLAB(Thread* thread, intptr_t size) { |
+ ASSERT(Utils::IsAligned(size, kObjectAlignment)); |
+ ASSERT(heap_ != Dart::vm_isolate()->heap()); |
+ |
+ ASSERT(thread->IsMutatorThread()); |
+ ASSERT(thread->heap() == heap_); |
+ |
+#if defined(DEBUG) |
+ if (FLAG_gc_at_alloc && !scavenging_) { |
+ Scavenge(); |
+ } |
+#endif |
+ |
+ uword top = thread->top(); |
+ uword end = thread->end(); |
+ |
+ uword result = top; |
+ intptr_t remaining = end - top; |
+ if (remaining < size) { |
+ return 0; |
+ } |
+ |
+ ASSERT(to_->Contains(result)); |
+ ASSERT((result & kObjectAlignmentMask) == object_alignment_); |
+ |
+ top += size; |
+ ASSERT(to_->Contains(top) || (top == to_->end())); |
+ |
+ thread->set_top(top); |
return result; |
} |
@@ -149,13 +186,20 @@ class Scavenger { |
void Scavenge(bool invoke_api_callbacks); |
// Promote all live objects. |
- void Evacuate(); |
+ void Evacuate(Thread* thread); |
// Accessors to generate code for inlined allocation. |
rmacnak
2017/07/12 17:10:22
Remove TopAddress and EndAddress.
danunez
2017/07/12 18:23:38
Done.
|
uword* TopAddress() { return &top_; } |
uword* EndAddress() { return &end_; } |
- static intptr_t top_offset() { return OFFSET_OF(Scavenger, top_); } |
- static intptr_t end_offset() { return OFFSET_OF(Scavenger, end_); } |
+ |
+ uword top() { return top_; } |
+ uword end() { return end_; } |
+ |
+ void set_top(uword value) { top_ = value; } |
+ void set_end(uword value) { |
+ ASSERT(to_->end() == value); |
+ end_ = value; |
+ } |
int64_t UsedInWords() const { |
return (top_ - FirstObjectStart()) >> kWordSizeLog2; |
@@ -192,6 +236,8 @@ class Scavenger { |
void AllocateExternal(intptr_t size); |
void FreeExternal(intptr_t size); |
+ void FlushTLS() const; |
+ |
private: |
// Ids for time and data records in Heap::GCStats. |
enum { |
@@ -231,14 +277,18 @@ class Scavenger { |
// not consume space in the to space they leave enough room for this stack. |
void PushToPromotedStack(uword addr) { |
ASSERT(scavenging_); |
+ |
rmacnak
2017/07/12 17:10:22
Remove spurious whitespace changes.
danunez
2017/07/12 18:23:38
Done.
|
end_ -= sizeof(addr); |
+ |
ASSERT(end_ > top_); |
*reinterpret_cast<uword*>(end_) = addr; |
} |
uword PopFromPromotedStack() { |
ASSERT(scavenging_); |
+ |
uword result = *reinterpret_cast<uword*>(end_); |
end_ += sizeof(result); |
+ |
ASSERT(end_ <= to_->end()); |
return result; |
} |
@@ -294,6 +344,7 @@ class Scavenger { |
intptr_t external_size_; |
bool failed_to_promote_; |
+ Mutex* space_lock_; |
friend class ScavengerVisitor; |
friend class ScavengerWeakVisitor; |