Chromium Code Reviews| Index: src/isolate.h |
| diff --git a/src/isolate.h b/src/isolate.h |
| index ec52183cdf9c6ce009782ca847edafc218da96da..6e125f97c45cbcb49799115438283bc0ba8bbad1 100644 |
| --- a/src/isolate.h |
| +++ b/src/isolate.h |
| @@ -533,6 +533,8 @@ class Isolate { |
| // for legacy API reasons. |
| void TearDown(); |
| + void ReleaseManagedLifelines(); |
| + |
| static void GlobalTearDown(); |
| void ClearSerializerData(); |
| @@ -1208,6 +1210,39 @@ class Isolate { |
| void set_allow_atomics_wait(bool set) { allow_atomics_wait_ = set; } |
| bool allow_atomics_wait() { return allow_atomics_wait_; } |
| + // List of native heap values allocated by the runtime as part of its |
| + // implementation that must be freed at isolate deinit. |
| + class ManagedLifeline final { |
|
titzer
2017/02/21 09:30:08
Maybe a better name here? "Lifeline" feels like it
Mircea Trofin
2017/02/21 15:52:28
How about "NativeObjectLifetime{Manager|Handler}"
|
| + public: |
| + typedef void (*Deleter)(void*); |
| + void Dispose() { deleter_(value_); } |
| + |
| + private: |
| + friend class Isolate; |
| + |
| + ManagedLifeline() { |
| + DCHECK_EQ(reinterpret_cast<void*>(this), |
| + reinterpret_cast<void*>(&value_)); |
| + } |
| + |
| + // value_ must be the first member |
| + void* value_ = nullptr; |
| + Deleter deleter_ = nullptr; |
| + ManagedLifeline* prev_ = nullptr; |
| + ManagedLifeline* next_ = nullptr; |
| + }; |
| + |
| + // Register a native value for destruction at isolate teardown. |
| + ManagedLifeline* RegisterForReleaseAtTeardown( |
| + void* value, ManagedLifeline::Deleter deleter); |
| + |
| + // Unregister a previously registered value from release at |
| + // isolate teardown, deleting the ManagedLifeline. |
| + // This transfers the responsibility of the previously managed value's |
| + // deletion to the caller. Pass by pointer, because *lifeline_ptr gets |
| + // reset to nullptr. |
| + void UnregisterFromReleaseAtTeardown(ManagedLifeline** lifeline_ptr); |
| + |
| protected: |
| explicit Isolate(bool enable_serializer); |
| bool IsArrayOrObjectPrototype(Object* object); |
| @@ -1489,6 +1524,8 @@ class Isolate { |
| bool allow_atomics_wait_; |
| + ManagedLifeline managed_lifelines_root_; |
| + |
| size_t total_regexp_code_generated_; |
| friend class ExecutionAccess; |