Index: base/callback_internal.h |
=================================================================== |
--- base/callback_internal.h (revision 114494) |
+++ base/callback_internal.h (working copy) |
@@ -29,6 +29,29 @@ |
virtual ~BindStateBase() {} |
}; |
+// This structure exists purely to pass the returned |bind_state_| from |
+// Bind() to Callback while avoiding an extra AddRef/Release() pair. |
+// |
+// To do this, the constructor of Callback<> must take a const-ref. The |
+// reference must be to a const object otherwise the compiler will emit a |
+// warning about taking a reference to a temporary. |
+// |
+// Unfortunately, this means that the internal |bind_state_| field must |
+// be made mutable. |
+template <typename T> |
+struct BindStateHolder { |
+ explicit BindStateHolder(T* bind_state) |
+ : bind_state_(bind_state) { |
+ } |
+ |
+ mutable scoped_refptr<BindStateBase> bind_state_; |
+}; |
+ |
+template <typename T> |
+BindStateHolder<T> MakeBindStateHolder(T* o) { |
+ return BindStateHolder<T>(o); |
+} |
+ |
// Holds the Callback methods that don't require specialization to reduce |
// template bloat. |
class BASE_EXPORT CallbackBase { |
@@ -49,11 +72,8 @@ |
// Returns true if this callback equals |other|. |other| may be null. |
bool Equals(const CallbackBase& other) const; |
- // Allow initializing of |bind_state_| via the constructor to avoid default |
- // initialization of the scoped_refptr. We do not also initialize |
- // |polymorphic_invoke_| here because doing a normal assignment in the |
- // derived Callback templates makes for much nicer compiler errors. |
- explicit CallbackBase(BindStateBase* bind_state); |
+ CallbackBase(InvokeFuncStorage polymorphic_invoke, |
+ scoped_refptr<BindStateBase>* bind_state); |
// Force the destructor to be instantiated inside this translation unit so |
// that our subclasses will not get inlined versions. Avoids more template |