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

Unified Diff: base/bind_helpers.h

Issue 2487493004: Support external task cancellation mechanisms in base::Callback::IsCancelled (Closed)
Patch Set: . Created 4 years, 1 month 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: base/bind_helpers.h
diff --git a/base/bind_helpers.h b/base/bind_helpers.h
index c7c7be8ee840a7b52206787fa8f717dcc4de4e30..1902341324e1c0bf42429191b522ef366df8239d 100644
--- a/base/bind_helpers.h
+++ b/base/bind_helpers.h
@@ -179,6 +179,9 @@ struct BindUnwrapTraits;
namespace internal {
+template <typename Functor, typename SFINAE = void>
+struct FunctorTraits;
+
template <typename T>
class UnretainedWrapper {
public:
@@ -521,6 +524,47 @@ struct BindUnwrapTraits<internal::PassedWrapper<T>> {
}
};
+// An injection point to support Callback::IsCancelled in a specific form of
+// base::Bind.
+// Specialize BindCancellationChecker to support Callback::IsCancelled, set
+// is_cancellable to true in the specialization, and implement Run() method.
+// BindCancellationChecker<>::Run() should return true if the resulting callback
+// is cancelled.
+template <typename Functor, typename BoundArgsTuple, typename SFINAE = void>
+struct BindCancellationChecker {
dcheng 2016/11/10 06:29:23 My main thoughts are around naming. Most of our i
tzik 2016/11/10 07:21:14 Done.
+ static constexpr bool is_cancellable = false;
+};
+
+// Specialization for method bound to weak pointer receiver.
+template <typename Functor, typename... BoundArgs>
+struct BindCancellationChecker<Functor,
+ std::tuple<BoundArgs...>,
+ typename std::enable_if<internal::IsWeakMethod<
+ internal::FunctorTraits<Functor>::is_method,
+ BoundArgs...>::value>::type> {
+ static constexpr bool is_cancellable = true;
+
+ template <typename Receiver, typename... Args>
+ static bool Run(const Functor&, const Receiver& receiver, const Args&...) {
dcheng 2016/11/10 06:29:23 Similarly, I think calling this Run() is a bit con
tzik 2016/11/10 07:21:14 Done.
+ return !receiver;
+ }
+};
+
+// Specialization for a nested bind.
+template <typename Signature,
+ typename... BoundArgs,
+ internal::CopyMode copy_mode,
+ internal::RepeatMode repeat_mode>
+struct BindCancellationChecker<Callback<Signature, copy_mode, repeat_mode>,
+ std::tuple<BoundArgs...>> {
+ static constexpr bool is_cancellable = true;
+
+ template <typename Functor>
+ static bool Run(const Functor& functor, const BoundArgs&...) {
+ return functor.IsCancelled();
+ }
+};
+
} // namespace base
#endif // BASE_BIND_HELPERS_H_
« no previous file with comments | « no previous file | base/bind_internal.h » ('j') | third_party/WebKit/Source/platform/scheduler/test/fake_web_task_runner.cc » ('J')

Powered by Google App Engine
This is Rietveld 408576698