diff options
author | sky@chromium.org <sky@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2014-04-16 05:34:18 +0000 |
---|---|---|
committer | sky@chromium.org <sky@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2014-04-16 05:34:18 +0000 |
commit | 5273d8ec81d472ed23562968650b304a6874b0d8 (patch) | |
tree | 709b239fc5f1fa41e5110a836c293524f40fb6c8 /mojo/common/message_pump_mojo.h | |
parent | d3157a679a4b4d8e6d04de1872ba6a803d2994dc (diff) | |
download | chromium_src-5273d8ec81d472ed23562968650b304a6874b0d8.zip chromium_src-5273d8ec81d472ed23562968650b304a6874b0d8.tar.gz chromium_src-5273d8ec81d472ed23562968650b304a6874b0d8.tar.bz2 |
Fixes race condition in MojoMessagePump
I didn't realize ScheduleWork() can be invoked on any thread.
BUG=359973
TEST=none
R=darin@chromium.org
Review URL: https://codereview.chromium.org/239683002
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@264125 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'mojo/common/message_pump_mojo.h')
-rw-r--r-- | mojo/common/message_pump_mojo.h | 17 |
1 files changed, 13 insertions, 4 deletions
diff --git a/mojo/common/message_pump_mojo.h b/mojo/common/message_pump_mojo.h index cc21565..c761106 100644 --- a/mojo/common/message_pump_mojo.h +++ b/mojo/common/message_pump_mojo.h @@ -9,6 +9,7 @@ #include "base/memory/scoped_ptr.h" #include "base/message_loop/message_pump.h" +#include "base/synchronization/lock.h" #include "base/time/time.h" #include "mojo/common/mojo_common_export.h" #include "mojo/public/cpp/system/core.h" @@ -61,25 +62,33 @@ class MOJO_COMMON_EXPORT MessagePumpMojo : public base::MessagePump { typedef std::map<Handle, Handler> HandleToHandler; + // Implementation of Run(). + void DoRunLoop(RunState* run_state, Delegate* delegate); + // Services the set of handles ready. If |block| is true this waits for a // handle to become ready, otherwise this does not block. - void DoInternalWork(bool block); + void DoInternalWork(const RunState& run_state, bool block); // Removes the first invalid handle. This is called if MojoWaitMany finds an // invalid handle. void RemoveFirstInvalidHandle(const WaitState& wait_state); - void SignalControlPipe(); + void SignalControlPipe(const RunState& run_state); - WaitState GetWaitState() const; + WaitState GetWaitState(const RunState& run_state) const; // Returns the deadline for the call to MojoWaitMany(). - MojoDeadline GetDeadlineForWait() const; + MojoDeadline GetDeadlineForWait(const RunState& run_state) const; // If non-NULL we're running (inside Run()). Member is reference to value on // stack. RunState* run_state_; + // Lock for accessing |run_state_|. In general the only method that we have to + // worry about is ScheduleWork(). All other methods are invoked on the same + // thread. + base::Lock run_state_lock_; + HandleToHandler handlers_; // An ever increasing value assigned to each Handler::id. Used to detect |