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

Unified Diff: base/message_loop_proxy.h

Issue 7210053: Implementation of PostTaskAndReply() in MessageLoopProxy and BrowserThread. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: don't hang browserthread. Created 9 years, 4 months 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
« no previous file with comments | « base/message_loop.h ('k') | base/message_loop_proxy.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: base/message_loop_proxy.h
diff --git a/base/message_loop_proxy.h b/base/message_loop_proxy.h
index 9a856bf65ae3c5cecfb8c824344515aec340e2b6..d705f27dcc5076da9aceed9ee5a1c34f2a5b6a56 100644
--- a/base/message_loop_proxy.h
+++ b/base/message_loop_proxy.h
@@ -70,6 +70,24 @@ 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 simplifies logic when an operation needs to be executed on another
+ // thread, but processing of the result needs to occur on the current thread.
+ //
+ // Note that because of the lifetime guarantees on the |reply| Closure, it is
+ // perfectly valid to use a WeakPtr<> in the bound parameters for |reply|.
+ // This is useful if |reply| needs to be canceled on the originating thread
+ // while |task| may still be executing.
darin (slow to review) 2011/08/17 21:40:49 it might help to have some examples here of how yo
awong 2011/08/17 22:34:17 Added...but this comment is starting to get scaril
+ 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) {
@@ -103,6 +121,37 @@ struct MessageLoopProxyTraits {
}
};
+namespace internal {
darin (slow to review) 2011/08/17 21:40:49 this can be moved to the .cc file now.
awong 2011/08/17 22:34:17 Done.
+
+// This relay class remembers the MessageLoop that it was created on, and
+// ensures that both the |task| and |reply| Closures are deleted on this same
+// thread. Also, |task| is guaranteed to be deleted before |reply| is run or
+// deleted.
+//
+// If this is not possible because the originating MessageLoop is no longer
+// available, the the |task| and |reply| Closures are leaked. Leaking is
+// considered preferable to having a thread-safetey violations caused by
+// invoking the Closure destructor on the wrong thread.
+class PostTaskAndReplyRelay {
+ public:
+ PostTaskAndReplyRelay(const tracked_objects::Location& from_here,
+ const Closure& task, const Closure& reply);
+
+ ~PostTaskAndReplyRelay();
+
+ void Run();
+
+ private:
+ void RunReplyAndSelfDestruct();
+
+ tracked_objects::Location from_here_;
+ scoped_refptr<MessageLoopProxy> origin_loop_;
+ Closure reply_;
+ Closure task_;
+};
+
+} // namespace internal
+
} // namespace base
#endif // BASE_MESSAGE_LOOP_PROXY_H_
« no previous file with comments | « base/message_loop.h ('k') | base/message_loop_proxy.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698