Index: ipc/ipc_sync_message_filter.h |
=================================================================== |
--- ipc/ipc_sync_message_filter.h (revision 0) |
+++ ipc/ipc_sync_message_filter.h (revision 0) |
@@ -0,0 +1,79 @@ |
+// Copyright (c) 2010 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#ifndef IPC_IPC_SYNC_MESSAGE_FILTER_H_ |
+#define IPC_IPC_SYNC_MESSAGE_FILTER_H_ |
+ |
+#include "base/basictypes.h" |
+#include "base/hash_tables.h" |
+#include "base/lock.h" |
+#include "base/ref_counted.h" |
+#include "base/waitable_event.h" |
+#include "ipc/ipc_channel_proxy.h" |
+#include "ipc/ipc_sync_message.h" |
+ |
+class MessageLoop; |
+ |
+#if defined(COMPILER_GCC) |
+// Allows us to use MessageLoop in a hash_map with gcc (MSVC is okay without |
+// specifying this). |
+namespace __gnu_cxx { |
+template<> |
+struct hash<MessageLoop*> { |
+ size_t operator()(MessageLoop* message_loop) const { |
+ return reinterpret_cast<size_t>(message_loop); |
+ } |
+}; |
+} |
+#endif |
+ |
+namespace IPC { |
+ |
+class MessageReplyDeserializer; |
+ |
+// This MessageFilter allows sending synchronous IPC messages from a thread |
+// other than the listener thread associated with the SyncChannel. It does not |
+// support fancy features that SyncChannel does, such as handling recursion or |
+// receiving messages while waiting for a response. Note that this object can |
+// be used to send simultaneous synchronous messages from different threads. |
+class SyncMessageFilter : public ChannelProxy::MessageFilter, |
+ public Message::Sender { |
+ public: |
+ explicit SyncMessageFilter(base::WaitableEvent* shutdown_event); |
+ virtual ~SyncMessageFilter(); |
+ |
+ // Message::Sender implementation. |
+ virtual bool Send(Message* message); |
+ |
+ // ChannelProxy::MessageFilter implementation. |
+ virtual void OnFilterAdded(Channel* channel); |
+ virtual void OnChannelError(); |
+ virtual void OnChannelClosing(); |
+ virtual bool OnMessageReceived(const Message& message); |
+ |
+ private: |
+ void SendOnIOThread(Message* message); |
+ // Signal all the pending sends as done, used in an error condition. |
+ void SignalAllEvents(); |
+ |
+ // The channel to which this filter was added. |
+ Channel* channel_; |
+ |
+ MessageLoop* listener_loop_; // The process's main thread. |
+ MessageLoop* io_loop_; // The message loop where the Channel lives. |
+ |
+ typedef base::hash_map<MessageLoop*, PendingSyncMsg*> PendingSyncMessages; |
+ PendingSyncMessages pending_sync_messages_; |
+ |
+ // Locks data members above. |
+ Lock lock_; |
+ |
+ base::WaitableEvent* shutdown_event_; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(SyncMessageFilter); |
+}; |
+ |
+} // namespace IPC |
+ |
+#endif // IPC_IPC_SYNC_MESSAGE_FILTER_H_ |
Property changes on: ipc\ipc_sync_message_filter.h |
___________________________________________________________________ |
Added: svn:eol-style |
+ LF |