1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165
|
// Copyright 2013 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef MOJO_EDK_SYSTEM_CORE_H_
#define MOJO_EDK_SYSTEM_CORE_H_
#include <stdint.h>
#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 "mojo/edk/system/handle_table.h"
#include "mojo/edk/system/mapping_table.h"
#include "mojo/edk/system/memory.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"
namespace mojo {
namespace embedder {
class PlatformSupport;
}
namespace system {
class Dispatcher;
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):
explicit Core(scoped_ptr<embedder::PlatformSupport> platform_support);
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);
// Looks up the dispatcher for the given handle. Returns null if the handle is
// invalid.
scoped_refptr<Dispatcher> GetDispatcher(MojoHandle handle);
// 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
// awakable.h. In particular, it must not call any Mojo system functions.
MojoResult AsyncWait(MojoHandle handle,
MojoHandleSignals signals,
base::Callback<void(MojoResult)> callback);
embedder::PlatformSupport* platform_support() const {
return platform_support_.get();
}
// ---------------------------------------------------------------------------
// System calls implementation:
MojoTimeTicks GetTimeTicksNow();
MojoResult Close(MojoHandle handle);
MojoResult Wait(MojoHandle handle,
MojoHandleSignals signals,
MojoDeadline deadline,
UserPointer<MojoHandleSignalsState> signals_state);
MojoResult WaitMany(UserPointer<const MojoHandle> handles,
UserPointer<const MojoHandleSignals> signals,
uint32_t num_handles,
MojoDeadline deadline,
UserPointer<uint32_t> result_index,
UserPointer<MojoHandleSignalsState> signals_states);
MojoResult CreateMessagePipe(
UserPointer<const MojoCreateMessagePipeOptions> options,
UserPointer<MojoHandle> message_pipe_handle0,
UserPointer<MojoHandle> message_pipe_handle1);
MojoResult WriteMessage(MojoHandle message_pipe_handle,
UserPointer<const void> bytes,
uint32_t num_bytes,
UserPointer<const MojoHandle> handles,
uint32_t num_handles,
MojoWriteMessageFlags flags);
MojoResult ReadMessage(MojoHandle message_pipe_handle,
UserPointer<void> bytes,
UserPointer<uint32_t> num_bytes,
UserPointer<MojoHandle> handles,
UserPointer<uint32_t> num_handles,
MojoReadMessageFlags flags);
MojoResult CreateDataPipe(
UserPointer<const MojoCreateDataPipeOptions> options,
UserPointer<MojoHandle> data_pipe_producer_handle,
UserPointer<MojoHandle> data_pipe_consumer_handle);
MojoResult WriteData(MojoHandle data_pipe_producer_handle,
UserPointer<const void> elements,
UserPointer<uint32_t> num_bytes,
MojoWriteDataFlags flags);
MojoResult BeginWriteData(MojoHandle data_pipe_producer_handle,
UserPointer<void*> buffer,
UserPointer<uint32_t> buffer_num_bytes,
MojoWriteDataFlags flags);
MojoResult EndWriteData(MojoHandle data_pipe_producer_handle,
uint32_t num_bytes_written);
MojoResult ReadData(MojoHandle data_pipe_consumer_handle,
UserPointer<void> elements,
UserPointer<uint32_t> num_bytes,
MojoReadDataFlags flags);
MojoResult BeginReadData(MojoHandle data_pipe_consumer_handle,
UserPointer<const void*> buffer,
UserPointer<uint32_t> buffer_num_bytes,
MojoReadDataFlags flags);
MojoResult EndReadData(MojoHandle data_pipe_consumer_handle,
uint32_t num_bytes_read);
MojoResult CreateSharedBuffer(
UserPointer<const MojoCreateSharedBufferOptions> options,
uint64_t num_bytes,
UserPointer<MojoHandle> shared_buffer_handle);
MojoResult DuplicateBufferHandle(
MojoHandle buffer_handle,
UserPointer<const MojoDuplicateBufferHandleOptions> options,
UserPointer<MojoHandle> new_buffer_handle);
MojoResult MapBuffer(MojoHandle buffer_handle,
uint64_t offset,
uint64_t num_bytes,
UserPointer<void*> buffer,
MojoMapBufferFlags flags);
MojoResult UnmapBuffer(UserPointer<void> buffer);
private:
friend bool internal::ShutdownCheckNoLeaks(Core*);
// 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)|.
MojoResult WaitManyInternal(const MojoHandle* handles,
const MojoHandleSignals* signals,
uint32_t num_handles,
MojoDeadline deadline,
uint32_t* result_index,
HandleSignalsState* signals_states);
const scoped_ptr<embedder::PlatformSupport> platform_support_;
// 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 mapping_table_lock_; // Protects |mapping_table_|.
MappingTable mapping_table_;
DISALLOW_COPY_AND_ASSIGN(Core);
};
} // namespace system
} // namespace mojo
#endif // MOJO_EDK_SYSTEM_CORE_H_
|