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

Side by Side Diff: base/task.cc

Issue 7210053: Implementation of PostTaskAndReply() in MessageLoopProxy and BrowserThread. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: missed something small Created 9 years, 5 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 unified diff | Download patch | Annotate | Revision Log
« base/task.h ('K') | « base/task.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "base/task.h" 5 #include "base/task.h"
6 6
7 #include "base/bind.h" 7 #include "base/bind.h"
8 #include "base/message_loop.h"
9 #include "base/message_loop_proxy.h"
8 10
9 Task::Task() { 11 Task::Task() {
10 } 12 }
11 13
12 Task::~Task() { 14 Task::~Task() {
13 } 15 }
14 16
15 CancelableTask::CancelableTask() { 17 CancelableTask::CancelableTask() {
16 } 18 }
17 19
18 CancelableTask::~CancelableTask() { 20 CancelableTask::~CancelableTask() {
19 } 21 }
20 22
21 namespace base { 23 namespace base {
22 24
25 namespace internal {
26
27 PostTaskAndReplyRelay::PostTaskAndReplyRelay(
28 const tracked_objects::Location& from_here,
29 const Closure& task,
30 const Closure& reply)
31 : from_here_(from_here),
32 origin_loop_(MessageLoopProxy::CreateForCurrentThread()) {
33 task_ = task;
34 reply_ = reply;
35 }
36
37 PostTaskAndReplyRelay::~PostTaskAndReplyRelay() {
38 DCHECK(origin_loop_->BelongsToCurrentThread());
39 }
40
41 void PostTaskAndReplyRelay::Run() {
42 task_.Run();
43 origin_loop_->PostTask(
44 from_here_,
45 Bind(&PostTaskAndReplyRelay::RunReplyAndSelfDestruct, this));
46 }
47
48 void PostTaskAndReplyRelay::RunReplyAndSelfDestruct() {
49 DCHECK(origin_loop_->BelongsToCurrentThread());
50 reply_.Run();
51
52 // Cue mission impossible theme.
53 //
54 // Even though PostTaskAndReplyRelay is refcounted, dropping the references
55 // here is preferable because it eliminates the chance that other tasks can
56 // interceed between the execution of reply_ and the destruction of the
57 // Closures.
58 task_.Reset();
59 reply_.Reset();
60 }
61
62 void PostTaskAndReplyRelay::DoManualDestruction(
63 const PostTaskAndReplyRelay* obj) {
64 obj->origin_loop_->DeleteSoon(obj->from_here_, obj);
65 }
66
67 } // namespace internal
68
23 ScopedTaskRunner::ScopedTaskRunner(Task* task) : task_(task) { 69 ScopedTaskRunner::ScopedTaskRunner(Task* task) : task_(task) {
24 } 70 }
25 71
26 ScopedTaskRunner::~ScopedTaskRunner() { 72 ScopedTaskRunner::~ScopedTaskRunner() {
27 if (task_) { 73 if (task_) {
28 task_->Run(); 74 task_->Run();
29 delete task_; 75 delete task_;
30 } 76 }
31 } 77 }
32 78
33 Task* ScopedTaskRunner::Release() { 79 Task* ScopedTaskRunner::Release() {
34 Task* tmp = task_; 80 Task* tmp = task_;
35 task_ = NULL; 81 task_ = NULL;
36 return tmp; 82 return tmp;
37 } 83 }
38 84
39 namespace internal { 85 void PostTaskAndReply(MessageLoop* loop,
willchan no longer on Chromium 2011/07/06 22:10:26 We should use MessageLoopProxy here.
awong 2011/08/15 22:07:55 New CL side-steps this issue.
40 86 const tracked_objects::Location& from_here,
41 PostTaskAndReplyRelay::PostTaskAndReplyRelay(const Closure& task, 87 const Closure& task,
42 const Closure& reply) 88 const Closure& reply) {
43 : task_(task), 89 internal::PostTaskAndReplyRelay* relay =
44 reply_(reply), 90 new internal::PostTaskAndReplyRelay(from_here, task, reply);
45 origin_loop_(MessageLoop::Current()) { 91 loop->PostTask(from_here,
92 Bind(&internal::PostTaskAndReplyRelay::Run, relay));
46 } 93 }
47 94
48 PostTaskAndReplyRelay::~PostTaskAndReplyRelay() {
49 DCHECK(origin_loop_ == MessageLoop::Current());
50 }
51
52 void PostTaskAndReplyRelay::Run() {
53 task_.Run();
54 origin_loop_->PostTask(
55 base::Bind(&PostTaskAndReplyRelay::RunReplyAndSelfDestruct,
56 base::Unretained(this)));
57 }
58
59 void PostTaskAndReplyRelay::RunReplyAndSelfDestruct() {
60 reply_.Run();
61 delete this;
62 }
63 } // namespace internal
64
65
66 } // namespace base 95 } // namespace base
OLDNEW
« base/task.h ('K') | « base/task.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698