Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(467)

Unified Diff: mojo/edk/system/core.h

Issue 1585493002: [mojo] Ports EDK (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 4 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: mojo/edk/system/core.h
diff --git a/mojo/edk/system/core.h b/mojo/edk/system/core.h
index 7c5a2357a6bb046e818ee9807f1d08834c82c635..98fe22fddf4c71f1ed41bd1544b090cdc7f18ba7 100644
--- a/mojo/edk/system/core.h
+++ b/mojo/edk/system/core.h
@@ -5,49 +5,99 @@
#ifndef MOJO_EDK_SYSTEM_CORE_H_
#define MOJO_EDK_SYSTEM_CORE_H_
-#include <stdint.h>
+#include <vector>
#include "base/callback.h"
+#include "base/macros.h"
#include "base/memory/ref_counted.h"
#include "base/memory/scoped_ptr.h"
#include "base/synchronization/lock.h"
+#include "base/task_runner.h"
+#include "mojo/edk/embedder/scoped_platform_handle.h"
+#include "mojo/edk/system/dispatcher.h"
+#include "mojo/edk/system/handle_signals_state.h"
#include "mojo/edk/system/handle_table.h"
#include "mojo/edk/system/mapping_table.h"
+#include "mojo/edk/system/node_controller.h"
#include "mojo/edk/system/system_impl_export.h"
#include "mojo/public/c/system/buffer.h"
#include "mojo/public/c/system/data_pipe.h"
#include "mojo/public/c/system/message_pipe.h"
#include "mojo/public/c/system/types.h"
-#include "mojo/public/cpp/system/macros.h"
+#include "mojo/public/cpp/system/message_pipe.h"
namespace mojo {
-
namespace edk {
-class Dispatcher;
-class PlatformSupport;
-struct HandleSignalsState;
-
// |Core| is an object that implements the Mojo system calls. All public methods
// are thread-safe.
class MOJO_SYSTEM_IMPL_EXPORT Core {
public:
- // ---------------------------------------------------------------------------
-
- // These methods are only to be used by via the embedder API (and internally):
-
- // |*platform_support| must outlive this object.
- explicit Core(PlatformSupport* platform_support);
+ explicit Core();
virtual ~Core();
- // Adds |dispatcher| to the handle table, returning the handle for it. Returns
- // |MOJO_HANDLE_INVALID| on failure, namely if the handle table is full.
- MojoHandle AddDispatcher(const scoped_refptr<Dispatcher>& dispatcher);
+ // Called exactly once, shortly after construction, and before any other
+ // methods are called on this object.
+ void SetIOTaskRunner(scoped_refptr<base::TaskRunner> io_task_runner);
+
+ // Retrieves the NodeController for the current process.
+ NodeController* GetNodeController();
- // Looks up the dispatcher for the given handle. Returns null if the handle is
- // invalid.
scoped_refptr<Dispatcher> GetDispatcher(MojoHandle handle);
+ // Called in the parent process any time a new child is launched.
+ void AddChild(base::ProcessHandle process_handle,
+ ScopedPlatformHandle platform_handle);
+
+ // Called in a child process exactly once during early initialization.
+ void InitChild(ScopedPlatformHandle platform_handle);
+
+ // These each create message pipe endpoints connected to an endpoint in a
+ // remote embedder. |platform_handle| is used as a channel to negotiate the
+ // connection. This is only here to facilitate legacy embedder code. See
+ // mojo::edk::CreateMessagePipe in mojo/edk/embedder/embedder.h.
+ void CreateParentMessagePipe(
+ ScopedPlatformHandle platform_handle,
+ const base::Callback<void(ScopedMessagePipeHandle)>& callback);
+ void CreateChildMessagePipe(
+ ScopedPlatformHandle platform_handle,
+ const base::Callback<void(ScopedMessagePipeHandle)>& callback);
+
+ // Creates a message pipe endpoint associated with |token|, which a child
+ // holding the token can later locate and connect to.
+ void CreateParentMessagePipe(
+ const std::string& token,
+ const base::Callback<void(ScopedMessagePipeHandle)>& callback);
+
+ // Creates a message pipe endpoint associated with |token|, which will be
+ // passed to the parent in order to find an associated remote port and connect
+ // to it.
+ void CreateChildMessagePipe(
+ const std::string& token,
+ const base::Callback<void(ScopedMessagePipeHandle)>& callback);
+
+ MojoHandle AddDispatcher(scoped_refptr<Dispatcher> dispatcher);
+
+ // Adds new dispatchers for non-message-pipe handles received in a message.
+ // |dispatchers| and |handles| should be the same size.
+ bool AddDispatchersFromTransit(
+ const std::vector<Dispatcher::DispatcherInTransit>& dispatchers,
+ MojoHandle* handles);
+
+ MojoResult CreatePlatformHandleWrapper(ScopedPlatformHandle platform_handle,
+ MojoHandle* wrapper_handle);
+
+ MojoResult PassWrappedPlatformHandle(MojoHandle wrapper_handle,
+ ScopedPlatformHandle* platform_handle);
+
+ // Requests that the EDK tear itself down. |callback| will be called once
+ // the shutdown process is complete. Note that |callback| is always called
+ // asynchronously on the calling thread if said thread is running a message
+ // loop, and the calling thread must continue running a MessageLoop at least
+ // until the callback is called. If there is no running loop, the |callback|
+ // may be called from any thread. Beware!
+ void RequestShutdown(const base::Closure& callback);
+
// Watches on the given handle for the given signals, calling |callback| when
// a signal is satisfied or when all signals become unsatisfiable. |callback|
// must satisfy stringent requirements -- see |Awakable::Awake()| in
@@ -56,10 +106,6 @@ class MOJO_SYSTEM_IMPL_EXPORT Core {
MojoHandleSignals signals,
const base::Callback<void(MojoResult)>& callback);
- PlatformSupport* platform_support() const {
- return platform_support_;
- }
-
// ---------------------------------------------------------------------------
// The following methods are essentially implementations of the Mojo Core
@@ -160,31 +206,32 @@ class MOJO_SYSTEM_IMPL_EXPORT Core {
MojoMapBufferFlags flags);
MojoResult UnmapBuffer(void* buffer);
- private:
- friend bool internal::ShutdownCheckNoLeaks(Core*);
+ void GetActiveHandlesForTest(std::vector<MojoHandle>* handles);
- // Internal implementation of |Wait()| and |WaitMany()|; doesn't do basic
- // validation of arguments. |*result_index| is only set if the result (whether
- // success or failure) applies to a specific handle, so its value should be
- // preinitialized to |static_cast<uint32_t>(-1)|.
+ private:
MojoResult WaitManyInternal(const MojoHandle* handles,
const MojoHandleSignals* signals,
uint32_t num_handles,
MojoDeadline deadline,
- uint32_t* result_index,
+ uint32_t *result_index,
HandleSignalsState* signals_states);
- PlatformSupport* const platform_support_;
+ // Used to pass ownership of our NodeController over to the IO thread in the
+ // event that we're torn down before said thread.
+ static void PassNodeControllerToIOThread(
+ scoped_ptr<NodeController> node_controller);
+
+ // This is lazily initialized on first access. Always use GetNodeController()
+ // to access it.
+ scoped_ptr<NodeController> node_controller_;
- // TODO(vtl): |handle_table_lock_| should be a reader-writer lock (if only we
- // had them).
- base::Lock handle_table_lock_; // Protects |handle_table_|.
- HandleTable handle_table_;
+ base::Lock handles_lock_;
+ HandleTable handles_;
base::Lock mapping_table_lock_; // Protects |mapping_table_|.
MappingTable mapping_table_;
- MOJO_DISALLOW_COPY_AND_ASSIGN(Core);
+ DISALLOW_COPY_AND_ASSIGN(Core);
};
} // namespace edk

Powered by Google App Engine
This is Rietveld 408576698