| Index: src/isolate.cc
|
| diff --git a/src/isolate.cc b/src/isolate.cc
|
| index 38a26be1e29a70450d6d08460fbe0e7473b25244..5601a9db370ba723ba468aa2d9623016372933e6 100644
|
| --- a/src/isolate.cc
|
| +++ b/src/isolate.cc
|
| @@ -2030,6 +2030,44 @@ Isolate::ThreadDataTable::~ThreadDataTable() {
|
| // DCHECK_NULL(list_);
|
| }
|
|
|
| +void Isolate::ReleaseManagedLifelines() {
|
| + for (Isolate::ManagedLifeline* current = managed_lifelines_root_.next_;
|
| + current != nullptr;) {
|
| + Isolate::ManagedLifeline* next = current->next_;
|
| + current->Dispose();
|
| + delete current;
|
| + current = next;
|
| + }
|
| +}
|
| +
|
| +Isolate::ManagedLifeline* Isolate::RegisterForReleaseAtTeardown(
|
| + void* value, Isolate::ManagedLifeline::Deleter deleter) {
|
| + DCHECK_NOT_NULL(value);
|
| + DCHECK_NOT_NULL(deleter);
|
| +
|
| + Isolate::ManagedLifeline* ret = new Isolate::ManagedLifeline();
|
| + ret->value_ = value;
|
| + ret->deleter_ = deleter;
|
| + // Insert at head. We keep the head alive for the lifetime of the Isolate
|
| + // because otherwise we can't reset the head, should we delete it before
|
| + // the isolate expires
|
| + Isolate::ManagedLifeline* next = managed_lifelines_root_.next_;
|
| + managed_lifelines_root_.next_ = ret;
|
| + ret->prev_ = &managed_lifelines_root_;
|
| + ret->next_ = next;
|
| + if (next != nullptr) next->prev_ = ret;
|
| + return ret;
|
| +}
|
| +
|
| +void Isolate::UnregisterFromReleaseAtTeardown(
|
| + Isolate::ManagedLifeline*& lifeline) {
|
| + DCHECK_NOT_NULL(lifeline->prev_);
|
| +
|
| + lifeline->prev_->next_ = lifeline->next_;
|
| + if (lifeline->next_ != nullptr) lifeline->next_->prev_ = lifeline->prev_;
|
| + delete lifeline;
|
| + lifeline = nullptr;
|
| +}
|
|
|
| Isolate::PerIsolateThreadData::~PerIsolateThreadData() {
|
| #if defined(USE_SIMULATOR)
|
| @@ -2399,6 +2437,7 @@ void Isolate::Deinit() {
|
| root_index_map_ = NULL;
|
|
|
| ClearSerializerData();
|
| + ReleaseManagedLifelines();
|
| }
|
|
|
|
|
|
|