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

Issue 17567007: Made MessagePump a non-thread safe class. (Closed)

Created:
7 years, 6 months ago by alexeypa (please no reviews)
Modified:
7 years, 4 months ago
CC:
chromium-reviews, erikwright+watch_chromium.org, sadrul, jamesr
Visibility:
Public.

Description

Made MessagePump a non-thread safe class. This CL makes MessagePump a non-thread safe class to make sure thread-bound resources (such as the UI window used for pumping messages on Windows) are freed on the correct thread. Handling of incoming tasks and synchronization between different threads was moved out to a separate class - IncomingTaskQueue reducing the number of locks to be taken while posting a task to one. Posting tasks via both MessageLoop and MessageLoopProxyImpl is now routed via IncomingTaskQueue. BUG=241939 Committed: https://src.chromium.org/viewvc/chrome?view=rev&revision=212948

Patch Set 1 #

Patch Set 2 : - #

Total comments: 10

Patch Set 3 : Moved incoming_queue_ to MessageLoopProxyImpl #

Total comments: 14

Patch Set 4 : Fixed a typo. #

Total comments: 1

Patch Set 5 : CR feedback. #

Patch Set 6 : rebased #

Patch Set 7 : base/time.h was moved to base/time/ #

Total comments: 10

Patch Set 8 : CR feedback #

Total comments: 4

Patch Set 9 : rebased #

Total comments: 11

Patch Set 10 : CR feedback. #

Patch Set 11 : Moved MessageLoopProxyImpl to base::internal. #

Total comments: 4

Patch Set 12 : base::MessagePumpNSRunLoop* weak_message_pump #

Patch Set 13 : rebased #

Patch Set 14 : Removing MessageLoopLockTest hack. #

Patch Set 15 : fixing a typo #

Patch Set 16 : IncomingTaskQueue #

Total comments: 12

Patch Set 17 : The last batch of feedback. #

Patch Set 18 : rebased #

Patch Set 19 : rebased #

Total comments: 10
Unified diffs Side-by-side diffs Delta from patch set Stats (+490 lines, -405 lines) Patch
M base/base.gypi View 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 1 chunk +2 lines, -0 lines 0 comments Download
A base/message_loop/incoming_task_queue.h View 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 1 chunk +104 lines, -0 lines 0 comments Download
A base/message_loop/incoming_task_queue.cc View 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 1 chunk +169 lines, -0 lines 7 comments Download
M base/message_loop/message_loop.h View 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 8 chunks +42 lines, -61 lines 0 comments Download
M base/message_loop/message_loop.cc View 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 13 chunks +51 lines, -150 lines 3 comments Download
M base/message_loop/message_loop_proxy_impl.h View 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 2 chunks +16 lines, -25 lines 0 comments Download
M base/message_loop/message_loop_proxy_impl.cc View 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 1 chunk +15 lines, -53 lines 0 comments Download
M base/message_loop/message_loop_unittest.cc View 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 5 chunks +9 lines, -21 lines 0 comments Download
M base/message_loop/message_pump.h View 3 chunks +3 lines, -6 lines 0 comments Download
M base/message_loop/message_pump_android.h View 1 2 3 4 5 2 chunks +1 line, -3 lines 0 comments Download
M base/message_loop/message_pump_aurax11.h View 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 2 chunks +1 line, -3 lines 0 comments Download
M base/message_loop/message_pump_aurax11.cc View 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 2 chunks +7 lines, -7 lines 0 comments Download
M base/message_loop/message_pump_default.h View 1 2 3 4 5 2 chunks +1 line, -3 lines 0 comments Download
M base/message_loop/message_pump_default.cc View 1 chunk +3 lines, -0 lines 0 comments Download
M base/message_loop/message_pump_glib.h View 1 2 3 4 5 2 chunks +1 line, -2 lines 0 comments Download
M base/message_loop/message_pump_glib.cc View 2 chunks +7 lines, -7 lines 0 comments Download
M base/message_loop/message_pump_gtk.h View 2 chunks +1 line, -3 lines 0 comments Download
M base/message_loop/message_pump_gtk.cc View 2 chunks +5 lines, -5 lines 0 comments Download
M base/message_loop/message_pump_io_ios.h View 1 6 chunks +7 lines, -6 lines 0 comments Download
M base/message_loop/message_pump_io_ios.cc View 1 5 chunks +7 lines, -6 lines 0 comments Download
M base/message_loop/message_pump_io_ios_unittest.cc View 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 3 chunks +5 lines, -5 lines 0 comments Download
M base/message_loop/message_pump_libevent.h View 1 2 3 4 5 2 chunks +1 line, -3 lines 0 comments Download
M base/message_loop/message_pump_libevent_unittest.cc View 1 2 chunks +2 lines, -2 lines 0 comments Download
M base/message_loop/message_pump_mac.h View 8 chunks +6 lines, -16 lines 0 comments Download
M base/message_loop/message_pump_mac.mm View 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 1 chunk +3 lines, -0 lines 0 comments Download
M base/message_loop/message_pump_ozone.h View 2 chunks +1 line, -1 line 0 comments Download
M base/test/test_support_android.cc View 2 chunks +2 lines, -3 lines 0 comments Download
M chrome/browser/ui/cocoa/browser/avatar_menu_bubble_controller_unittest.mm View 1 2 3 4 5 3 chunks +4 lines, -3 lines 0 comments Download
M chrome/browser/ui/cocoa/constrained_window/constrained_window_animation_unittest.mm View 1 3 chunks +3 lines, -2 lines 0 comments Download
M chrome/browser/ui/cocoa/history_overlay_controller_unittest.mm View 1 2 3 4 5 6 7 8 9 10 11 12 13 14 3 chunks +4 lines, -3 lines 0 comments Download
M chrome/browser/ui/cocoa/run_loop_testing.mm View 1 2 3 4 5 2 chunks +2 lines, -1 line 0 comments Download
M media/base/pipeline_unittest.cc View 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 1 chunk +2 lines, -2 lines 0 comments Download
M net/dns/dns_transaction_unittest.cc View 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 1 chunk +1 line, -1 line 0 comments Download
M net/dns/serial_worker_unittest.cc View 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 2 chunks +2 lines, -2 lines 0 comments Download

Messages

Total messages: 41 (0 generated)
alexeypa (please no reviews)
Patch #2 now passes most of the test (bots are not available at the moment, ...
7 years, 6 months ago (2013-06-25 23:55:52 UTC) #1
alexeypa (please no reviews)
Ricardo, ping.
7 years, 5 months ago (2013-06-27 17:46:22 UTC) #2
rvargas (doing something else)
Sorry for the delay... it's a delicate CL I guess it doesn't look too bad. ...
7 years, 5 months ago (2013-06-28 03:00:51 UTC) #3
alexeypa (please no reviews)
OK, I moved |incoming_queue_| to MessageLoopProxyImpl. PTAL. https://codereview.chromium.org/17567007/diff/32001/base/message_loop/message_loop.cc File base/message_loop/message_loop.cc (right): https://codereview.chromium.org/17567007/diff/32001/base/message_loop/message_loop.cc#newcode350 base/message_loop/message_loop.cc:350: scoped_refptr<MessageLoopProxy> MessageLoop::message_loop_proxy() ...
7 years, 5 months ago (2013-06-28 17:00:57 UTC) #4
rvargas (doing something else)
https://codereview.chromium.org/17567007/diff/46001/base/message_loop/message_loop.h File base/message_loop/message_loop.h (right): https://codereview.chromium.org/17567007/diff/46001/base/message_loop/message_loop.h#newcode440 base/message_loop/message_loop.h:440: // resonsible for synchronizing StartPump() calls. typo: responsible https://codereview.chromium.org/17567007/diff/46001/base/message_loop/message_loop.h#newcode441 ...
7 years, 5 months ago (2013-06-28 22:59:44 UTC) #5
alexeypa (please no reviews)
https://chromiumcodereview.appspot.com/17567007/diff/46001/base/message_loop/message_loop.h File base/message_loop/message_loop.h (right): https://chromiumcodereview.appspot.com/17567007/diff/46001/base/message_loop/message_loop.h#newcode440 base/message_loop/message_loop.h:440: // resonsible for synchronizing StartPump() calls. On 2013/06/28 22:59:44, ...
7 years, 5 months ago (2013-07-03 18:56:48 UTC) #6
alexeypa (please no reviews)
ping.
7 years, 5 months ago (2013-07-09 19:14:05 UTC) #7
rvargas (doing something else)
We are missing the message_pump_win files. Looks basically good. https://codereview.chromium.org/17567007/diff/64036/base/message_loop/message_loop_proxy_impl.cc File base/message_loop/message_loop_proxy_impl.cc (right): https://codereview.chromium.org/17567007/diff/64036/base/message_loop/message_loop_proxy_impl.cc#newcode175 base/message_loop/message_loop_proxy_impl.cc:175: ...
7 years, 5 months ago (2013-07-09 21:46:09 UTC) #8
alexeypa (please no reviews)
> We are missing the message_pump_win files. No changes to message_pump_win are required as a ...
7 years, 5 months ago (2013-07-09 23:37:40 UTC) #9
rvargas (doing something else)
he, I see the public destructor on MessagePumpWin :( LGTM https://codereview.chromium.org/17567007/diff/91001/base/message_loop/message_loop_proxy_impl.h File base/message_loop/message_loop_proxy_impl.h (right): https://codereview.chromium.org/17567007/diff/91001/base/message_loop/message_loop_proxy_impl.h#newcode64 ...
7 years, 5 months ago (2013-07-10 00:24:42 UTC) #10
alexeypa (please no reviews)
https://codereview.chromium.org/17567007/diff/91001/base/message_loop/message_loop_proxy_impl.h File base/message_loop/message_loop_proxy_impl.h (right): https://codereview.chromium.org/17567007/diff/91001/base/message_loop/message_loop_proxy_impl.h#newcode64 base/message_loop/message_loop_proxy_impl.h:64: // Diconnects |this| from the parent message loop. On ...
7 years, 5 months ago (2013-07-10 16:14:26 UTC) #11
alexeypa (please no reviews)
Requesting OWNERS approval: base/* - darin@ chrome/browser/ui/cocoa/* - thakis@ media/base/* - dalecurtis@
7 years, 5 months ago (2013-07-10 16:20:07 UTC) #12
Nico
c/b/u/cocoa lgtm But since this is a potentially subtle change, getting base/OWNERS approval before asking ...
7 years, 5 months ago (2013-07-10 16:52:49 UTC) #13
DaleCurtis
media/ lgtm, but some nits on base/ https://codereview.chromium.org/17567007/diff/102001/base/message_loop/message_loop.h File base/message_loop/message_loop.h (left): https://codereview.chromium.org/17567007/diff/102001/base/message_loop/message_loop.h#oldcode285 base/message_loop/message_loop.h:285: scoped_refptr<MessageLoopProxy> message_loop_proxy() ...
7 years, 5 months ago (2013-07-10 17:31:08 UTC) #14
alexeypa (please no reviews)
Thanks! Darin, now is your turn. :-) https://codereview.chromium.org/17567007/diff/102001/base/message_loop/message_loop.h File base/message_loop/message_loop.h (left): https://codereview.chromium.org/17567007/diff/102001/base/message_loop/message_loop.h#oldcode285 base/message_loop/message_loop.h:285: scoped_refptr<MessageLoopProxy> message_loop_proxy() ...
7 years, 5 months ago (2013-07-10 19:39:58 UTC) #15
DaleCurtis
https://codereview.chromium.org/17567007/diff/102001/base/message_loop/message_loop.h File base/message_loop/message_loop.h (left): https://codereview.chromium.org/17567007/diff/102001/base/message_loop/message_loop.h#oldcode285 base/message_loop/message_loop.h:285: scoped_refptr<MessageLoopProxy> message_loop_proxy() { On 2013/07/10 19:39:59, alexeypa wrote: > ...
7 years, 5 months ago (2013-07-10 19:52:43 UTC) #16
alexeypa (please no reviews)
https://codereview.chromium.org/17567007/diff/102001/base/message_loop/message_loop.h File base/message_loop/message_loop.h (left): https://codereview.chromium.org/17567007/diff/102001/base/message_loop/message_loop.h#oldcode285 base/message_loop/message_loop.h:285: scoped_refptr<MessageLoopProxy> message_loop_proxy() { On 2013/07/10 19:52:43, DaleCurtis wrote: > ...
7 years, 5 months ago (2013-07-10 20:05:26 UTC) #17
alexeypa (please no reviews)
https://codereview.chromium.org/17567007/diff/102001/base/message_loop/message_loop.h File base/message_loop/message_loop.h (left): https://codereview.chromium.org/17567007/diff/102001/base/message_loop/message_loop.h#oldcode285 base/message_loop/message_loop.h:285: scoped_refptr<MessageLoopProxy> message_loop_proxy() { On 2013/07/10 20:05:27, alexeypa wrote: > ...
7 years, 5 months ago (2013-07-10 21:01:12 UTC) #18
DaleCurtis
lgtm. thanks! :)
7 years, 5 months ago (2013-07-10 21:04:48 UTC) #19
Robert Sesek
https://codereview.chromium.org/17567007/diff/127001/chrome/browser/ui/cocoa/history_overlay_controller_unittest.mm File chrome/browser/ui/cocoa/history_overlay_controller_unittest.mm (right): https://codereview.chromium.org/17567007/diff/127001/chrome/browser/ui/cocoa/history_overlay_controller_unittest.mm#newcode69 chrome/browser/ui/cocoa/history_overlay_controller_unittest.mm:69: quit_closure.Run(); Why can't Quit be called directly here?
7 years, 5 months ago (2013-07-10 22:13:32 UTC) #20
alexeypa (please no reviews)
https://codereview.chromium.org/17567007/diff/127001/chrome/browser/ui/cocoa/history_overlay_controller_unittest.mm File chrome/browser/ui/cocoa/history_overlay_controller_unittest.mm (right): https://codereview.chromium.org/17567007/diff/127001/chrome/browser/ui/cocoa/history_overlay_controller_unittest.mm#newcode69 chrome/browser/ui/cocoa/history_overlay_controller_unittest.mm:69: quit_closure.Run(); On 2013/07/10 22:13:32, rsesek wrote: > Why can't ...
7 years, 5 months ago (2013-07-10 22:15:26 UTC) #21
Robert Sesek
https://codereview.chromium.org/17567007/diff/127001/chrome/browser/ui/cocoa/history_overlay_controller_unittest.mm File chrome/browser/ui/cocoa/history_overlay_controller_unittest.mm (right): https://codereview.chromium.org/17567007/diff/127001/chrome/browser/ui/cocoa/history_overlay_controller_unittest.mm#newcode69 chrome/browser/ui/cocoa/history_overlay_controller_unittest.mm:69: quit_closure.Run(); On 2013/07/10 22:15:26, alexeypa wrote: > On 2013/07/10 ...
7 years, 5 months ago (2013-07-10 22:19:14 UTC) #22
alexeypa (please no reviews)
https://codereview.chromium.org/17567007/diff/127001/chrome/browser/ui/cocoa/history_overlay_controller_unittest.mm File chrome/browser/ui/cocoa/history_overlay_controller_unittest.mm (right): https://codereview.chromium.org/17567007/diff/127001/chrome/browser/ui/cocoa/history_overlay_controller_unittest.mm#newcode69 chrome/browser/ui/cocoa/history_overlay_controller_unittest.mm:69: quit_closure.Run(); On 2013/07/10 22:19:15, rsesek wrote: > On 2013/07/10 ...
7 years, 5 months ago (2013-07-10 22:27:23 UTC) #23
Robert Sesek
lgtm, thanks
7 years, 5 months ago (2013-07-10 23:08:40 UTC) #24
alexeypa (please no reviews)
Darin, ping^2.
7 years, 5 months ago (2013-07-11 20:17:19 UTC) #25
alexeypa (please no reviews)
On 2013/07/11 20:17:19, alexeypa wrote: > Darin, ping^2. ping^3
7 years, 5 months ago (2013-07-15 15:42:39 UTC) #26
darin (slow to review)
On 2013/07/15 15:42:39, alexeypa wrote: > On 2013/07/11 20:17:19, alexeypa wrote: > > Darin, ping^2. ...
7 years, 5 months ago (2013-07-15 16:13:29 UTC) #27
darin (slow to review)
On 2013/07/15 16:13:29, darin wrote: > On 2013/07/15 15:42:39, alexeypa wrote: > > On 2013/07/11 ...
7 years, 5 months ago (2013-07-16 16:26:45 UTC) #28
alexeypa (please no reviews)
On 2013/07/16 16:26:45, darin wrote: > Uhm, this CL completely changes the relationship between MessageLoop ...
7 years, 5 months ago (2013-07-16 16:55:42 UTC) #29
darin (slow to review)
On 2013/07/16 16:55:42, alexeypa wrote: > On 2013/07/16 16:26:45, darin wrote: > > Uhm, this ...
7 years, 5 months ago (2013-07-16 17:20:18 UTC) #30
darin (slow to review)
OK, here's what bugs me about this CL: MessageLoopProxy is a "proxy interface" to a ...
7 years, 5 months ago (2013-07-17 16:46:47 UTC) #31
alexeypa (please no reviews)
On 2013/07/17 16:46:47, darin wrote: > #2 is conceptually cleanest, but #1 might be worth ...
7 years, 5 months ago (2013-07-18 00:07:15 UTC) #32
darin (slow to review)
Yeah, this is looking good. More detailed review shortly.
7 years, 5 months ago (2013-07-18 04:37:28 UTC) #33
alexeypa (please no reviews)
On 2013/07/18 04:37:28, darin wrote: > Yeah, this is looking good. More detailed review shortly. ...
7 years, 5 months ago (2013-07-18 04:47:25 UTC) #34
darin (slow to review)
I wouldn't worry too much about that overhead at this point. Down the road, once ...
7 years, 5 months ago (2013-07-18 04:53:22 UTC) #35
darin (slow to review)
LGTM w/ nits fixed https://chromiumcodereview.appspot.com/17567007/diff/165001/base/message_loop/incoming_task_queue.cc File base/message_loop/incoming_task_queue.cc (right): https://chromiumcodereview.appspot.com/17567007/diff/165001/base/message_loop/incoming_task_queue.cc#newcode16 base/message_loop/incoming_task_queue.cc:16: : message_loop_(MessageLoop::current()), minor-nit: Perhaps IncomingTaskQueue() ...
7 years, 5 months ago (2013-07-21 04:09:41 UTC) #36
alexeypa (please no reviews)
https://chromiumcodereview.appspot.com/17567007/diff/165001/base/message_loop/incoming_task_queue.cc File base/message_loop/incoming_task_queue.cc (right): https://chromiumcodereview.appspot.com/17567007/diff/165001/base/message_loop/incoming_task_queue.cc#newcode16 base/message_loop/incoming_task_queue.cc:16: : message_loop_(MessageLoop::current()), On 2013/07/21 04:09:42, darin wrote: > minor-nit: ...
7 years, 5 months ago (2013-07-21 06:52:25 UTC) #37
commit-bot: I haz the power
CQ is trying da patch. Follow status at https://chromium-status.appspot.com/cq/alexeypa@chromium.org/17567007/188001
7 years, 5 months ago (2013-07-22 15:54:13 UTC) #38
commit-bot: I haz the power
Change committed as 212948
7 years, 5 months ago (2013-07-22 19:52:16 UTC) #39
jar1
Some of this makes me pretty nervous about potential performance impact. The big thing is ...
7 years, 4 months ago (2013-07-29 23:30:49 UTC) #40
alexeypa (please no reviews)
7 years, 4 months ago (2013-07-30 00:31:13 UTC) #41
Message was sent while issue was closed.
https://chromiumcodereview.appspot.com/17567007/diff/188001/base/message_loop...
File base/message_loop/incoming_task_queue.cc (right):

https://chromiumcodereview.appspot.com/17567007/diff/188001/base/message_loop...
base/message_loop/incoming_task_queue.cc:25: AutoLock
locked(incoming_queue_lock_);
On 2013/07/29 23:30:50, jar1 wrote:
> Calling to acquire the lock here is IMO much too early, and should instigate
> contention on this lock (which should have a negative impact on perf).

Before I made this change, there were two locks. One was taken while posting
messages via MessageLoop. The duration of the lock was the same as
|incoming_queue_lock_| except that CalculateDelayedRuntime() and
pump_->ShceduleWork() were not under the lock.

Both locks were taken if a task was posted via MessageLoopProxy. The outer lock
was taken before CalculateDelayedRuntime() was called and released after
pump_->ShceduleWork().
 
> This lock is *only* intended to protect incomming_queue_, so we should only be
> manipulating that queue while holding the lock... and to the extent possible,
do
> nothing more. Calls that might do allocations, or operating system calls,
> should probably be pulled outside if at all possible.

I agree, it is a great point. We should be careful about lifetimes of
MessageLoop and MessagePump though. It makes sense to use a separate lock to
protect ScheduleWork(). The problem is where to put it. MessageLoop can be
destroyed at the same time as another thread is trying to wake up the message
pump.

https://chromiumcodereview.appspot.com/17567007/diff/188001/base/message_loop...
base/message_loop/incoming_task_queue.cc:163:
message_loop_->ScheduleWork(was_empty);
On 2013/07/29 23:30:50, jar1 wrote:
> The lock was really only intended to
> protect the queue....

This is new code, so not really. The lock was intended to protect ScheduleWork()
and message pump's lifetime as well. Now I agree that is not very good from
performance standpoint. 

> and they work done should be very quickly
> finished.

This is documented next to MessagePump::ScheduleWork() declaration. 

I think it should be possible to have a separate lock protecting MessageLoop's
registration with IncomingTaskQueue. It will synchronize ScheduleWork() calls
and message pump destruction as well.

https://chromiumcodereview.appspot.com/17567007/diff/188001/base/message_loop...
File base/message_loop/message_loop.cc (left):

https://chromiumcodereview.appspot.com/17567007/diff/188001/base/message_loop...
base/message_loop/message_loop.cc:628: AutoLock locked(incoming_queue_lock_,
AutoLock::AlreadyAcquired());
On 2013/07/29 23:30:50, jar1 wrote:
> Specifically in this case, care was taken to release the lock on line 646
before
> calling ScheduleWork().

Yes, I know. Unfortunately that caused a race down in Win32 code when one thread
was destroying the message loop, while the other was executing ScheduleWork().

Powered by Google App Engine
This is Rietveld 408576698