| // Copyright 2013 The Flutter Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #ifndef LIB_TONIC_DART_WEAK_PERSISTENT_VALUE_H_ |
| #define LIB_TONIC_DART_WEAK_PERSISTENT_VALUE_H_ |
| |
| #include <memory> |
| |
| #include "third_party/dart/runtime/include/dart_api.h" |
| #include "tonic/common/macros.h" |
| |
| namespace tonic { |
| class DartState; |
| |
| // DartWeakPersistentValue is a bookkeeping class to help pair calls to |
| // Dart_NewWeakPersistentHandle with Dart_DeleteWeakPersistentHandle even in |
| // the case if IsolateGroup shutdown. Consider using this class instead of |
| // holding a Dart_PersistentHandle directly so that you don't leak the |
| // Dart_WeakPersistentHandle. |
| class DartWeakPersistentValue { |
| public: |
| DartWeakPersistentValue(); |
| ~DartWeakPersistentValue(); |
| |
| Dart_WeakPersistentHandle value() const { return handle_; } |
| bool is_empty() const { return handle_ == nullptr; } |
| |
| void Set(DartState* dart_state, |
| Dart_Handle object, |
| void* peer, |
| intptr_t external_allocation_size, |
| Dart_HandleFinalizer callback); |
| void Clear(); |
| Dart_Handle Get(); |
| |
| const std::weak_ptr<DartState>& dart_state() const { return dart_state_; } |
| |
| private: |
| std::weak_ptr<DartState> dart_state_; |
| Dart_WeakPersistentHandle handle_; |
| |
| TONIC_DISALLOW_COPY_AND_ASSIGN(DartWeakPersistentValue); |
| }; |
| |
| } // namespace tonic |
| |
| #endif // LIB_TONIC_DART_WEAK_PERSISTENT_VALUE_H_ |