Upstream version 10.39.225.0
[platform/framework/web/crosswalk.git] / src / mojo / system / message_pipe.h
index de42c44..7d86d5f 100644 (file)
@@ -5,14 +5,19 @@
 #ifndef MOJO_SYSTEM_MESSAGE_PIPE_H_
 #define MOJO_SYSTEM_MESSAGE_PIPE_H_
 
+#include <stdint.h>
+
 #include <vector>
 
-#include "base/basictypes.h"
+#include "base/macros.h"
 #include "base/memory/ref_counted.h"
 #include "base/memory/scoped_ptr.h"
 #include "base/synchronization/lock.h"
-#include "mojo/public/c/system/core.h"
+#include "mojo/public/c/system/message_pipe.h"
+#include "mojo/public/c/system/types.h"
 #include "mojo/system/dispatcher.h"
+#include "mojo/system/handle_signals_state.h"
+#include "mojo/system/memory.h"
 #include "mojo/system/message_in_transit.h"
 #include "mojo/system/message_pipe_endpoint.h"
 #include "mojo/system/system_impl_export.h"
 namespace mojo {
 namespace system {
 
-class Channel;
+class ChannelEndpoint;
 class Waiter;
 
 // |MessagePipe| is the secondary object implementing a message pipe (see the
-// explanatory comment in core_impl.cc). It is typically owned by the
-// dispatcher(s) corresponding to the local endpoints. This class is
-// thread-safe.
-class MOJO_SYSTEM_IMPL_EXPORT MessagePipe :
-    public base::RefCountedThreadSafe<MessagePipe> {
+// explanatory comment in core.cc). It is typically owned by the dispatcher(s)
+// corresponding to the local endpoints. This class is thread-safe.
+class MOJO_SYSTEM_IMPL_EXPORT MessagePipe
+    : public base::RefCountedThreadSafe<MessagePipe> {
  public:
-  MessagePipe(scoped_ptr<MessagePipeEndpoint> endpoint0,
-              scoped_ptr<MessagePipeEndpoint> endpoint1);
-
-  // Convenience constructor that constructs a |MessagePipe| with two new
-  // |LocalMessagePipeEndpoint|s.
-  MessagePipe();
+  // Creates a |MessagePipe| with two new |LocalMessagePipeEndpoint|s.
+  static MessagePipe* CreateLocalLocal();
+
+  // Creates a |MessagePipe| with a |LocalMessagePipeEndpoint| on port 0 and a
+  // |ProxyMessagePipeEndpoint| on port 1. |*channel_endpoint| is set to the
+  // (newly-created) |ChannelEndpoint| for the latter.
+  static MessagePipe* CreateLocalProxy(
+      scoped_refptr<ChannelEndpoint>* channel_endpoint);
+
+  // Creates a |MessagePipe| with a |ProxyMessagePipeEndpoint| on port 0 and a
+  // |LocalMessagePipeEndpoint| on port 1. |*channel_endpoint| is set to the
+  // (newly-created) |ChannelEndpoint| for the former.
+  // Note: This is really only needed in tests (outside of tests, this
+  // configuration arises from a local message pipe having its port 0
+  // "converted" using |ConvertLocalToProxy()|).
+  static MessagePipe* CreateProxyLocal(
+      scoped_refptr<ChannelEndpoint>* channel_endpoint);
 
   // Gets the other port number (i.e., 0 -> 1, 1 -> 0).
   static unsigned GetPeerPort(unsigned port);
@@ -50,49 +65,62 @@ class MOJO_SYSTEM_IMPL_EXPORT MessagePipe :
   // Unlike |MessagePipeDispatcher::WriteMessage()|, this does not validate its
   // arguments.
   MojoResult WriteMessage(unsigned port,
-                          const void* bytes,
+                          UserPointer<const void> bytes,
                           uint32_t num_bytes,
                           std::vector<DispatcherTransport>* transports,
                           MojoWriteMessageFlags flags);
-  // Unlike |MessagePipeDispatcher::ReadMessage()|, this does not validate its
-  // arguments.
   MojoResult ReadMessage(unsigned port,
-                         void* bytes,
-                         uint32_t* num_bytes,
-                         std::vector<scoped_refptr<Dispatcher> >* dispatchers,
+                         UserPointer<void> bytes,
+                         UserPointer<uint32_t> num_bytes,
+                         DispatcherVector* dispatchers,
                          uint32_t* num_dispatchers,
                          MojoReadMessageFlags flags);
+  HandleSignalsState GetHandleSignalsState(unsigned port) const;
   MojoResult AddWaiter(unsigned port,
                        Waiter* waiter,
-                       MojoWaitFlags flags,
-                       MojoResult wake_result);
-  void RemoveWaiter(unsigned port, Waiter* waiter);
+                       MojoHandleSignals signals,
+                       uint32_t context,
+                       HandleSignalsState* signals_state);
+  void RemoveWaiter(unsigned port,
+                    Waiter* waiter,
+                    HandleSignalsState* signals_state);
 
   // This is called by the dispatcher to convert a local endpoint to a proxy
   // endpoint.
-  void ConvertLocalToProxy(unsigned port);
+  scoped_refptr<ChannelEndpoint> ConvertLocalToProxy(unsigned port);
 
-  // This is used internally by |WriteMessage()| and by |Channel| to enqueue
-  // messages (typically to a |LocalMessagePipeEndpoint|). Unlike
-  // |WriteMessage()|, |port| is the *destination* port. |transports| should be
-  // non-null only if it's nonempty, and only if |message| has no dispatchers
-  // attached.
+  // This is used by |Channel| to enqueue messages (typically to a
+  // |LocalMessagePipeEndpoint|). Unlike |WriteMessage()|, |port| is the
+  // *destination* port.
   MojoResult EnqueueMessage(unsigned port,
-                            scoped_ptr<MessageInTransit> message,
-                            std::vector<DispatcherTransport>* transports);
+                            scoped_ptr<MessageInTransit> message);
 
-  // These are used by |Channel|.
-  void Attach(unsigned port,
-              scoped_refptr<Channel> channel,
-              MessageInTransit::EndpointId local_id);
-  void Run(unsigned port, MessageInTransit::EndpointId remote_id);
+  // This is used by |Channel|. TODO(vtl): Rename it (and have the
+  // |ChannelEndpoint| call it instead).
+  void OnRemove(unsigned port);
 
  private:
+  MessagePipe();
+
   friend class base::RefCountedThreadSafe<MessagePipe>;
   virtual ~MessagePipe();
 
-  // Used by |EnqueueMessage()| to handle control messages that are actually
-  // meant for us.
+  // This is used internally by |WriteMessage()| and by |EnqueueMessage()|.
+  // |transports| may be non-null only if it's nonempty and |message| has no
+  // dispatchers attached.
+  MojoResult EnqueueMessageInternal(
+      unsigned port,
+      scoped_ptr<MessageInTransit> message,
+      std::vector<DispatcherTransport>* transports);
+
+  // Helper for |EnqueueMessageInternal()|. Must be called with |lock_| held.
+  MojoResult AttachTransportsNoLock(
+      unsigned port,
+      MessageInTransit* message,
+      std::vector<DispatcherTransport>* transports);
+
+  // Used by |EnqueueMessageInternal()| to handle control messages that are
+  // actually meant for us.
   MojoResult HandleControlMessage(unsigned port,
                                   scoped_ptr<MessageInTransit> message);