Index: ipc/ipc_sync_channel.h |
diff --git a/ipc/ipc_sync_channel.h b/ipc/ipc_sync_channel.h |
index 0386b8f41b049b4da6c367dd1f7be8baed45f2d7..c551be2bee11b5094f71459f64872d2ec23571d6 100644 |
--- a/ipc/ipc_sync_channel.h |
+++ b/ipc/ipc_sync_channel.h |
@@ -51,6 +51,18 @@ 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. |
+ // renderer->browser->plugin->renderer), but may cause re-entrancy issues in |
+ // some cases where loops are not possible (e.g. dispatching a ppapi message |
+ // while the renderer is blocked on the gpu). This flags allows the tagging of |
+ // some particular channels (e.g. ppapi) to not re-enter in such cases. |
jam
2011/04/07 21:25:19
nit: we've usually tried to stay away from talking
|
+ void SetRestrictDispatchToSameChannel(bool value); |
+ |
protected: |
class ReceivedSyncMsgQueue; |
friend class ReceivedSyncMsgQueue; |
@@ -98,6 +110,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 +140,7 @@ class SyncChannel : public ChannelProxy, |
base::WaitableEvent* shutdown_event_; |
base::WaitableEventWatcher shutdown_watcher_; |
+ bool restrict_dispatch_; |
}; |
private: |