Index: ipc/ipc_sync_channel.h |
diff --git a/ipc/ipc_sync_channel.h b/ipc/ipc_sync_channel.h |
index 0386b8f41b049b4da6c367dd1f7be8baed45f2d7..e7ff051be6b9378c6aced0139e62b62d0af65254 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: |