Home | History | Annotate | Download | only in ipc
      1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #ifndef IPC_IPC_SYNC_MESSAGE_FILTER_H_
      6 #define IPC_IPC_SYNC_MESSAGE_FILTER_H_
      7 
      8 #include <set>
      9 
     10 #include "base/basictypes.h"
     11 #include "base/memory/ref_counted.h"
     12 #include "base/synchronization/lock.h"
     13 #include "ipc/ipc_sender.h"
     14 #include "ipc/ipc_sync_message.h"
     15 #include "ipc/message_filter.h"
     16 
     17 namespace base {
     18 class MessageLoopProxy;
     19 class WaitableEvent;
     20 }
     21 
     22 namespace IPC {
     23 
     24 // This MessageFilter allows sending synchronous IPC messages from a thread
     25 // other than the listener thread associated with the SyncChannel.  It does not
     26 // support fancy features that SyncChannel does, such as handling recursion or
     27 // receiving messages while waiting for a response.  Note that this object can
     28 // be used to send simultaneous synchronous messages from different threads.
     29 class IPC_EXPORT SyncMessageFilter : public MessageFilter, public Sender {
     30  public:
     31   explicit SyncMessageFilter(base::WaitableEvent* shutdown_event);
     32 
     33   // MessageSender implementation.
     34   virtual bool Send(Message* message) OVERRIDE;
     35 
     36   // MessageFilter implementation.
     37   virtual void OnFilterAdded(Sender* sender) OVERRIDE;
     38   virtual void OnChannelError() OVERRIDE;
     39   virtual void OnChannelClosing() OVERRIDE;
     40   virtual bool OnMessageReceived(const Message& message) OVERRIDE;
     41 
     42  protected:
     43   virtual ~SyncMessageFilter();
     44 
     45  private:
     46   void SendOnIOThread(Message* message);
     47   // Signal all the pending sends as done, used in an error condition.
     48   void SignalAllEvents();
     49 
     50   // The channel to which this filter was added.
     51   Sender* sender_;
     52 
     53   // The process's main thread.
     54   scoped_refptr<base::MessageLoopProxy> listener_loop_;
     55 
     56   // The message loop where the Channel lives.
     57   scoped_refptr<base::MessageLoopProxy> io_loop_;
     58 
     59   typedef std::set<PendingSyncMsg*> PendingSyncMessages;
     60   PendingSyncMessages pending_sync_messages_;
     61 
     62   // Locks data members above.
     63   base::Lock lock_;
     64 
     65   base::WaitableEvent* shutdown_event_;
     66 
     67   DISALLOW_COPY_AND_ASSIGN(SyncMessageFilter);
     68 };
     69 
     70 }  // namespace IPC
     71 
     72 #endif  // IPC_IPC_SYNC_MESSAGE_FILTER_H_
     73