Index: src/serialize.cc |
diff --git a/src/serialize.cc b/src/serialize.cc |
index b271fa2a0fdb50adbf02daa4d45ebe394905291a..96d017d522b0a21f672becdafb188880fbf455d4 100644 |
--- a/src/serialize.cc |
+++ b/src/serialize.cc |
@@ -649,10 +649,8 @@ ExternalReferenceDecoder::~ExternalReferenceDecoder() { |
DeleteArray(encodings_); |
} |
- |
-bool Serializer::serialization_enabled_ = false; |
-bool Serializer::too_late_to_enable_now_ = false; |
- |
+SerializationState Serializer::serialization_state_ = SERIALIZER_STATE_DISABLED; |
+Mutex Serializer::serialization_mutex_; |
class CodeAddressMap: public CodeEventLogger { |
public: |
@@ -766,19 +764,28 @@ CodeAddressMap* Serializer::code_address_map_ = NULL; |
void Serializer::Enable(Isolate* isolate) { |
- if (!serialization_enabled_) { |
- ASSERT(!too_late_to_enable_now_); |
- } |
- if (serialization_enabled_) return; |
- serialization_enabled_ = true; |
+ LockGuard<Mutex> lock_guard(&serialization_mutex_); |
+ // Check again under the lock. |
+ if (enabled()) return; |
+ |
+ ASSERT(!IsPermanentlyDisabled()); |
+ |
+ serialization_state_ = SERIALIZER_STATE_ENABLED; |
+ |
isolate->InitializeLoggingAndCounters(); |
code_address_map_ = new CodeAddressMap(isolate); |
} |
void Serializer::Disable() { |
- if (!serialization_enabled_) return; |
- serialization_enabled_ = false; |
+ LockGuard<Mutex> lock_guard(&serialization_mutex_); |
+ if (!enabled()) { |
+ ASSERT(code_address_map_ == NULL); |
+ return; |
+ } |
+ if (serialization_state_ != SERIALIZER_STATE_PERMANENTLY_DISABLED) { |
+ serialization_state_ = SERIALIZER_STATE_DISABLED; |
+ } |
delete code_address_map_; |
code_address_map_ = NULL; |
} |