Commit bcfc2024 authored by Michael Lippautz's avatar Michael Lippautz Committed by Chromium LUCI CQ

base,heap: Introduce MaybeValidTrait

Funnel MaybeValid() through a trait instead of imposing an API on the
receiver.

This allows us to avoid implementing a MaybeValid() API on Persistents
in the Oilpan library.

Bug: 1056170
Change-Id: I05f2497a6a10a8324980e5b82b4c40c785af8331
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2642680
Commit-Queue: Michael Lippautz <mlippautz@chromium.org>
Reviewed-by: default avatarGabriel Charette <gab@chromium.org>
Reviewed-by: default avatarOmer Katz <omerkatz@chromium.org>
Cr-Commit-Position: refs/heads/master@{#845677}
parent aee9c152
......@@ -980,6 +980,16 @@ struct IsWeakReceiver<std::reference_wrapper<T>> : IsWeakReceiver<T> {};
template <typename T>
struct IsWeakReceiver<WeakPtr<T>> : std::true_type {};
// An injection point to control how objects are checked for maybe validity,
// which is an optimistic thread-safe check for full validity.
template <typename>
struct MaybeValidTraits {
template <typename T>
static bool MaybeValid(const T& o) {
return o.MaybeValid();
}
};
// An injection point to control how bound objects passed to the target
// function. BindUnwrapTraits<>::Unwrap() is called for each bound objects right
// before the target function is invoked.
......@@ -1055,7 +1065,7 @@ struct CallbackCancellationTraits<
static bool MaybeValid(const Functor&,
const Receiver& receiver,
const Args&...) {
return receiver.MaybeValid();
return MaybeValidTraits<Receiver>::MaybeValid(receiver);
}
};
......@@ -1072,7 +1082,7 @@ struct CallbackCancellationTraits<OnceCallback<Signature>,
template <typename Functor>
static bool MaybeValid(const Functor& functor, const BoundArgs&...) {
return functor.MaybeValid();
return MaybeValidTraits<Functor>::MaybeValid(functor);
}
};
......@@ -1088,7 +1098,7 @@ struct CallbackCancellationTraits<RepeatingCallback<Signature>,
template <typename Functor>
static bool MaybeValid(const Functor& functor, const BoundArgs&...) {
return functor.MaybeValid();
return MaybeValidTraits<Functor>::MaybeValid(functor);
}
};
......
......@@ -72,10 +72,6 @@ class PersistentBase {
return raw_;
}
// TODO(https://crbug.com/653394): Consider returning a thread-safe best
// guess of validity.
bool MaybeValid() const { return true; }
explicit operator bool() const { return Get(); }
T& operator*() const { return *Get(); }
operator T*() const { return Get(); }
......
......@@ -145,6 +145,20 @@ struct BindUnwrapTraits<blink::CrossThreadWeakPersistent<T>> {
}
};
// TODO(https://crbug.com/653394): Consider returning a thread-safe best
// guess of validity. MaybeValid() can be invoked from an arbitrary thread.
template <typename T>
struct MaybeValidTraits<blink::WeakPersistent<T>> {
static bool MaybeValid(const blink::WeakPersistent<T>& p) { return true; }
};
template <typename T>
struct MaybeValidTraits<blink::CrossThreadWeakPersistent<T>> {
static bool MaybeValid(const blink::CrossThreadWeakPersistent<T>& p) {
return true;
}
};
} // namespace base
#endif // THIRD_PARTY_BLINK_RENDERER_PLATFORM_HEAP_PERSISTENT_H_
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment