Index: third_party/mojo/src/mojo/edk/embedder/embedder.h |
diff --git a/third_party/mojo/src/mojo/edk/embedder/embedder.h b/third_party/mojo/src/mojo/edk/embedder/embedder.h |
index 4898ae10fc0aa2e7e1c63def716ac7a9c30a387c..142c86fa0c1671b2120ace579ec811382f414d4a 100644 |
--- a/third_party/mojo/src/mojo/edk/embedder/embedder.h |
+++ b/third_party/mojo/src/mojo/edk/embedder/embedder.h |
@@ -10,6 +10,7 @@ |
#include "base/memory/scoped_ptr.h" |
#include "base/task_runner.h" |
#include "mojo/edk/embedder/channel_info_forward.h" |
+#include "mojo/edk/embedder/process_type.h" |
#include "mojo/edk/embedder/scoped_platform_handle.h" |
#include "mojo/edk/system/system_impl_export.h" |
#include "mojo/public/cpp/system/message_pipe.h" |
@@ -18,9 +19,15 @@ namespace mojo { |
namespace embedder { |
struct Configuration; |
-class MasterProcessDelegate; |
class PlatformSupport; |
-class SlaveProcessDelegate; |
+class ProcessDelegate; |
+typedef void* SlaveInfo; |
+ |
+// Basic configuration/initialization ------------------------------------------ |
+ |
+// |Init()| sets up the basic Mojo system environment, making the |Mojo...()| |
+// functions available and functional. This is never shut down (except in tests |
+// -- see test_embedder.h). |
// Returns the global configuration. In general, you should not need to change |
// the configuration, but if you do you must do it before calling |Init()|. |
@@ -30,31 +37,88 @@ MOJO_SYSTEM_IMPL_EXPORT Configuration* GetConfiguration(); |
// initialize the (global, singleton) system. |
MOJO_SYSTEM_IMPL_EXPORT void Init(scoped_ptr<PlatformSupport> platform_support); |
-// Initializes a master process. To be called after |Init()|. |
-// |master_process_delegate| should live forever (or until after |
-// |mojo::embedder::test::Shutdown()|); its methods will be called using |
-// |delegate_thread_task_runner|, which must be the task runner for the thread |
-// calling |InitMaster()|. |io_thread_task_runner| should be the task runner for |
-// some I/O thread; this should be the same as that provided to |
-// |CreateChannel()| (or on which |CreateChannelOnIOThread()| is called). |
-// TODO(vtl): Remove the |io_thread_task_runner| argument from |
-// |CreateChannel()| (and eventually |CreateChannel()| altogether) and require |
-// that either this or |InitSlave()| be called. Currently, |CreateChannel()| can |
-// be used with different I/O threads, but this capability will be removed. |
-MOJO_SYSTEM_IMPL_EXPORT void InitMaster( |
- scoped_refptr<base::TaskRunner> delegate_thread_task_runner, |
- MasterProcessDelegate* master_process_delegate, |
- scoped_refptr<base::TaskRunner> io_thread_task_runner); |
+// Basic functions ------------------------------------------------------------- |
+ |
+// The functions in this section are available once |Init()| has been called. |
+ |
+// Start waiting on the handle asynchronously. On success, |callback| will be |
+// called exactly once, when |handle| satisfies a signal in |signals| or it |
+// becomes known that it will never do so. |callback| will be executed on an |
+// arbitrary thread, so it must not call any Mojo system or embedder functions. |
+MOJO_SYSTEM_IMPL_EXPORT MojoResult |
+AsyncWait(MojoHandle handle, |
+ MojoHandleSignals signals, |
+ const base::Callback<void(MojoResult)>& callback); |
+ |
+// Creates a |MojoHandle| that wraps the given |PlatformHandle| (taking |
+// ownership of it). This |MojoHandle| can then, e.g., be passed through message |
+// pipes. Note: This takes ownership (and thus closes) |platform_handle| even on |
+// failure, which is different from what you'd expect from a Mojo API, but it |
+// makes for a more convenient embedder API. |
+MOJO_SYSTEM_IMPL_EXPORT MojoResult |
+CreatePlatformHandleWrapper(ScopedPlatformHandle platform_handle, |
+ MojoHandle* platform_handle_wrapper_handle); |
+ |
+// Retrieves the |PlatformHandle| that was wrapped into a |MojoHandle| (using |
+// |CreatePlatformHandleWrapper()| above). Note that the |MojoHandle| must still |
+// be closed separately. |
+MOJO_SYSTEM_IMPL_EXPORT MojoResult |
+PassWrappedPlatformHandle(MojoHandle platform_handle_wrapper_handle, |
+ ScopedPlatformHandle* platform_handle); |
-// Initializes a slave process. Similar to |InitMaster()| (see above). |
-// |platform_handle| should be connected to the handle passed to |AddSlave()|. |
-// TODO(vtl): |AddSlave()| doesn't exist yet. |
-MOJO_SYSTEM_IMPL_EXPORT void InitSlave( |
+// Initialialization/shutdown for interprocess communication (IPC) ------------- |
+ |
+// |InitIPCSupport()| sets up the subsystem for interprocess communication, |
+// making the IPC functions (in the following section) available and functional. |
+// (This may only be done after |Init()|.) |
+// |
+// This subsystem may be shut down, using |ShutdownIPCSupportOnIOThread()| or |
+// |ShutdownIPCSupport()|. None of the IPC functions may be called while or |
+// after either of these is called. |
+ |
+// Initializes a process of the given type; to be called after |Init()|. |
+// - |process_delegate| must be a process delegate of the appropriate type |
+// corresponding to |process_type|; its methods will be called on |
+// |delegate_thread_task_runner|. |
+// - |delegate_thread_task_runner|, |process_delegate|, and |
+// |io_thread_task_runner| should live at least until |
+// |ShutdownIPCSupport()|'s callback has been run or |
+// |ShutdownIPCSupportOnIOThread()| has completed. |
+// - For slave processes (i.e., |process_type| is |ProcessType::SLAVE|), |
+// |platform_handle| should be connected to the handle passed to |
+// |ConnectToSlave()| (in the master process). For other processes, |
+// |platform_handle| is ignored (and should not be valid). |
+MOJO_SYSTEM_IMPL_EXPORT void InitIPCSupport( |
+ ProcessType process_type, |
scoped_refptr<base::TaskRunner> delegate_thread_task_runner, |
- SlaveProcessDelegate* slave_process_delegate, |
+ ProcessDelegate* process_delegate, |
scoped_refptr<base::TaskRunner> io_thread_task_runner, |
ScopedPlatformHandle platform_handle); |
+// Shuts down the subsystem initialized by |InitIPCSupport()|. This must be |
+// called on the I/O thread (given to |InitIPCSupport()|). This completes |
+// synchronously and does not result in a call to the process delegate's |
+// |OnShutdownComplete()|. |
+MOJO_SYSTEM_IMPL_EXPORT void ShutdownIPCSupportOnIOThread(); |
+ |
+// Like |ShutdownIPCSupportOnIOThread()|, but may be called from any thread, |
+// signalling shutdown completion via the process delegate's |
+// |OnShutdownComplete()|. |
+MOJO_SYSTEM_IMPL_EXPORT void ShutdownIPCSupport(); |
+ |
+// Interprocess communication (IPC) functions ---------------------------------- |
+ |
+// Connects to a slave process to the IPC system. This should only be called in |
+// a process initialized (using |InitIPCSupport()|) with process type |
+// |ProcessType::MASTER|. |slave_info| is caller-dependent slave information, |
+// which should remain alive until the master process delegate's |
+// |OnSlaveDisconnect()| is called. |platform_handle| should be a handle to one |
+// end of an OS "pipe"; the slave process should |InitIPCSupport()| with |
+// |ProcessType::SLAVE| and the handle to the other end of this OS "pipe". |
+MOJO_SYSTEM_IMPL_EXPORT void ConnectToSlave( |
+ SlaveInfo slave_info, |
+ ScopedPlatformHandle platform_handle); |
+ |
// A "channel" is a connection on top of an OS "pipe", on top of which Mojo |
// message pipes (etc.) can be multiplexed. It must "live" on some I/O thread. |
// |
@@ -111,48 +175,33 @@ typedef base::Callback<void(ChannelInfo*)> DidCreateChannelCallback; |
MOJO_SYSTEM_IMPL_EXPORT ScopedMessagePipeHandle |
CreateChannel(ScopedPlatformHandle platform_handle, |
scoped_refptr<base::TaskRunner> io_thread_task_runner, |
- DidCreateChannelCallback callback, |
+ const DidCreateChannelCallback& callback, |
scoped_refptr<base::TaskRunner> callback_thread_task_runner); |
// Destroys a channel that was created using |CreateChannel()| (or |
-// |CreateChannelOnIOThread()|); may be called from any thread. |channel_info| |
-// should be the value provided to the callback to |CreateChannel()| (or |
-// returned by |CreateChannelOnIOThread()|). If called from the I/O thread, this |
-// will complete synchronously (in particular, it will post no tasks). |
-// TODO(vtl): If called from some other thread, it'll post tasks to the I/O |
-// thread. This is obviously potentially problematic if you want to shut the I/O |
-// thread down. |
-MOJO_SYSTEM_IMPL_EXPORT void DestroyChannel(ChannelInfo* channel_info); |
+// |CreateChannelOnIOThread()|); must be called from the channel's I'O thread. |
+// |channel_info| should be the value provided to the callback to |
+// |CreateChannel()| (or returned by |CreateChannelOnIOThread()|). Completes |
+// synchronously (and posts no tasks). |
+MOJO_SYSTEM_IMPL_EXPORT void DestroyChannelOnIOThread( |
+ ChannelInfo* channel_info); |
+ |
+typedef base::Closure DidDestroyChannelCallback; |
+// Like |DestroyChannelOnIOThread()|, but asynchronous and may be called from |
+// any thread. The callback will be called using |callback_thread_task_runner| |
+// if that is non-null, or otherwise it will be called on the "channel thread". |
+// The "channel thread" must remain alive and continue to process tasks until |
+// the callback has been executed. |
+MOJO_SYSTEM_IMPL_EXPORT void DestroyChannel( |
+ ChannelInfo* channel_info, |
+ const DidDestroyChannelCallback& callback, |
+ scoped_refptr<base::TaskRunner> callback_thread_task_runner); |
// Inform the channel that it will soon be destroyed (doing so is optional). |
// This may be called from any thread, but the caller must ensure that this is |
// called before |DestroyChannel()|. |
MOJO_SYSTEM_IMPL_EXPORT void WillDestroyChannelSoon(ChannelInfo* channel_info); |
-// Creates a |MojoHandle| that wraps the given |PlatformHandle| (taking |
-// ownership of it). This |MojoHandle| can then, e.g., be passed through message |
-// pipes. Note: This takes ownership (and thus closes) |platform_handle| even on |
-// failure, which is different from what you'd expect from a Mojo API, but it |
-// makes for a more convenient embedder API. |
-MOJO_SYSTEM_IMPL_EXPORT MojoResult |
-CreatePlatformHandleWrapper(ScopedPlatformHandle platform_handle, |
- MojoHandle* platform_handle_wrapper_handle); |
-// Retrieves the |PlatformHandle| that was wrapped into a |MojoHandle| (using |
-// |CreatePlatformHandleWrapper()| above). Note that the |MojoHandle| must still |
-// be closed separately. |
-MOJO_SYSTEM_IMPL_EXPORT MojoResult |
-PassWrappedPlatformHandle(MojoHandle platform_handle_wrapper_handle, |
- ScopedPlatformHandle* platform_handle); |
- |
-// Start waiting the handle asynchronously. On success, |callback| will be |
-// called exactly once, when |handle| satisfies a signal in |signals| or it |
-// becomes known that it will never do so. |callback| will be executed on an |
-// arbitrary thread. It must not call any Mojo system or embedder functions. |
-MOJO_SYSTEM_IMPL_EXPORT MojoResult |
-AsyncWait(MojoHandle handle, |
- MojoHandleSignals signals, |
- base::Callback<void(MojoResult)> callback); |
- |
} // namespace embedder |
} // namespace mojo |