| Index: src/serialize.cc
|
| diff --git a/src/serialize.cc b/src/serialize.cc
|
| index 2b43c0ee69a9f09ed972f815727a549d63a8ddd1..526e0292335128b9eb67ecce69bb32b591558991 100644
|
| --- a/src/serialize.cc
|
| +++ b/src/serialize.cc
|
| @@ -613,7 +613,6 @@ ExternalReferenceDecoder::~ExternalReferenceDecoder() {
|
| DeleteArray(encodings_);
|
| }
|
|
|
| -AtomicWord Serializer::serialization_state_ = SERIALIZER_STATE_UNINITIALIZED;
|
|
|
| class CodeAddressMap: public CodeEventLogger {
|
| public:
|
| @@ -723,48 +722,6 @@ class CodeAddressMap: public CodeEventLogger {
|
| };
|
|
|
|
|
| -CodeAddressMap* Serializer::code_address_map_ = NULL;
|
| -
|
| -
|
| -void Serializer::RequestEnable(Isolate* isolate) {
|
| - isolate->InitializeLoggingAndCounters();
|
| - code_address_map_ = new CodeAddressMap(isolate);
|
| -}
|
| -
|
| -
|
| -void Serializer::InitializeOncePerProcess() {
|
| - // InitializeOncePerProcess is called by V8::InitializeOncePerProcess, a
|
| - // method guaranteed to be called only once in a process lifetime.
|
| - // serialization_state_ is read by many threads, hence the use of
|
| - // Atomic primitives. Here, we don't need a barrier or mutex to
|
| - // write it because V8 initialization is done by one thread, and gates
|
| - // all reads of serialization_state_.
|
| - ASSERT(NoBarrier_Load(&serialization_state_) ==
|
| - SERIALIZER_STATE_UNINITIALIZED);
|
| - SerializationState state = code_address_map_
|
| - ? SERIALIZER_STATE_ENABLED
|
| - : SERIALIZER_STATE_DISABLED;
|
| - NoBarrier_Store(&serialization_state_, state);
|
| -}
|
| -
|
| -
|
| -void Serializer::TearDown() {
|
| - // TearDown is called by V8::TearDown() for the default isolate. It's safe
|
| - // to shut down the serializer by that point. Just to be safe, we restore
|
| - // serialization_state_ to uninitialized.
|
| - ASSERT(NoBarrier_Load(&serialization_state_) !=
|
| - SERIALIZER_STATE_UNINITIALIZED);
|
| - if (code_address_map_) {
|
| - ASSERT(NoBarrier_Load(&serialization_state_) ==
|
| - SERIALIZER_STATE_ENABLED);
|
| - delete code_address_map_;
|
| - code_address_map_ = NULL;
|
| - }
|
| -
|
| - NoBarrier_Store(&serialization_state_, SERIALIZER_STATE_UNINITIALIZED);
|
| -}
|
| -
|
| -
|
| Deserializer::Deserializer(SnapshotByteSource* source)
|
| : isolate_(NULL),
|
| source_(source),
|
| @@ -1262,7 +1219,8 @@ Serializer::Serializer(Isolate* isolate, SnapshotByteSink* sink)
|
| : isolate_(isolate),
|
| sink_(sink),
|
| external_reference_encoder_(new ExternalReferenceEncoder(isolate)),
|
| - root_index_wave_front_(0) {
|
| + root_index_wave_front_(0),
|
| + code_address_map_(NULL) {
|
| // The serializer is meant to be used only to generate initial heap images
|
| // from a context in which there is only one isolate.
|
| for (int i = 0; i <= LAST_SPACE; i++) {
|
| @@ -1273,6 +1231,7 @@ Serializer::Serializer(Isolate* isolate, SnapshotByteSink* sink)
|
|
|
| Serializer::~Serializer() {
|
| delete external_reference_encoder_;
|
| + if (code_address_map_ != NULL) delete code_address_map_;
|
| }
|
|
|
|
|
| @@ -1338,7 +1297,7 @@ void Serializer::VisitPointers(Object** start, Object** end) {
|
| // deserialized objects.
|
| void SerializerDeserializer::Iterate(Isolate* isolate,
|
| ObjectVisitor* visitor) {
|
| - if (Serializer::enabled(isolate)) return;
|
| + if (isolate->serializer_enabled()) return;
|
| for (int i = 0; ; i++) {
|
| if (isolate->serialize_partial_snapshot_cache_length() <= i) {
|
| // Extend the array ready to get a value from the visitor when
|
| @@ -1578,12 +1537,14 @@ void Serializer::ObjectSerializer::Serialize() {
|
| "ObjectSerialization");
|
| sink_->PutInt(size >> kObjectAlignmentBits, "Size in words");
|
|
|
| - ASSERT(code_address_map_);
|
| - const char* code_name = code_address_map_->Lookup(object_->address());
|
| - LOG(serializer_->isolate_,
|
| - CodeNameEvent(object_->address(), sink_->Position(), code_name));
|
| - LOG(serializer_->isolate_,
|
| - SnapshotPositionEvent(object_->address(), sink_->Position()));
|
| + if (serializer_->code_address_map_) {
|
| + const char* code_name =
|
| + serializer_->code_address_map_->Lookup(object_->address());
|
| + LOG(serializer_->isolate_,
|
| + CodeNameEvent(object_->address(), sink_->Position(), code_name));
|
| + LOG(serializer_->isolate_,
|
| + SnapshotPositionEvent(object_->address(), sink_->Position()));
|
| + }
|
|
|
| // Mark this object as already serialized.
|
| int offset = serializer_->Allocate(space, size);
|
| @@ -1863,6 +1824,12 @@ void Serializer::Pad() {
|
| }
|
|
|
|
|
| +void Serializer::InitializeCodeAddressMap() {
|
| + isolate_->InitializeLoggingAndCounters();
|
| + code_address_map_ = new CodeAddressMap(isolate_);
|
| +}
|
| +
|
| +
|
| bool SnapshotByteSource::AtEOF() {
|
| if (0u + length_ - position_ > 2 * sizeof(uint32_t)) return false;
|
| for (int x = position_; x < length_; x++) {
|
|
|