| Index: mojo/system/core_impl.h
|
| diff --git a/mojo/system/core_impl.h b/mojo/system/core_impl.h
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..1417a06d60a7fa44bc4a328bc17d61a0108ee9e4
|
| --- /dev/null
|
| +++ b/mojo/system/core_impl.h
|
| @@ -0,0 +1,104 @@
|
| +// 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_SYSTEM_CORE_IMPL_H_
|
| +#define MOJO_SYSTEM_CORE_IMPL_H_
|
| +
|
| +#include "base/basictypes.h"
|
| +#include "base/containers/hash_tables.h"
|
| +#include "base/memory/ref_counted.h"
|
| +#include "base/synchronization/lock.h"
|
| +#include "mojo/public/system/core.h"
|
| +
|
| +namespace mojo {
|
| +namespace system {
|
| +
|
| +class CoreImpl;
|
| +class Dispatcher;
|
| +
|
| +namespace test {
|
| +class CoreTestBase;
|
| +}
|
| +
|
| +// |CoreImpl| is a singleton object that implements the Mojo system calls. With
|
| +// the (obvious) exception of |Init()|, which must be called first (and the call
|
| +// completed) before making any other calls, all the public methods are
|
| +// thread-safe.
|
| +class CoreImpl {
|
| + public:
|
| + static void Init();
|
| +
|
| + static CoreImpl* Get() {
|
| + return singleton_;
|
| + }
|
| +
|
| + MojoResult Close(MojoHandle handle);
|
| +
|
| + MojoResult Wait(MojoHandle handle,
|
| + MojoWaitFlags flags,
|
| + MojoDeadline deadline);
|
| +
|
| + MojoResult WaitMany(const MojoHandle* handles,
|
| + const MojoWaitFlags* flags,
|
| + uint32_t num_handles,
|
| + MojoDeadline deadline);
|
| +
|
| + MojoResult CreateMessagePipe(MojoHandle* handle_0, MojoHandle* handle_1);
|
| +
|
| + MojoResult WriteMessage(MojoHandle handle,
|
| + const void* bytes, uint32_t num_bytes,
|
| + const MojoHandle* handles, uint32_t num_handles,
|
| + MojoWriteMessageFlags flags);
|
| +
|
| + MojoResult ReadMessage(MojoHandle handle,
|
| + void* bytes, uint32_t* num_bytes,
|
| + MojoHandle* handles, uint32_t* num_handles,
|
| + MojoReadMessageFlags flags);
|
| +
|
| + private:
|
| + friend class test::CoreTestBase;
|
| +
|
| + typedef base::hash_map<MojoHandle, scoped_refptr<Dispatcher> >
|
| + HandleTableMap;
|
| +
|
| + CoreImpl();
|
| + ~CoreImpl();
|
| +
|
| + // Looks up the dispatcher for the given handle. Returns null if the handle is
|
| + // invalid.
|
| + scoped_refptr<Dispatcher> GetDispatcher(MojoHandle handle);
|
| +
|
| + // Assigns a new handle for the given dispatcher (which must be valid);
|
| + // returns |MOJO_HANDLE_INVALID| on failure (due to hitting resource limits).
|
| + // Must be called under |handle_table_lock_|.
|
| + MojoHandle AddDispatcherNoLock(scoped_refptr<Dispatcher> dispatcher);
|
| +
|
| + // Internal implementation of |Wait()| and |WaitMany()|; doesn't do basic
|
| + // validation of arguments.
|
| + MojoResult WaitManyInternal(const MojoHandle* handles,
|
| + const MojoWaitFlags* flags,
|
| + uint32_t num_handles,
|
| + MojoDeadline deadline);
|
| +
|
| + // ---------------------------------------------------------------------------
|
| +
|
| + static CoreImpl* singleton_;
|
| +
|
| + // ---------------------------------------------------------------------------
|
| +
|
| + // TODO(vtl): |handle_table_lock_| should be a reader-writer lock (if only we
|
| + // had them).
|
| + base::Lock handle_table_lock_; // Protects the immediately-following members.
|
| + HandleTableMap handle_table_;
|
| + MojoHandle next_handle_; // Invariant: never |MOJO_HANDLE_INVALID|.
|
| +
|
| + // ---------------------------------------------------------------------------
|
| +
|
| + DISALLOW_COPY_AND_ASSIGN(CoreImpl);
|
| +};
|
| +
|
| +} // namespace system
|
| +} // namespace mojo
|
| +
|
| +#endif // MOJO_SYSTEM_CORE_IMPL_H_
|
|
|