Index: base/message_loop_proxy.h |
diff --git a/base/message_loop_proxy.h b/base/message_loop_proxy.h |
index 9a856bf65ae3c5cecfb8c824344515aec340e2b6..decaa38f86bfe454d0a7f8857f5599e6ba2fbf87 100644 |
--- a/base/message_loop_proxy.h |
+++ b/base/message_loop_proxy.h |
@@ -70,6 +70,51 @@ class BASE_EXPORT MessageLoopProxy |
// this proxy represents. |
virtual bool BelongsToCurrentThread() = 0; |
+ // Executes |task| on the given MessageLoopProxy. On completion, |reply| |
+ // is passed back to the MessageLoopProxy for the thread that called |
+ // PostTaskAndReply(). Both |task| and |reply| are guaranteed to be deleted |
+ // on the thread from which PostTaskAndReply() is invoked. This allows |
+ // objects that must be deleted on the originating thread to be bound into the |
+ // |task| and |reply| Closures. In particular, it can be useful to use |
+ // WeakPtr<> in the |reply| Closure so that the reply operation can be |
+ // canceled. See the following pseudo-code: |
+ // |
+ // class DataBuffer : public RefCountedThreadSafe<DataBuffer> { |
+ // public: |
+ // // Called to add data into a buffer. |
+ // void AddData(void* buf, size_t length); |
+ // ... |
+ // }; |
+ // |
+ // |
+ // class DataLoader : public SupportsWeakPtr<ReadToBuffer> { |
+ // public: |
+ // void GetData() { |
+ // scoped_refptr<DataBuffer> buffer = new DataBuffer(); |
+ // target_thread_.message_loop_proxy()->PostTaskAndReply( |
+ // FROM_HERE, |
+ // base::Bind(&DataBuffer::AddData, buffer), |
+ // base::Bind(&DataLoader::OnDataReceived, AsWeakPtr(), buffer)); |
+ // } |
+ // |
+ // private: |
+ // void OnDataReceived(scoped_refptr<DataBuffer> buffer) { |
+ // // Do something with buffer. |
+ // } |
+ // }; |
+ // |
+ // |
+ // Things to notice: |
+ // * Results of |task| are shared with |reply| by binding a shared argument |
+ // (a DataBuffer instance). |
+ // * The DataLoader object has no special thread safety. |
+ // * The DataLoader object can be deleted while |task| is still running, |
+ // and the reply will cancel itself safely because it is bound to a |
+ // WeakPtr<>. |
+ bool PostTaskAndReply(const tracked_objects::Location& from_here, |
+ const Closure& task, |
+ const Closure& reply); |
+ |
template <class T> |
bool DeleteSoon(const tracked_objects::Location& from_here, |
T* object) { |