Index: runtime/vm/snapshot.cc |
diff --git a/runtime/vm/snapshot.cc b/runtime/vm/snapshot.cc |
index a566bc97f4a2bbe842057cc6a9f835674d02ce5e..391c9fc14e10c746c886084654300493d496eba4 100644 |
--- a/runtime/vm/snapshot.cc |
+++ b/runtime/vm/snapshot.cc |
@@ -20,6 +20,11 @@ |
#include "vm/verified_memory.h" |
#include "vm/version.h" |
+// We currently only expect the Dart mutator to read snapshots. |
+#define ASSERT_NO_SAFEPOINT_SCOPE() \ |
+ isolate()->AssertCurrentThreadIsMutator(); \ |
+ ASSERT(Thread::Current()->no_safepoint_scope_depth() != 0) |
+ |
namespace dart { |
static const int kNumVmIsolateSnapshotReferences = 32 * KB; |
@@ -609,7 +614,7 @@ RawApiError* SnapshotReader::VerifyVersion() { |
#define ALLOC_NEW_OBJECT_WITH_LEN(type, length) \ |
ASSERT(kind_ == Snapshot::kFull); \ |
- ASSERT(isolate()->no_safepoint_scope_depth() != 0); \ |
+ ASSERT_NO_SAFEPOINT_SCOPE(); \ |
Raw##type* obj = reinterpret_cast<Raw##type*>( \ |
AllocateUninitialized(k##type##Cid, type::InstanceSize(length))); \ |
obj->StoreSmi(&(obj->ptr()->length_), Smi::New(length)); \ |
@@ -643,7 +648,7 @@ RawTypeArguments* SnapshotReader::NewTypeArguments(intptr_t len) { |
RawTokenStream* SnapshotReader::NewTokenStream(intptr_t len) { |
ASSERT(kind_ == Snapshot::kFull); |
- ASSERT(isolate()->no_safepoint_scope_depth() != 0); |
+ ASSERT_NO_SAFEPOINT_SCOPE(); |
stream_ = reinterpret_cast<RawTokenStream*>( |
AllocateUninitialized(kTokenStreamCid, TokenStream::InstanceSize())); |
uint8_t* array = const_cast<uint8_t*>(CurrentBufferAddress()); |
@@ -661,7 +666,7 @@ RawTokenStream* SnapshotReader::NewTokenStream(intptr_t len) { |
RawContext* SnapshotReader::NewContext(intptr_t num_variables) { |
ASSERT(kind_ == Snapshot::kFull); |
- ASSERT(isolate()->no_safepoint_scope_depth() != 0); |
+ ASSERT_NO_SAFEPOINT_SCOPE(); |
RawContext* obj = reinterpret_cast<RawContext*>( |
AllocateUninitialized(kContextCid, Context::InstanceSize(num_variables))); |
obj->ptr()->num_variables_ = num_variables; |
@@ -671,7 +676,7 @@ RawContext* SnapshotReader::NewContext(intptr_t num_variables) { |
RawClass* SnapshotReader::NewClass(intptr_t class_id) { |
ASSERT(kind_ == Snapshot::kFull); |
- ASSERT(isolate()->no_safepoint_scope_depth() != 0); |
+ ASSERT_NO_SAFEPOINT_SCOPE(); |
if (class_id < kNumPredefinedCids) { |
ASSERT((class_id >= kInstanceCid) && |
(class_id <= kNullCid)); |
@@ -690,7 +695,7 @@ RawClass* SnapshotReader::NewClass(intptr_t class_id) { |
RawInstance* SnapshotReader::NewInstance() { |
ASSERT(kind_ == Snapshot::kFull); |
- ASSERT(isolate()->no_safepoint_scope_depth() != 0); |
+ ASSERT_NO_SAFEPOINT_SCOPE(); |
RawInstance* obj = reinterpret_cast<RawInstance*>( |
AllocateUninitialized(kObjectCid, Instance::InstanceSize())); |
return obj; |
@@ -699,7 +704,7 @@ RawInstance* SnapshotReader::NewInstance() { |
RawMint* SnapshotReader::NewMint(int64_t value) { |
ASSERT(kind_ == Snapshot::kFull); |
- ASSERT(isolate()->no_safepoint_scope_depth() != 0); |
+ ASSERT_NO_SAFEPOINT_SCOPE(); |
RawMint* obj = reinterpret_cast<RawMint*>( |
AllocateUninitialized(kMintCid, Mint::InstanceSize())); |
obj->ptr()->value_ = value; |
@@ -709,7 +714,7 @@ RawMint* SnapshotReader::NewMint(int64_t value) { |
RawDouble* SnapshotReader::NewDouble(double value) { |
ASSERT(kind_ == Snapshot::kFull); |
- ASSERT(isolate()->no_safepoint_scope_depth() != 0); |
+ ASSERT_NO_SAFEPOINT_SCOPE(); |
RawDouble* obj = reinterpret_cast<RawDouble*>( |
AllocateUninitialized(kDoubleCid, Double::InstanceSize())); |
obj->ptr()->value_ = value; |
@@ -719,7 +724,7 @@ RawDouble* SnapshotReader::NewDouble(double value) { |
RawTypedData* SnapshotReader::NewTypedData(intptr_t class_id, intptr_t len) { |
ASSERT(kind_ == Snapshot::kFull); |
- ASSERT(isolate()->no_safepoint_scope_depth() != 0); |
+ ASSERT_NO_SAFEPOINT_SCOPE(); |
const intptr_t lengthInBytes = len * TypedData::ElementSizeInBytes(class_id); |
RawTypedData* obj = reinterpret_cast<RawTypedData*>( |
AllocateUninitialized(class_id, TypedData::InstanceSize(lengthInBytes))); |
@@ -730,7 +735,7 @@ RawTypedData* SnapshotReader::NewTypedData(intptr_t class_id, intptr_t len) { |
#define ALLOC_NEW_OBJECT(type) \ |
ASSERT(kind_ == Snapshot::kFull); \ |
- ASSERT(isolate()->no_safepoint_scope_depth() != 0); \ |
+ ASSERT_NO_SAFEPOINT_SCOPE(); \ |
return reinterpret_cast<Raw##type*>( \ |
AllocateUninitialized(k##type##Cid, type::InstanceSize())); \ |
@@ -828,7 +833,7 @@ RawGrowableObjectArray* SnapshotReader::NewGrowableObjectArray() { |
RawFloat32x4* SnapshotReader::NewFloat32x4(float v0, float v1, float v2, |
float v3) { |
ASSERT(kind_ == Snapshot::kFull); |
- ASSERT(isolate()->no_safepoint_scope_depth() != 0); |
+ ASSERT_NO_SAFEPOINT_SCOPE(); |
RawFloat32x4* obj = reinterpret_cast<RawFloat32x4*>( |
AllocateUninitialized(kFloat32x4Cid, Float32x4::InstanceSize())); |
obj->ptr()->value_[0] = v0; |
@@ -842,7 +847,7 @@ RawFloat32x4* SnapshotReader::NewFloat32x4(float v0, float v1, float v2, |
RawInt32x4* SnapshotReader::NewInt32x4(uint32_t v0, uint32_t v1, uint32_t v2, |
uint32_t v3) { |
ASSERT(kind_ == Snapshot::kFull); |
- ASSERT(isolate()->no_safepoint_scope_depth() != 0); |
+ ASSERT_NO_SAFEPOINT_SCOPE(); |
RawInt32x4* obj = reinterpret_cast<RawInt32x4*>( |
AllocateUninitialized(kInt32x4Cid, Int32x4::InstanceSize())); |
obj->ptr()->value_[0] = v0; |
@@ -855,7 +860,7 @@ RawInt32x4* SnapshotReader::NewInt32x4(uint32_t v0, uint32_t v1, uint32_t v2, |
RawFloat64x2* SnapshotReader::NewFloat64x2(double v0, double v1) { |
ASSERT(kind_ == Snapshot::kFull); |
- ASSERT(isolate()->no_safepoint_scope_depth() != 0); |
+ ASSERT_NO_SAFEPOINT_SCOPE(); |
RawFloat64x2* obj = reinterpret_cast<RawFloat64x2*>( |
AllocateUninitialized(kFloat64x2Cid, Float64x2::InstanceSize())); |
obj->ptr()->value_[0] = v0; |
@@ -914,7 +919,7 @@ intptr_t SnapshotReader::LookupInternalClass(intptr_t class_header) { |
RawObject* SnapshotReader::AllocateUninitialized(intptr_t class_id, |
intptr_t size) { |
- ASSERT(isolate()->no_safepoint_scope_depth() != 0); |
+ ASSERT_NO_SAFEPOINT_SCOPE(); |
ASSERT(Utils::IsAligned(size, kObjectAlignment)); |
// Allocate memory where all words look like smis. This is currently |
@@ -1703,14 +1708,15 @@ ForwardList::ForwardList(intptr_t first_object_id) |
first_unprocessed_object_id_(first_object_id) { |
// The ForwardList encodes information in the header tag word. There cannot |
// be any concurrent GC tasks while it is in use. |
- Isolate* isolate = Isolate::Current(); |
+ Thread* thread = Thread::Current(); |
+ Isolate* isolate = thread->isolate(); |
PageSpace* page_space = isolate->heap()->old_space(); |
MonitorLocker ml(page_space->tasks_lock()); |
while (page_space->tasks() > 0) { |
ml.Wait(); |
} |
// Ensure that no GC happens while we are writing out the full snapshot. |
- isolate->IncrementNoSafepointScopeDepth(); |
+ thread->IncrementNoSafepointScopeDepth(); |
} |
@@ -1769,7 +1775,7 @@ void ForwardList::UnmarkAll() const { |
raw->ptr()->tags_ = node->tags(); // Restore original tags. |
} |
} |
- Isolate::Current()->DecrementNoSafepointScopeDepth(); |
+ Thread::Current()->DecrementNoSafepointScopeDepth(); |
} |