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

Unified Diff: runtime/vm/dart_api_state.h

Issue 2012973002: Background finalization. (Closed) Base URL: git@github.com:dart-lang/sdk.git@master
Patch Set: Created 4 years, 7 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
Index: runtime/vm/dart_api_state.h
diff --git a/runtime/vm/dart_api_state.h b/runtime/vm/dart_api_state.h
index b510377352cdc294d017c4922a86bd2e052e0c5f..1fb92a9893f7156e2cd98d27ca0ef4c95bed3cd1 100644
--- a/runtime/vm/dart_api_state.h
+++ b/runtime/vm/dart_api_state.h
@@ -227,11 +227,16 @@ class FinalizablePersistentHandle {
}
// Called when the referent becomes unreachable.
- void UpdateUnreachable(Isolate* isolate) {
+ void UpdateUnreachableFinalizeNow(Isolate* isolate) {
EnsureFreeExternal(isolate);
Finalize(isolate, this);
}
+ void UpdateUnreachableFinalizeLater(Isolate* isolate) {
+ EnsureFreeExternal(isolate);
+ MarkForFinalization();
+ }
siva 2016/06/02 20:18:05 Maybe more readable as void UpdateUnreachable(Iso
rmacnak 2016/06/03 01:08:30 Yes, I like that better.
+
// Called when the referent has moved, potentially between generations.
void UpdateRelocated(Isolate* isolate) {
if (IsSetNewSpaceBit() && (SpaceForExternal() == Heap::kOld)) {
@@ -299,6 +304,11 @@ class FinalizablePersistentHandle {
callback_ = NULL;
}
+ void MarkForFinalization() {
+ raw_ = Object::null();
+ ASSERT(callback_ != NULL);
+ }
+
void set_raw(RawObject* raw) { raw_ = raw; }
void set_raw(const LocalHandle& ref) { raw_ = ref.raw(); }
void set_raw(const Object& object) { raw_ = object.raw(); }
@@ -333,10 +343,13 @@ class FinalizablePersistentHandle {
Heap::kNew : Heap::kOld;
}
+ friend class BackgroundFinalizer;
+
RawObject* raw_;
void* peer_;
uword external_data_;
Dart_WeakPersistentHandleFinalizer callback_;
+
DISALLOW_ALLOCATION(); // Allocated through AllocateHandle methods.
DISALLOW_COPY_AND_ASSIGN(FinalizablePersistentHandle);
};
@@ -501,9 +514,11 @@ class FinalizablePersistentHandles
: Handles<kFinalizablePersistentHandleSizeInWords,
kFinalizablePersistentHandlesPerChunk,
kOffsetOfRawPtrInFinalizablePersistentHandle>(),
- free_list_(NULL) { }
+ free_list_(NULL), mutex_(new Mutex()) { }
~FinalizablePersistentHandles() {
free_list_ = NULL;
+ delete mutex_;
+ mutex_ = NULL;
}
// Accessors.
@@ -529,6 +544,7 @@ class FinalizablePersistentHandles
// Allocates a persistent handle, these have to be destroyed explicitly
// by calling FreeHandle.
FinalizablePersistentHandle* AllocateHandle() {
+ MutexLocker ml(mutex_);
FinalizablePersistentHandle* handle;
if (free_list_ != NULL) {
handle = free_list_;
@@ -543,12 +559,14 @@ class FinalizablePersistentHandles
}
void FreeHandle(FinalizablePersistentHandle* handle) {
+ MutexLocker ml(mutex_);
handle->FreeHandle(free_list());
set_free_list(handle);
}
// Validate if passed in handle is a Persistent Handle.
bool IsValidHandle(Dart_WeakPersistentHandle object) const {
+ MutexLocker ml(mutex_);
return IsValidScopedHandle(reinterpret_cast<uword>(object));
}
@@ -559,6 +577,7 @@ class FinalizablePersistentHandles
private:
FinalizablePersistentHandle* free_list_;
+ Mutex* mutex_;
DISALLOW_COPY_AND_ASSIGN(FinalizablePersistentHandles);
};

Powered by Google App Engine
This is Rietveld 408576698