Chromium Code Reviews| 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); |
| }; |