Index: third_party/mojo/src/mojo/edk/system/channel_manager.h |
diff --git a/third_party/mojo/src/mojo/edk/system/channel_manager.h b/third_party/mojo/src/mojo/edk/system/channel_manager.h |
index bb6371bbb42e96108070ae2ab2679a587fdecd43..b01603c451abaddd0806c391f904e074dea55b9e 100644 |
--- a/third_party/mojo/src/mojo/edk/system/channel_manager.h |
+++ b/third_party/mojo/src/mojo/edk/system/channel_manager.h |
@@ -11,35 +11,53 @@ |
#include "base/macros.h" |
#include "base/memory/ref_counted.h" |
#include "base/synchronization/lock.h" |
-#include "base/task_runner.h" |
+#include "mojo/edk/embedder/scoped_platform_handle.h" |
#include "mojo/edk/system/channel.h" |
#include "mojo/edk/system/channel_info.h" |
+namespace base { |
+class TaskRunner; |
+} |
+ |
namespace mojo { |
+ |
+namespace embedder { |
+class PlatformSupport; |
+} |
+ |
namespace system { |
// IDs for |Channel|s managed by a |ChannelManager|. (IDs should be thought of |
// as specific to a given |ChannelManager|.) 0 is never a valid ID. |
-// |
-// Note: We currently just use the pointer of the |Channel| casted to a |
-// |uintptr_t|, but we reserve the right to change this. |
-typedef uintptr_t ChannelId; |
+typedef uint64_t ChannelId; |
+ |
+const ChannelId kInvalidChannelId = 0; |
// This class manages and "owns" |Channel|s (which typically connect to other |
-// processes) for a given process. This class is thread-safe. |
+// processes) for a given process. This class is thread-safe, except as |
+// specifically noted. |
class MOJO_SYSTEM_IMPL_EXPORT ChannelManager { |
public: |
- ChannelManager(); |
+ // |*platform_support| must remain alive longer than this object. |
+ explicit ChannelManager(embedder::PlatformSupport* platform_support); |
~ChannelManager(); |
- // Adds |channel| to the set of |Channel|s managed by this |ChannelManager|; |
- // |channel_thread_task_runner| should be the task runner for |channel|'s |
- // creation (a.k.a. I/O) thread. |channel| should either already be |
- // initialized. It should not be managed by any |ChannelManager| yet. Returns |
- // the ID for the added channel. |
- ChannelId AddChannel( |
- scoped_refptr<Channel> channel, |
- scoped_refptr<base::TaskRunner> channel_thread_task_runner); |
+ // Creates a |Channel| and adds it to the set of channels managed by this |
+ // |ChannelManager|. |channel_id| should be a valid |ChannelId| (i.e., |
+ // nonzero) not "assigned" to any other |Channel| being managed by this |
+ // |ChannelManager|. |
+ // TODO(vtl): Currently, this should be called on any I/O thread (which will |
+ // become the new channel's "channel thread"). Eventually, the channel manager |
+ // will have an assigned I/O thread, on which this must be called. |
+ // TODO(vtl): Maybe this should return a message pipe dispatcher (for the |
+ // bootstrap message pipe) instead. |
+ void CreateChannelOnIOThread( |
+ ChannelId channel_id, |
+ embedder::ScopedPlatformHandle platform_handle, |
+ scoped_refptr<system::ChannelEndpoint> bootstrap_channel_endpoint); |
+ |
+ // Gets the |Channel| with the given ID (which must exist). |
+ scoped_refptr<Channel> GetChannel(ChannelId channel_id) const; |
// Informs the channel manager (and thus channel) that it will be shutdown |
// soon (by calling |ShutdownChannel()|). Calling this is optional (and may in |
@@ -50,28 +68,19 @@ class MOJO_SYSTEM_IMPL_EXPORT ChannelManager { |
// Shuts down the channel specified by the given ID. It is up to the caller to |
// guarantee that this is only called once per channel (that was added using |
- // |AddChannel()|). If called from the chanel's creation thread (i.e., |
- // |base::MessageLoopProxy::current()| is the channel thread's |TaskRunner|), |
- // this will complete synchronously. |
+ // |CreateChannelOnIOThread()|). If called from the channel's creation thread |
+ // (i.e., |base::MessageLoopProxy::current()| is the channel thread's |
+ // |TaskRunner|), this will complete synchronously. |
void ShutdownChannel(ChannelId channel_id); |
private: |
- // Gets the ID for a given channel. |
- // |
- // Note: This is currently a static method and thus may be called under |
- // |lock_|. If this is ever made non-static (i.e., made specific to a given |
- // |ChannelManager|), those call sites may have to changed. |
- static ChannelId GetChannelId(const Channel* channel) { |
- return reinterpret_cast<ChannelId>(channel); |
- } |
- |
- // Gets the |ChannelInfo| for the channel specified by the given ID. (This |
- // should *not* be called under lock.) |
- ChannelInfo GetChannelInfo(ChannelId channel_id); |
+ embedder::PlatformSupport* const platform_support_; |
// Note: |Channel| methods should not be called under |lock_|. |
- base::Lock lock_; // Protects the members below. |
+ mutable base::Lock lock_; // Protects the members below. |
+ // TODO(vtl): Once we give the |ChannelManager| one single I/O thread, we can |
+ // get rid of |ChannelInfo| (and just have ref pointers to |Channel|s). |
base::hash_map<ChannelId, ChannelInfo> channel_infos_; |
DISALLOW_COPY_AND_ASSIGN(ChannelManager); |