Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(124)

Unified Diff: src/isolate.h

Issue 2676513008: [wasm] Managed<T> ensures T's lifetime does not leak past Isolate's (Closed)
Patch Set: Comments Created 3 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « BUILD.gn ('k') | src/isolate.cc » ('j') | src/isolate.cc » ('J')
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/isolate.h
diff --git a/src/isolate.h b/src/isolate.h
index 489bf2c9df77536df1be12f67e2255fda952e044..d22659dc5f12119de942828aabab2a3c0e2a3592 100644
--- a/src/isolate.h
+++ b/src/isolate.h
@@ -531,6 +531,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 {
+ 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.
+ void UnregisterFromReleaseAtTeardown(ManagedLifeline*& lifeline);
+
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;
« no previous file with comments | « BUILD.gn ('k') | src/isolate.cc » ('j') | src/isolate.cc » ('J')

Powered by Google App Engine
This is Rietveld 408576698