| Index: Source/platform/heap/Handle.h
|
| diff --git a/Source/platform/heap/Handle.h b/Source/platform/heap/Handle.h
|
| index d3a1cc23de41db114edbae4e6c19e368a1bde476..a09cfe66b1447a061a6aa1d3680a55ed14c27ad3 100644
|
| --- a/Source/platform/heap/Handle.h
|
| +++ b/Source/platform/heap/Handle.h
|
| @@ -48,13 +48,17 @@
|
|
|
| namespace blink {
|
|
|
| -enum PersistentConfiguration {
|
| - NormalPersistentConfiguration,
|
| - WeakPersistentConfiguration,
|
| - CrossThreadPersistentConfiguration,
|
| +enum WeaknessPersistentConfiguration {
|
| + NonWeakPersistentConfiguration,
|
| + WeakPersistentConfiguration
|
| };
|
|
|
| -template<typename T, PersistentConfiguration persistentConfiguration>
|
| +enum CrossThreadnessPersistentConfiguration {
|
| + SingleThreadPersistentConfiguration,
|
| + CrossThreadPersistentConfiguration
|
| +};
|
| +
|
| +template<typename T, WeaknessPersistentConfiguration weaknessConfiguration, CrossThreadnessPersistentConfiguration crossThreadnessConfiguration>
|
| class PersistentBase {
|
| public:
|
| PersistentBase() : m_raw(nullptr)
|
| @@ -89,7 +93,7 @@ public:
|
| }
|
|
|
| template<typename U>
|
| - PersistentBase(const PersistentBase<U, persistentConfiguration>& other) : m_raw(other)
|
| + PersistentBase(const PersistentBase<U, weaknessConfiguration, crossThreadnessConfiguration>& other) : m_raw(other)
|
| {
|
| initialize();
|
| checkPointer();
|
| @@ -123,7 +127,7 @@ public:
|
| {
|
| static_assert(sizeof(T), "T must be fully defined");
|
| static_assert(IsGarbageCollectedType<T>::value, "T needs to be a garbage collected object");
|
| - if (persistentConfiguration == WeakPersistentConfiguration) {
|
| + if (weaknessConfiguration == WeakPersistentConfiguration) {
|
| visitor->registerWeakCell(&m_raw);
|
| } else {
|
| visitor->mark(m_raw);
|
| @@ -169,7 +173,7 @@ public:
|
| }
|
|
|
| template<typename U>
|
| - PersistentBase& operator=(const PersistentBase<U, persistentConfiguration>& other)
|
| + PersistentBase& operator=(const PersistentBase<U, weaknessConfiguration, crossThreadnessConfiguration>& other)
|
| {
|
| m_raw = other;
|
| checkPointer();
|
| @@ -200,8 +204,8 @@ private:
|
| NO_LAZY_SWEEP_SANITIZE_ADDRESS
|
| void initialize()
|
| {
|
| - TraceCallback traceCallback = TraceMethodDelegate<PersistentBase<T, persistentConfiguration>, &PersistentBase<T, persistentConfiguration>::trace>::trampoline;
|
| - if (persistentConfiguration == CrossThreadPersistentConfiguration) {
|
| + TraceCallback traceCallback = TraceMethodDelegate<PersistentBase<T, weaknessConfiguration, crossThreadnessConfiguration>, &PersistentBase<T, weaknessConfiguration, crossThreadnessConfiguration>::trace>::trampoline;
|
| + if (crossThreadnessConfiguration == CrossThreadPersistentConfiguration) {
|
| m_persistentNode = ThreadState::crossThreadPersistentRegion().allocatePersistentNode(this, traceCallback);
|
| } else {
|
| ThreadState* state = ThreadStateFor<ThreadingTrait<T>::Affinity>::state();
|
| @@ -216,7 +220,7 @@ private:
|
|
|
| void uninitialize()
|
| {
|
| - if (persistentConfiguration == CrossThreadPersistentConfiguration) {
|
| + if (crossThreadnessConfiguration == CrossThreadPersistentConfiguration) {
|
| ThreadState::crossThreadPersistentRegion().freePersistentNode(m_persistentNode);
|
| } else {
|
| ThreadState* state = ThreadStateFor<ThreadingTrait<T>::Affinity>::state();
|
| @@ -272,8 +276,8 @@ private:
|
| //
|
| // We have to construct and destruct Persistent in the same thread.
|
| template<typename T>
|
| -class Persistent : public PersistentBase<T, NormalPersistentConfiguration> {
|
| - typedef PersistentBase<T, NormalPersistentConfiguration> Parent;
|
| +class Persistent : public PersistentBase<T, NonWeakPersistentConfiguration, SingleThreadPersistentConfiguration> {
|
| + typedef PersistentBase<T, NonWeakPersistentConfiguration, SingleThreadPersistentConfiguration> Parent;
|
| public:
|
| Persistent() : Parent() { }
|
| Persistent(std::nullptr_t) : Parent(nullptr) { }
|
| @@ -300,8 +304,8 @@ public:
|
| // HashSet<WeakPersistent<T>> m_set; // wrong
|
| // PersistentHeapHashSet<WeakMember<T>> m_set; // correct
|
| template<typename T>
|
| -class WeakPersistent : public PersistentBase<T, WeakPersistentConfiguration> {
|
| - typedef PersistentBase<T, WeakPersistentConfiguration> Parent;
|
| +class WeakPersistent : public PersistentBase<T, WeakPersistentConfiguration, SingleThreadPersistentConfiguration> {
|
| + typedef PersistentBase<T, WeakPersistentConfiguration, SingleThreadPersistentConfiguration> Parent;
|
| public:
|
| WeakPersistent() : Parent() { }
|
| WeakPersistent(std::nullptr_t) : Parent(nullptr) { }
|
| @@ -319,8 +323,8 @@ public:
|
| // Unlike Persistent, we can destruct a CrossThreadPersistent in a thread
|
| // different from the construction thread.
|
| template<typename T>
|
| -class CrossThreadPersistent : public PersistentBase<T, CrossThreadPersistentConfiguration> {
|
| - typedef PersistentBase<T, CrossThreadPersistentConfiguration> Parent;
|
| +class CrossThreadPersistent : public PersistentBase<T, NonWeakPersistentConfiguration, CrossThreadPersistentConfiguration> {
|
| + typedef PersistentBase<T, NonWeakPersistentConfiguration, CrossThreadPersistentConfiguration> Parent;
|
| public:
|
| CrossThreadPersistent() : Parent() { }
|
| CrossThreadPersistent(std::nullptr_t) : Parent(nullptr) { }
|
| @@ -335,6 +339,23 @@ public:
|
| CrossThreadPersistent(const RawPtr<U>& other) : Parent(other.get()) { }
|
| };
|
|
|
| +template<typename T>
|
| +class CrossThreadWeakPersistent : public PersistentBase<T, WeakPersistentConfiguration, CrossThreadPersistentConfiguration> {
|
| + typedef PersistentBase<T, WeakPersistentConfiguration, CrossThreadPersistentConfiguration> Parent;
|
| +public:
|
| + CrossThreadWeakPersistent() : Parent() { }
|
| + CrossThreadWeakPersistent(std::nullptr_t) : Parent(nullptr) { }
|
| + CrossThreadWeakPersistent(T* raw) : Parent(raw) { }
|
| + CrossThreadWeakPersistent(T& raw) : Parent(raw) { }
|
| + CrossThreadWeakPersistent(const CrossThreadWeakPersistent& other) : Parent(other) { }
|
| + template<typename U>
|
| + CrossThreadWeakPersistent(const CrossThreadWeakPersistent<U>& other) : Parent(other) { }
|
| + template<typename U>
|
| + CrossThreadWeakPersistent(const Member<U>& other) : Parent(other) { }
|
| + template<typename U>
|
| + CrossThreadWeakPersistent(const RawPtr<U>& other) : Parent(other.get()) { }
|
| +};
|
| +
|
| // PersistentNode must be the left-most class to let the
|
| // visitor->trace(static_cast<Collection*>(this)) trace the correct position.
|
| // FIXME: derive affinity based on the collection.
|
|
|