diff options
author | piman@google.com <piman@google.com@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-04-08 03:38:21 +0000 |
---|---|---|
committer | piman@google.com <piman@google.com@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-04-08 03:38:21 +0000 |
commit | 54af05f8ea8050e0ab93dbcc940ac4e1bc4068e5 (patch) | |
tree | 3641af4c4223de9f6e742e95b2fc23da4f4ec380 /ipc/ipc_sync_channel.h | |
parent | 5fda613da7a4cb0147bb7d7f9559b541cd45a266 (diff) | |
download | chromium_src-54af05f8ea8050e0ab93dbcc940ac4e1bc4068e5.zip chromium_src-54af05f8ea8050e0ab93dbcc940ac4e1bc4068e5.tar.gz chromium_src-54af05f8ea8050e0ab93dbcc940ac4e1bc4068e5.tar.bz2 |
Add sync context dispatch restriction.
This adds a way to restrict on a per-channel basis that incoming messages may only be dispatched when that particular channel is sending a sync message (or in a message loop).
It does so to the PPAPI channels, which may not introduce a sync dependency circle.
BUG=chromiumos:13821
TEST=news.google.com with Pepper Flash (see bug)
Review URL: http://codereview.chromium.org/6810013
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@80892 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'ipc/ipc_sync_channel.h')
-rw-r--r-- | ipc/ipc_sync_channel.h | 15 |
1 files changed, 15 insertions, 0 deletions
diff --git a/ipc/ipc_sync_channel.h b/ipc/ipc_sync_channel.h index 0386b8f..e7ff051 100644 --- a/ipc/ipc_sync_channel.h +++ b/ipc/ipc_sync_channel.h @@ -51,6 +51,17 @@ class SyncChannel : public ChannelProxy, sync_messages_with_no_timeout_allowed_ = value; } + // Sets this channel to only dispatch its incoming unblocking messages when it + // is itself blocked on sending a sync message, not when other channels are. + // + // Normally, any unblocking message coming from any channel can be dispatched + // when any (possibly other) channel is blocked on sending a message. This is + // needed in some cases to unblock certain loops (e.g. necessary when some + // processes share a window hierarchy), but may cause re-entrancy issues in + // some cases where such loops are not possible. This flags allows the tagging + // of some particular channels to not re-enter in such cases. + void SetRestrictDispatchToSameChannel(bool value); + protected: class ReceivedSyncMsgQueue; friend class ReceivedSyncMsgQueue; @@ -98,6 +109,9 @@ class SyncChannel : public ChannelProxy, return received_sync_msgs_; } + void set_restrict_dispatch(bool value) { restrict_dispatch_ = value; } + bool restrict_dispatch() const { return restrict_dispatch_; } + private: ~SyncContext(); // ChannelProxy methods that we override. @@ -125,6 +139,7 @@ class SyncChannel : public ChannelProxy, base::WaitableEvent* shutdown_event_; base::WaitableEventWatcher shutdown_watcher_; + bool restrict_dispatch_; }; private: |