| 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
|
|
|
|
|