summaryrefslogtreecommitdiffstats
path: root/mojo
diff options
context:
space:
mode:
authordarin@chromium.org <darin@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2014-01-14 16:27:51 +0000
committerdarin@chromium.org <darin@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2014-01-14 16:27:51 +0000
commit0d37563e4df3e98c429f3bd71816451becbe06d7 (patch)
tree8724e2770a1eb259d8ffd267e8dc7a587098e59b /mojo
parent0d55b916994bb03c4b2b5ecac90ad77c1124c453 (diff)
downloadchromium_src-0d37563e4df3e98c429f3bd71816451becbe06d7.zip
chromium_src-0d37563e4df3e98c429f3bd71816451becbe06d7.tar.gz
chromium_src-0d37563e4df3e98c429f3bd71816451becbe06d7.tar.bz2
Mojo: AsyncWaiter and mojo/public/environment
Summary of changes: o BindingsSupport is gone: - mojo/public/bindings/lib depends on mojo/public/environment/, which is also a static library. - mojo/public/environment provides a default implementation of MojoAsyncWaiter (replacing the AsyncWait functionality of BindingsSupport). - mojo/public/environment provides TLS support for storing the current Buffer* (replacing the Set/GetCurrentBuffer functionality of BindingsSupport). - mojo/public/environment provides the Environment class, formerly part of mojo/public/utility/ - The standalone implementation of mojo/public/environment/ depends on mojo/public/utility/ and assumes clients will be instantiating RunLoops on their threads. - The chromium-specific implementation of mojo/public/environment/ depends on mojo/common/ and assumes clients will be instantiating MessageLoops on their threads. - The chromium-specific implementation of mojo/public/environment/ is divided into two targets: mojo_environment_chromium and mojo_environment_chromium_impl. The former is a static library and the latter is a component. (This way all of the state--TLS keys-- associated with the environment is kept in a DSO when using a component build.) o RemotePtr and Connector may optionally be parameterized with a MojoAsyncWaiter*, allowing users to customize how AsyncWait is implemented for a particular usage of bindings. This is needed by the GL library so that it can schedule work on an application defined run loop. o RunLoop gains a RunUntilIdle method to support tests. This allows us to delete SimpleBindingsSupport instead of converting it over to an implementation of MojoAsyncWaiter. Review URL: https://codereview.chromium.org/134253004 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@244739 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'mojo')
-rw-r--r--mojo/apps/js/bindings/support.cc19
-rw-r--r--mojo/apps/js/bindings/waiting_callback.cc7
-rw-r--r--mojo/apps/js/bindings/waiting_callback.h16
-rw-r--r--mojo/apps/js/main.cc4
-rw-r--r--mojo/common/bindings_support_impl.cc80
-rw-r--r--mojo/common/bindings_support_impl.h41
-rw-r--r--mojo/common/common_type_converters_unittest.cc16
-rw-r--r--mojo/environment/async_waiter_impl.cc51
-rw-r--r--mojo/environment/async_waiter_impl.h19
-rw-r--r--mojo/environment/buffer_tls.cc21
-rw-r--r--mojo/environment/buffer_tls_impl.cc30
-rw-r--r--mojo/environment/buffer_tls_impl.h21
-rw-r--r--mojo/environment/default_async_waiter.cc15
-rw-r--r--mojo/environment/default_async_waiter_impl.cc51
-rw-r--r--mojo/environment/default_async_waiter_impl.h19
-rw-r--r--mojo/environment/environment.cc20
-rw-r--r--mojo/environment/mojo_environment_impl_export.h32
-rw-r--r--mojo/examples/aura_demo/aura_demo.cc5
-rw-r--r--mojo/examples/compositor_app/compositor_app.cc5
-rw-r--r--mojo/examples/sample_app/sample_app.cc4
-rw-r--r--mojo/mojo.gyp46
-rw-r--r--mojo/mojo_apps.gypi1
-rw-r--r--mojo/mojo_examples.gypi3
-rw-r--r--mojo/mojo_public.gypi44
-rw-r--r--mojo/mojo_services.gypi1
-rw-r--r--mojo/public/DEPS2
-rw-r--r--mojo/public/README.md27
-rw-r--r--mojo/public/bindings/lib/DEPS5
-rw-r--r--mojo/public/bindings/lib/bindings_support.cc27
-rw-r--r--mojo/public/bindings/lib/bindings_support.h52
-rw-r--r--mojo/public/bindings/lib/buffer.cc9
-rw-r--r--mojo/public/bindings/lib/connector.cc50
-rw-r--r--mojo/public/bindings/lib/connector.h19
-rw-r--r--mojo/public/bindings/lib/remote_ptr.h16
-rw-r--r--mojo/public/environment/DEPS4
-rw-r--r--mojo/public/environment/buffer_tls.h20
-rw-r--r--mojo/public/environment/default_async_waiter.h17
-rw-r--r--mojo/public/environment/environment.h24
-rw-r--r--mojo/public/environment/standalone/DEPS4
-rw-r--r--mojo/public/environment/standalone/buffer_tls.cc34
-rw-r--r--mojo/public/environment/standalone/buffer_tls_setup.h17
-rw-r--r--mojo/public/environment/standalone/default_async_waiter.cc93
-rw-r--r--mojo/public/environment/standalone/environment.cc22
-rw-r--r--mojo/public/system/async_waiter.h40
-rw-r--r--mojo/public/tests/bindings/array_unittest.cc8
-rw-r--r--mojo/public/tests/bindings/buffer_unittest.cc10
-rw-r--r--mojo/public/tests/bindings/connector_unittest.cc9
-rw-r--r--mojo/public/tests/bindings/handle_passing_unittest.cc14
-rw-r--r--mojo/public/tests/bindings/remote_ptr_unittest.cc8
-rw-r--r--mojo/public/tests/bindings/sample_service_unittests.cc4
-rw-r--r--mojo/public/tests/bindings/simple_bindings_support.cc101
-rw-r--r--mojo/public/tests/bindings/simple_bindings_support.h51
-rw-r--r--mojo/public/tests/bindings/type_conversion_unittest.cc4
-rw-r--r--mojo/public/tests/environment/async_waiter_unittest.cc (renamed from mojo/public/tests/utility/bindings_support_impl_unittest.cc)66
-rw-r--r--mojo/public/utility/DEPS3
-rw-r--r--mojo/public/utility/bindings_support_impl.cc111
-rw-r--r--mojo/public/utility/bindings_support_impl.h44
-rw-r--r--mojo/public/utility/environment.cc30
-rw-r--r--mojo/public/utility/environment.h32
-rw-r--r--mojo/public/utility/run_loop.cc68
-rw-r--r--mojo/public/utility/run_loop.h23
-rw-r--r--mojo/services/native_viewport/native_viewport_service.cc6
-rw-r--r--mojo/shell/context.cc2
-rw-r--r--mojo/shell/context.h2
-rw-r--r--mojo/shell/service_manager_unittest.cc4
-rwxr-xr-xmojo/tools/mojob.sh2
66 files changed, 893 insertions, 762 deletions
diff --git a/mojo/apps/js/bindings/support.cc b/mojo/apps/js/bindings/support.cc
index 65f6cae..bdb554b 100644
--- a/mojo/apps/js/bindings/support.cc
+++ b/mojo/apps/js/bindings/support.cc
@@ -14,7 +14,8 @@
#include "gin/wrappable.h"
#include "mojo/apps/js/bindings/handle.h"
#include "mojo/apps/js/bindings/waiting_callback.h"
-#include "mojo/public/bindings/lib/bindings_support.h"
+#include "mojo/public/environment/default_async_waiter.h"
+#include "mojo/public/system/core_cpp.h"
namespace mojo {
namespace js {
@@ -27,8 +28,14 @@ WaitingCallback* AsyncWait(const gin::Arguments& args, mojo::Handle handle,
gin::Handle<WaitingCallback> waiting_callback =
WaitingCallback::Create(args.isolate(), callback);
- BindingsSupport::AsyncWaitID wait_id = BindingsSupport::Get()->AsyncWait(
- handle, flags, waiting_callback.get());
+ MojoAsyncWaiter* waiter = GetDefaultAsyncWaiter();
+ MojoAsyncWaitID wait_id = waiter->AsyncWait(
+ waiter,
+ handle.value(),
+ flags,
+ MOJO_DEADLINE_INDEFINITE,
+ &WaitingCallback::CallOnHandleReady,
+ waiting_callback.get());
waiting_callback->set_wait_id(wait_id);
@@ -38,8 +45,10 @@ WaitingCallback* AsyncWait(const gin::Arguments& args, mojo::Handle handle,
void CancelWait(WaitingCallback* waiting_callback) {
if (!waiting_callback->wait_id())
return;
- BindingsSupport::Get()->CancelWait(waiting_callback->wait_id());
- waiting_callback->set_wait_id(NULL);
+
+ MojoAsyncWaiter* waiter = GetDefaultAsyncWaiter();
+ waiter->CancelWait(waiter, waiting_callback->wait_id());
+ waiting_callback->set_wait_id(0);
}
gin::WrapperInfo g_wrapper_info = { gin::kEmbedderNativeGin };
diff --git a/mojo/apps/js/bindings/waiting_callback.cc b/mojo/apps/js/bindings/waiting_callback.cc
index 6769eb7..87c28bf 100644
--- a/mojo/apps/js/bindings/waiting_callback.cc
+++ b/mojo/apps/js/bindings/waiting_callback.cc
@@ -36,8 +36,13 @@ gin::Handle<WaitingCallback> WaitingCallback::Create(
return gin::CreateHandle(isolate, new WaitingCallback(isolate, callback));
}
+// static
+void WaitingCallback::CallOnHandleReady(void* closure, MojoResult result) {
+ static_cast<WaitingCallback*>(closure)->OnHandleReady(result);
+}
+
void WaitingCallback::OnHandleReady(MojoResult result) {
- wait_id_ = NULL;
+ wait_id_ = 0;
if (!runner_)
return;
diff --git a/mojo/apps/js/bindings/waiting_callback.h b/mojo/apps/js/bindings/waiting_callback.h
index 63b3dda..c841028 100644
--- a/mojo/apps/js/bindings/waiting_callback.h
+++ b/mojo/apps/js/bindings/waiting_callback.h
@@ -8,35 +8,37 @@
#include "gin/handle.h"
#include "gin/runner.h"
#include "gin/wrappable.h"
-#include "mojo/public/bindings/lib/bindings_support.h"
+#include "mojo/public/system/async_waiter.h"
namespace mojo {
namespace js {
-class WaitingCallback : public gin::Wrappable<WaitingCallback>,
- public BindingsSupport::AsyncWaitCallback {
+class WaitingCallback : public gin::Wrappable<WaitingCallback> {
public:
static gin::WrapperInfo kWrapperInfo;
static gin::Handle<WaitingCallback> Create(
v8::Isolate* isolate, v8::Handle<v8::Function> callback);
- BindingsSupport::AsyncWaitID wait_id() const {
+ MojoAsyncWaitID wait_id() const {
return wait_id_;
}
- void set_wait_id(BindingsSupport::AsyncWaitID wait_id) {
+ void set_wait_id(MojoAsyncWaitID wait_id) {
wait_id_ = wait_id;
}
+ // MojoAsyncWaitCallback
+ static void CallOnHandleReady(void* closure, MojoResult result);
+
private:
WaitingCallback(v8::Isolate* isolate, v8::Handle<v8::Function> callback);
virtual ~WaitingCallback();
- virtual void OnHandleReady(MojoResult result) OVERRIDE;
+ void OnHandleReady(MojoResult result);
base::WeakPtr<gin::Runner> runner_;
- BindingsSupport::AsyncWaitID wait_id_;
+ MojoAsyncWaitID wait_id_;
DISALLOW_COPY_AND_ASSIGN(WaitingCallback);
};
diff --git a/mojo/apps/js/main.cc b/mojo/apps/js/main.cc
index 3ecca28..bfc6e2c 100644
--- a/mojo/apps/js/main.cc
+++ b/mojo/apps/js/main.cc
@@ -5,7 +5,6 @@
#include "base/message_loop/message_loop.h"
#include "gin/public/isolate_holder.h"
#include "mojo/apps/js/mojo_runner_delegate.h"
-#include "mojo/common/bindings_support_impl.h"
#include "mojo/public/gles2/gles2.h"
#include "mojo/public/system/core_cpp.h"
#include "mojo/public/system/macros.h"
@@ -38,13 +37,10 @@ void Start(MojoHandle pipe, const std::string& module) {
} // namespace mojo
extern "C" MOJO_APPS_JS_EXPORT MojoResult CDECL MojoMain(MojoHandle pipe) {
- mojo::common::BindingsSupportImpl bindings_support;
- mojo::BindingsSupport::Set(&bindings_support);
MojoGLES2Initialize();
mojo::apps::Start(pipe, "mojo/apps/js/main");
MojoGLES2Terminate();
- mojo::BindingsSupport::Set(NULL);
return MOJO_RESULT_OK;
}
diff --git a/mojo/common/bindings_support_impl.cc b/mojo/common/bindings_support_impl.cc
deleted file mode 100644
index 0e1f6a1..0000000
--- a/mojo/common/bindings_support_impl.cc
+++ /dev/null
@@ -1,80 +0,0 @@
-// 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.
-
-#include "mojo/common/bindings_support_impl.h"
-
-#include "base/atomic_ref_count.h"
-#include "base/bind.h"
-#include "base/lazy_instance.h"
-#include "base/threading/thread_local.h"
-#include "mojo/common/handle_watcher.h"
-
-namespace mojo {
-namespace common {
-namespace {
-base::LazyInstance<base::ThreadLocalPointer<Buffer> >::Leaky lazy_tls_ptr =
- LAZY_INSTANCE_INITIALIZER;
-}
-
-// Context is used to track the number of HandleWatcher objects in use by a
-// particular BindingsSupportImpl instance.
-class BindingsSupportImpl::Context
- : public base::RefCountedThreadSafe<BindingsSupportImpl::Context> {
- public:
- void CallOnHandleReady(HandleWatcher* watcher,
- AsyncWaitCallback* callback,
- MojoResult result) {
- delete watcher;
- callback->OnHandleReady(result);
- }
-
- private:
- friend class base::RefCountedThreadSafe<Context>;
- virtual ~Context() {}
-};
-
-BindingsSupportImpl::BindingsSupportImpl()
- : context_(new Context()) {
-}
-
-BindingsSupportImpl::~BindingsSupportImpl() {
- // All HandleWatcher instances created through this interface should have
- // been destroyed.
- DCHECK(context_->HasOneRef());
-}
-
-Buffer* BindingsSupportImpl::GetCurrentBuffer() {
- return lazy_tls_ptr.Pointer()->Get();
-}
-
-Buffer* BindingsSupportImpl::SetCurrentBuffer(Buffer* buf) {
- Buffer* old_buf = lazy_tls_ptr.Pointer()->Get();
- lazy_tls_ptr.Pointer()->Set(buf);
- return old_buf;
-}
-
-BindingsSupport::AsyncWaitID BindingsSupportImpl::AsyncWait(
- const Handle& handle,
- MojoWaitFlags flags,
- AsyncWaitCallback* callback) {
- // This instance will be deleted when done or cancelled.
- HandleWatcher* watcher = new HandleWatcher();
-
- watcher->Start(handle,
- flags,
- MOJO_DEADLINE_INDEFINITE,
- base::Bind(&Context::CallOnHandleReady,
- context_,
- watcher,
- callback));
- return watcher;
-}
-
-void BindingsSupportImpl::CancelWait(AsyncWaitID async_wait_id) {
- HandleWatcher* watcher = static_cast<HandleWatcher*>(async_wait_id);
- delete watcher;
-}
-
-} // namespace common
-} // namespace mojo
diff --git a/mojo/common/bindings_support_impl.h b/mojo/common/bindings_support_impl.h
deleted file mode 100644
index 2f08ba07..0000000
--- a/mojo/common/bindings_support_impl.h
+++ /dev/null
@@ -1,41 +0,0 @@
-// 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_COMMON_BINDINGS_SUPPORT_IMPL_H_
-#define MOJO_COMMON_BINDINGS_SUPPORT_IMPL_H_
-
-#include "mojo/public/bindings/lib/bindings_support.h"
-
-#include "base/basictypes.h"
-#include "base/compiler_specific.h"
-#include "base/memory/ref_counted.h"
-#include "mojo/common/mojo_common_export.h"
-
-namespace mojo {
-namespace common {
-
-class MOJO_COMMON_EXPORT BindingsSupportImpl
- : NON_EXPORTED_BASE(public BindingsSupport) {
- public:
- BindingsSupportImpl();
- virtual ~BindingsSupportImpl();
-
- // BindingsSupport methods:
- virtual Buffer* GetCurrentBuffer() OVERRIDE;
- virtual Buffer* SetCurrentBuffer(Buffer* buf) OVERRIDE;
- virtual AsyncWaitID AsyncWait(const Handle& handle, MojoWaitFlags flags,
- AsyncWaitCallback* callback) OVERRIDE;
- virtual void CancelWait(AsyncWaitID async_wait_id) OVERRIDE;
-
- private:
- class Context;
- scoped_refptr<Context> context_;
-
- DISALLOW_COPY_AND_ASSIGN(BindingsSupportImpl);
-};
-
-} // namespace common
-} // namespace mojo
-
-#endif // MOJO_COMMON_BINDINGS_SUPPORT_IMPL_H_
diff --git a/mojo/common/common_type_converters_unittest.cc b/mojo/common/common_type_converters_unittest.cc
index 90649fd..39e770a 100644
--- a/mojo/common/common_type_converters_unittest.cc
+++ b/mojo/common/common_type_converters_unittest.cc
@@ -2,7 +2,6 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-#include "mojo/common/bindings_support_impl.h"
#include "mojo/common/common_type_converters.h"
#include "testing/gtest/include/gtest/gtest.h"
@@ -23,20 +22,7 @@ void ExpectEqualsMojoString(const std::string& expected,
} // namespace
-class CommonTypeConvertersTest : public testing::Test {
- private:
- virtual void SetUp() OVERRIDE {
- BindingsSupport::Set(&bindings_support_);
- }
-
- virtual void TearDown() OVERRIDE {
- BindingsSupport::Set(NULL);
- }
-
- BindingsSupportImpl bindings_support_;
-};
-
-TEST_F(CommonTypeConvertersTest, StringPiece) {
+TEST(CommonTypeConvertersTest, StringPiece) {
AllocationScope scope;
std::string kText("hello world");
diff --git a/mojo/environment/async_waiter_impl.cc b/mojo/environment/async_waiter_impl.cc
new file mode 100644
index 0000000..ab0599a
--- /dev/null
+++ b/mojo/environment/async_waiter_impl.cc
@@ -0,0 +1,51 @@
+// Copyright 2014 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.
+
+#include "mojo/environment/async_waiter_impl.h"
+
+#include "base/bind.h"
+#include "mojo/common/handle_watcher.h"
+
+namespace mojo {
+namespace internal {
+namespace {
+
+void OnHandleReady(common::HandleWatcher* watcher,
+ MojoAsyncWaitCallback callback,
+ uintptr_t user_data,
+ MojoResult result) {
+ delete watcher;
+ callback(user_data, result);
+}
+
+MojoAsyncWaitID AsyncWait(MojoAsyncWaiter* waiter,
+ MojoHandle handle,
+ MojoWaitFlags flags,
+ MojoDeadline deadline,
+ MojoAsyncWaitCallback callback,
+ uintptr_t user_data) {
+ // This instance will be deleted when done or cancelled.
+ common::HandleWatcher* watcher = new common::HandleWatcher();
+ watcher->Start(Handle(handle), flags, deadline,
+ base::Bind(&OnHandleReady, watcher, callback, user_data));
+ return reinterpret_cast<MojoAsyncWaitID>(watcher);
+}
+
+void CancelWait(MojoAsyncWaiter* waiter, MojoAsyncWaitID wait_id) {
+ delete reinterpret_cast<common::HandleWatcher*>(wait_id);
+}
+
+MojoAsyncWaiter s_default_async_waiter = {
+ AsyncWait,
+ CancelWait
+};
+
+} // namespace
+
+MojoAsyncWaiter* GetDefaultAsyncWaiterImpl() {
+ return &s_default_async_waiter;
+}
+
+} // namespace internal
+} // namespace mojo
diff --git a/mojo/environment/async_waiter_impl.h b/mojo/environment/async_waiter_impl.h
new file mode 100644
index 0000000..686d3ce
--- /dev/null
+++ b/mojo/environment/async_waiter_impl.h
@@ -0,0 +1,19 @@
+// Copyright 2014 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_ENVIRONMENT_ASYNC_WAITER_IMPL_H_
+#define MOJO_ENVIRONMENT_ASYNC_WAITER_IMPL_H_
+
+#include "mojo/public/environment/async_waiter.h"
+#include "mojo/environment/mojo_environment_impl_export.h"
+
+namespace mojo {
+namespace internal {
+
+MOJO_ENVIRONMENT_IMPL_EXPORT MojoAsyncWaiter* GetDefaultAsyncWaiterImpl();
+
+} // namespace internal
+} // namespace mojo
+
+#endif // MOJO_ENVIRONMENT_ASYNC_WAITER_IMPL_H_
diff --git a/mojo/environment/buffer_tls.cc b/mojo/environment/buffer_tls.cc
new file mode 100644
index 0000000..4d078ef
--- /dev/null
+++ b/mojo/environment/buffer_tls.cc
@@ -0,0 +1,21 @@
+// Copyright 2014 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.
+
+#include "mojo/public/environment/buffer_tls.h"
+
+#include "mojo/environment/buffer_tls_impl.h"
+
+namespace mojo {
+namespace internal {
+
+Buffer* GetCurrentBuffer() {
+ return GetCurrentBufferImpl();
+}
+
+Buffer* SetCurrentBuffer(Buffer* buf) {
+ return SetCurrentBufferImpl(buf);
+}
+
+} // namespace internal
+} // namespace mojo
diff --git a/mojo/environment/buffer_tls_impl.cc b/mojo/environment/buffer_tls_impl.cc
new file mode 100644
index 0000000..f196cb1
--- /dev/null
+++ b/mojo/environment/buffer_tls_impl.cc
@@ -0,0 +1,30 @@
+// Copyright 2014 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.
+
+#include "mojo/environment/buffer_tls_impl.h"
+
+#include "base/lazy_instance.h"
+#include "base/threading/thread_local.h"
+
+namespace mojo {
+namespace internal {
+namespace {
+
+base::LazyInstance<base::ThreadLocalPointer<Buffer> >::Leaky lazy_tls_ptr =
+ LAZY_INSTANCE_INITIALIZER;
+
+} // namespace
+
+Buffer* GetCurrentBufferImpl() {
+ return lazy_tls_ptr.Pointer()->Get();
+}
+
+Buffer* SetCurrentBufferImpl(Buffer* buf) {
+ Buffer* old_buf = lazy_tls_ptr.Pointer()->Get();
+ lazy_tls_ptr.Pointer()->Set(buf);
+ return old_buf;
+}
+
+} // namespace internal
+} // namespace mojo
diff --git a/mojo/environment/buffer_tls_impl.h b/mojo/environment/buffer_tls_impl.h
new file mode 100644
index 0000000..3d24196
--- /dev/null
+++ b/mojo/environment/buffer_tls_impl.h
@@ -0,0 +1,21 @@
+// Copyright 2014 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_ENVIRONMENT_BUFFER_TLS_IMPL_H_
+#define MOJO_ENVIRONMENT_BUFFER_TLS_IMPL_H_
+
+#include "mojo/environment/mojo_environment_impl_export.h"
+
+namespace mojo {
+class Buffer;
+
+namespace internal {
+
+MOJO_ENVIRONMENT_IMPL_EXPORT Buffer* GetCurrentBufferImpl();
+MOJO_ENVIRONMENT_IMPL_EXPORT Buffer* SetCurrentBufferImpl(Buffer* buffer);
+
+} // namespace internal
+} // namespace mojo
+
+#endif // MOJO_ENVIRONMENT_BUFFER_TLS_IMPL_H_
diff --git a/mojo/environment/default_async_waiter.cc b/mojo/environment/default_async_waiter.cc
new file mode 100644
index 0000000..7a46c07
--- /dev/null
+++ b/mojo/environment/default_async_waiter.cc
@@ -0,0 +1,15 @@
+// Copyright 2014 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.
+
+#include "mojo/public/environment/default_async_waiter.h"
+
+#include "mojo/environment/default_async_waiter_impl.h"
+
+namespace mojo {
+
+MojoAsyncWaiter* GetDefaultAsyncWaiter() {
+ return internal::GetDefaultAsyncWaiterImpl();
+}
+
+} // namespace mojo
diff --git a/mojo/environment/default_async_waiter_impl.cc b/mojo/environment/default_async_waiter_impl.cc
new file mode 100644
index 0000000..576dd98
--- /dev/null
+++ b/mojo/environment/default_async_waiter_impl.cc
@@ -0,0 +1,51 @@
+// Copyright 2014 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.
+
+#include "mojo/environment/default_async_waiter_impl.h"
+
+#include "base/bind.h"
+#include "mojo/common/handle_watcher.h"
+
+namespace mojo {
+namespace internal {
+namespace {
+
+void OnHandleReady(common::HandleWatcher* watcher,
+ MojoAsyncWaitCallback callback,
+ void* closure,
+ MojoResult result) {
+ delete watcher;
+ callback(closure, result);
+}
+
+MojoAsyncWaitID AsyncWait(MojoAsyncWaiter* waiter,
+ MojoHandle handle,
+ MojoWaitFlags flags,
+ MojoDeadline deadline,
+ MojoAsyncWaitCallback callback,
+ void* closure) {
+ // This instance will be deleted when done or cancelled.
+ common::HandleWatcher* watcher = new common::HandleWatcher();
+ watcher->Start(Handle(handle), flags, deadline,
+ base::Bind(&OnHandleReady, watcher, callback, closure));
+ return reinterpret_cast<MojoAsyncWaitID>(watcher);
+}
+
+void CancelWait(MojoAsyncWaiter* waiter, MojoAsyncWaitID wait_id) {
+ delete reinterpret_cast<common::HandleWatcher*>(wait_id);
+}
+
+MojoAsyncWaiter s_default_async_waiter = {
+ AsyncWait,
+ CancelWait
+};
+
+} // namespace
+
+MojoAsyncWaiter* GetDefaultAsyncWaiterImpl() {
+ return &s_default_async_waiter;
+}
+
+} // namespace internal
+} // namespace mojo
diff --git a/mojo/environment/default_async_waiter_impl.h b/mojo/environment/default_async_waiter_impl.h
new file mode 100644
index 0000000..cf2f7c2
--- /dev/null
+++ b/mojo/environment/default_async_waiter_impl.h
@@ -0,0 +1,19 @@
+// Copyright 2014 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_ENVIRONMENT_DEFAULT_ASYNC_WAITER_IMPL_H_
+#define MOJO_ENVIRONMENT_DEFAULT_ASYNC_WAITER_IMPL_H_
+
+#include "mojo/environment/mojo_environment_impl_export.h"
+#include "mojo/public/system/async_waiter.h"
+
+namespace mojo {
+namespace internal {
+
+MOJO_ENVIRONMENT_IMPL_EXPORT MojoAsyncWaiter* GetDefaultAsyncWaiterImpl();
+
+} // namespace internal
+} // namespace mojo
+
+#endif // MOJO_ENVIRONMENT_DEFAULT_ASYNC_WAITER_IMPL_H_
diff --git a/mojo/environment/environment.cc b/mojo/environment/environment.cc
new file mode 100644
index 0000000..c65908c
--- /dev/null
+++ b/mojo/environment/environment.cc
@@ -0,0 +1,20 @@
+// Copyright 2014 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.
+
+#include "mojo/public/environment/environment.h"
+
+namespace mojo {
+
+// These methods do nothing as we rely on LazyInstance<T> to instantiate all of
+// our global state in this implementation of the environment library.
+
+Environment::Environment() {
+ // no-op
+}
+
+Environment::~Environment() {
+ // no-op
+}
+
+} // namespace mojo
diff --git a/mojo/environment/mojo_environment_impl_export.h b/mojo/environment/mojo_environment_impl_export.h
new file mode 100644
index 0000000..0255425
--- /dev/null
+++ b/mojo/environment/mojo_environment_impl_export.h
@@ -0,0 +1,32 @@
+// Copyright 2014 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_ENVIRONMENT_MOJO_ENVIRONMENT_IMPL_EXPORT_H_
+#define MOJO_ENVIRONMENT_MOJO_ENVIRONMENT_IMPL_EXPORT_H_
+
+#if defined(COMPONENT_BUILD)
+
+#if defined(WIN32)
+
+#if defined(MOJO_ENVIRONMENT_IMPL_IMPLEMENTATION)
+#define MOJO_ENVIRONMENT_IMPL_EXPORT __declspec(dllexport)
+#else
+#define MOJO_ENVIRONMENT_IMPL_EXPORT __declspec(dllimport)
+#endif
+
+#else // !defined(WIN32)
+
+#if defined(MOJO_ENVIRONMENT_IMPL_IMPLEMENTATION)
+#define MOJO_ENVIRONMENT_IMPL_EXPORT __attribute__((visibility("default")))
+#else
+#define MOJO_ENVIRONMENT_IMPL_EXPORT
+#endif
+
+#endif // defined(WIN32)
+
+#else // !defined(COMPONENT_BUILD)
+#define MOJO_ENVIRONMENT_IMPL_EXPORT
+#endif
+
+#endif // MOJO_ENVIRONMENT_MOJO_ENVIRONMENT_IMPL_EXPORT_H_
diff --git a/mojo/examples/aura_demo/aura_demo.cc b/mojo/examples/aura_demo/aura_demo.cc
index 70da6f9..64fe621 100644
--- a/mojo/examples/aura_demo/aura_demo.cc
+++ b/mojo/examples/aura_demo/aura_demo.cc
@@ -8,12 +8,10 @@
#include "base/at_exit.h"
#include "base/command_line.h"
#include "base/message_loop/message_loop.h"
-#include "mojo/common/bindings_support_impl.h"
#include "mojo/examples/aura_demo/demo_screen.h"
#include "mojo/examples/aura_demo/root_window_host_mojo.h"
#include "mojo/examples/compositor_app/compositor_host.h"
#include "mojo/examples/compositor_app/gles2_client_impl.h"
-#include "mojo/public/bindings/lib/bindings_support.h"
#include "mojo/public/bindings/lib/remote_ptr.h"
#include "mojo/public/gles2/gles2.h"
#include "mojo/public/system/core.h"
@@ -197,8 +195,6 @@ extern "C" AURA_DEMO_EXPORT MojoResult CDECL MojoMain(
CommandLine::Init(0, NULL);
base::AtExitManager at_exit;
base::MessageLoop loop;
- mojo::common::BindingsSupportImpl bindings_support_impl;
- mojo::BindingsSupport::Set(&bindings_support_impl);
MojoGLES2Initialize();
// TODO(beng): This crashes in a DCHECK on X11 because this thread's
@@ -210,6 +206,5 @@ extern "C" AURA_DEMO_EXPORT MojoResult CDECL MojoMain(
loop.Run();
MojoGLES2Terminate();
- mojo::BindingsSupport::Set(NULL);
return MOJO_RESULT_OK;
}
diff --git a/mojo/examples/compositor_app/compositor_app.cc b/mojo/examples/compositor_app/compositor_app.cc
index 2865fb9..d2547fd 100644
--- a/mojo/examples/compositor_app/compositor_app.cc
+++ b/mojo/examples/compositor_app/compositor_app.cc
@@ -6,10 +6,8 @@
#include <string>
#include "base/message_loop/message_loop.h"
-#include "mojo/common/bindings_support_impl.h"
#include "mojo/examples/compositor_app/compositor_host.h"
#include "mojo/examples/compositor_app/gles2_client_impl.h"
-#include "mojo/public/bindings/lib/bindings_support.h"
#include "mojo/public/bindings/lib/remote_ptr.h"
#include "mojo/public/gles2/gles2.h"
#include "mojo/public/system/core.h"
@@ -98,8 +96,6 @@ class SampleApp : public ShellClient {
extern "C" SAMPLE_APP_EXPORT MojoResult CDECL MojoMain(
MojoHandle shell_handle) {
base::MessageLoop loop;
- mojo::common::BindingsSupportImpl bindings_support_impl;
- mojo::BindingsSupport::Set(&bindings_support_impl);
MojoGLES2Initialize();
mojo::examples::SampleApp app(
@@ -107,6 +103,5 @@ extern "C" SAMPLE_APP_EXPORT MojoResult CDECL MojoMain(
loop.Run();
MojoGLES2Terminate();
- mojo::BindingsSupport::Set(NULL);
return MOJO_RESULT_OK;
}
diff --git a/mojo/examples/sample_app/sample_app.cc b/mojo/examples/sample_app/sample_app.cc
index c9183f2..8b3d763 100644
--- a/mojo/examples/sample_app/sample_app.cc
+++ b/mojo/examples/sample_app/sample_app.cc
@@ -6,12 +6,11 @@
#include <string>
#include "mojo/examples/sample_app/gles2_client_impl.h"
-#include "mojo/public/bindings/lib/bindings_support.h"
#include "mojo/public/bindings/lib/remote_ptr.h"
+#include "mojo/public/environment/environment.h"
#include "mojo/public/gles2/gles2.h"
#include "mojo/public/system/core.h"
#include "mojo/public/system/macros.h"
-#include "mojo/public/utility/environment.h"
#include "mojo/public/utility/run_loop.h"
#include "mojom/native_viewport.h"
#include "mojom/shell.h"
@@ -94,6 +93,5 @@ extern "C" SAMPLE_APP_EXPORT MojoResult CDECL MojoMain(
loop.Run();
MojoGLES2Terminate();
- mojo::BindingsSupport::Set(NULL);
return MOJO_RESULT_OK;
}
diff --git a/mojo/mojo.gyp b/mojo/mojo.gyp
index 1b06f5f..415ab66 100644
--- a/mojo/mojo.gyp
+++ b/mojo/mojo.gyp
@@ -35,6 +35,7 @@
'mojo_js_unittests',
'mojo_public_test_support',
'mojo_public_bindings_unittests',
+ 'mojo_public_environment_unittests',
'mojo_public_system_perftests',
'mojo_public_system_unittests',
'mojo_public_utility_unittests',
@@ -197,8 +198,6 @@
'mojo_system',
],
'sources': [
- 'common/bindings_support_impl.cc',
- 'common/bindings_support_impl.h',
'common/common_type_converters.cc',
'common/common_type_converters.h',
'common/handle_watcher.cc',
@@ -239,6 +238,7 @@
'../base/base.gyp:base_message_loop_tests',
'../testing/gtest.gyp:gtest',
'mojo_bindings',
+ 'mojo_environment_chromium',
'mojo_common_lib',
'mojo_common_test_support',
'mojo_public_test_support',
@@ -262,6 +262,45 @@
],
},
{
+ 'target_name': 'mojo_environment_chromium',
+ 'type': 'static_library',
+ 'dependencies': [
+ 'mojo_environment_chromium_impl',
+ ],
+ 'sources': [
+ 'environment/default_async_waiter.cc',
+ 'environment/buffer_tls.cc',
+ 'environment/environment.cc',
+ ],
+ 'include_dirs': [
+ '..',
+ ],
+ 'export_dependent_settings': [
+ 'mojo_environment_chromium_impl',
+ ],
+ },
+ {
+ 'target_name': 'mojo_environment_chromium_impl',
+ 'type': '<(component)',
+ 'defines': [
+ 'MOJO_ENVIRONMENT_IMPL_IMPLEMENTATION',
+ ],
+ 'dependencies': [
+ '../base/base.gyp:base',
+ '../base/third_party/dynamic_annotations/dynamic_annotations.gyp:dynamic_annotations',
+ 'mojo_common_lib'
+ ],
+ 'sources': [
+ 'environment/default_async_waiter_impl.cc',
+ 'environment/default_async_waiter_impl.h',
+ 'environment/buffer_tls_impl.cc',
+ 'environment/buffer_tls_impl.h',
+ ],
+ 'include_dirs': [
+ '..',
+ ],
+ },
+ {
'target_name': 'mojo_shell_lib',
'type': 'static_library',
'dependencies': [
@@ -326,6 +365,7 @@
'../ui/gl/gl.gyp:gl',
'../url/url.gyp:url_lib',
'mojo_common_lib',
+ 'mojo_environment_chromium',
'mojo_shell_lib',
'mojo_system',
'mojo_system_impl',
@@ -349,6 +389,7 @@
'../base/base.gyp:base',
'../testing/gtest.gyp:gtest',
'mojo_common_lib',
+ 'mojo_environment_chromium',
'mojo_run_all_unittests',
'mojo_shell_lib',
],
@@ -409,6 +450,7 @@
'../ui/gfx/gfx.gyp:gfx_geometry',
'../ui/gl/gl.gyp:gl',
'mojo_common_lib',
+ 'mojo_environment_chromium',
'mojo_jni_headers',
'mojo_shell_bindings',
'mojo_shell_lib',
diff --git a/mojo/mojo_apps.gypi b/mojo/mojo_apps.gypi
index f53960c..17c8b93 100644
--- a/mojo/mojo_apps.gypi
+++ b/mojo/mojo_apps.gypi
@@ -10,6 +10,7 @@
'../ui/gl/gl.gyp:gl',
'../v8/tools/gyp/v8.gyp:v8',
'mojo_common_lib',
+ 'mojo_environment_chromium',
'mojo_gles2',
'mojo_gles2_bindings',
'mojo_native_viewport_bindings',
diff --git a/mojo/mojo_examples.gypi b/mojo/mojo_examples.gypi
index 48bd657..de0e1e3 100644
--- a/mojo/mojo_examples.gypi
+++ b/mojo/mojo_examples.gypi
@@ -12,6 +12,7 @@
'../ui/gfx/gfx.gyp:gfx',
'../ui/gfx/gfx.gyp:gfx_geometry',
'../ui/gl/gl.gyp:gl',
+ 'mojo_environment_chromium',
'mojo_gles2',
'mojo_gles2_bindings',
'mojo_native_viewport_bindings',
@@ -47,6 +48,7 @@
'../ui/gfx/gfx.gyp:gfx_geometry',
'../ui/gl/gl.gyp:gl',
'mojo_common_lib',
+ 'mojo_environment_chromium',
'mojo_gles2',
'mojo_gles2_bindings',
'mojo_native_viewport_bindings',
@@ -91,6 +93,7 @@
'../ui/ui.gyp:ui',
'../webkit/common/gpu/webkit_gpu.gyp:webkit_gpu',
'mojo_common_lib',
+ 'mojo_environment_chromium',
'mojo_gles2',
'mojo_gles2_bindings',
'mojo_native_viewport_bindings',
diff --git a/mojo/mojo_public.gypi b/mojo/mojo_public.gypi
index 488f373..88302e4 100644
--- a/mojo/mojo_public.gypi
+++ b/mojo/mojo_public.gypi
@@ -15,6 +15,7 @@
],
},
'sources': [
+ 'public/system/async_waiter.h',
'public/system/core.h',
'public/system/core_cpp.h',
'public/system/core_private.cc',
@@ -42,10 +43,12 @@
'dependencies': [
'../testing/gtest.gyp:gtest',
'mojo_bindings',
+ 'mojo_environment_standalone',
'mojo_public_test_support',
'mojo_run_all_unittests',
'mojo_sample_service',
'mojo_system',
+ 'mojo_utility',
],
'sources': [
'public/tests/bindings/array_unittest.cc',
@@ -57,13 +60,27 @@
'public/tests/bindings/math_calculator.mojom',
'public/tests/bindings/sample_factory.mojom',
'public/tests/bindings/sample_service_unittests.cc',
- 'public/tests/bindings/simple_bindings_support.cc',
- 'public/tests/bindings/simple_bindings_support.h',
'public/tests/bindings/test_structs.mojom',
],
'includes': [ 'public/bindings/mojom_bindings_generator.gypi' ],
},
{
+ 'target_name': 'mojo_public_environment_unittests',
+ 'type': 'executable',
+ 'dependencies': [
+ '../base/base.gyp:base',
+ '../testing/gtest.gyp:gtest',
+ 'mojo_environment_standalone',
+ 'mojo_public_test_support',
+ 'mojo_run_all_unittests',
+ 'mojo_system',
+ 'mojo_utility',
+ ],
+ 'sources': [
+ 'public/tests/environment/async_waiter_unittest.cc',
+ ],
+ },
+ {
'target_name': 'mojo_public_system_unittests',
'type': 'executable',
'dependencies': [
@@ -92,7 +109,6 @@
'mojo_utility',
],
'sources': [
- 'public/tests/utility/bindings_support_impl_unittest.cc',
'public/tests/utility/run_loop_unittest.cc',
'public/tests/utility/thread_local_unittest.cc',
],
@@ -126,8 +142,6 @@
'public/bindings/lib/bindings_internal.h',
'public/bindings/lib/bindings_serialization.cc',
'public/bindings/lib/bindings_serialization.h',
- 'public/bindings/lib/bindings_support.cc',
- 'public/bindings/lib/bindings_support.h',
'public/bindings/lib/buffer.cc',
'public/bindings/lib/buffer.h',
'public/bindings/lib/connector.cc',
@@ -153,13 +167,25 @@
],
},
{
+ 'target_name': 'mojo_environment_standalone',
+ 'type': 'static_library',
+ 'sources': [
+ 'public/environment/default_async_waiter.h',
+ 'public/environment/buffer_tls.h',
+ 'public/environment/environment.h',
+ 'public/environment/standalone/default_async_waiter.cc',
+ 'public/environment/standalone/buffer_tls.cc',
+ 'public/environment/standalone/buffer_tls_setup.h',
+ 'public/environment/standalone/environment.cc',
+ ],
+ 'include_dirs': [
+ '..',
+ ],
+ },
+ {
'target_name': 'mojo_utility',
'type': 'static_library',
'sources': [
- 'public/utility/bindings_support_impl.cc',
- 'public/utility/bindings_support_impl.h',
- 'public/utility/environment.cc',
- 'public/utility/environment.h',
'public/utility/run_loop.cc',
'public/utility/run_loop.h',
'public/utility/run_loop_handler.h',
diff --git a/mojo/mojo_services.gypi b/mojo/mojo_services.gypi
index 10714755..bd5dfa9 100644
--- a/mojo/mojo_services.gypi
+++ b/mojo/mojo_services.gypi
@@ -53,6 +53,7 @@
'../ui/gfx/gfx.gyp:gfx',
'../ui/gfx/gfx.gyp:gfx_geometry',
'mojo_common_lib',
+ 'mojo_environment_chromium',
'mojo_gles2_service',
'mojo_native_viewport_bindings',
'mojo_shell_bindings',
diff --git a/mojo/public/DEPS b/mojo/public/DEPS
index 4458cb2..0c679b9 100644
--- a/mojo/public/DEPS
+++ b/mojo/public/DEPS
@@ -2,7 +2,5 @@ include_rules = [
"-base",
"-build",
"-mojo",
-
"+mojo/public",
- "+testing",
]
diff --git a/mojo/public/README.md b/mojo/public/README.md
index 08f9881..32fc4b1 100644
--- a/mojo/public/README.md
+++ b/mojo/public/README.md
@@ -7,15 +7,25 @@ several components to the API:
Bindings
--------
-This directory contains a static library that clients can link into their
-binary. The contents of this directory are not binary stable because each
-client is free to use whichever version they prefer.
+This directory contains a static library that clients may link into their
+binary. The contents of this directory are not binary stable as each client is
+free to use whichever version they prefer.
This directory also contains a compiler that translates mojom interface
definition files into idiomatic bindings for various languages, including
C++ and JavaScript. Clients are expected to statically link with the generated
code, which reads and writes the binary stable IPC message format.
+Environment
+-----------
+
+This directory contains a static library that clients may link into their
+binary. The contents of this directory are not binary stable as each client is
+free to use whichever version they prefer.
+
+The environment static library represents the shared state that is needed to
+support the Bindings and GLES2 libraries. It depends on the Utility library.
+
GLES2
-----
@@ -39,3 +49,14 @@ Tests
This directory contains tests for code contained in the public API. Mojo
clients are expected to ignore this directory.
+
+Utility
+-------
+
+This directory contains a static library that clients may link into their
+binary. The contents of this directory are not binary stable as each client is
+free to use whichever version they prefer.
+
+The Utility static library most notably defines an implementation of a RunLoop
+based on the MojoWaitMany that clients may use as the basis for asynchronous
+message processing.
diff --git a/mojo/public/bindings/lib/DEPS b/mojo/public/bindings/lib/DEPS
new file mode 100644
index 0000000..7f810b1
--- /dev/null
+++ b/mojo/public/bindings/lib/DEPS
@@ -0,0 +1,5 @@
+include_rules = [
+ "-mojo"
+ "+mojo/public/environment"
+ "+mojo/public/system"
+]
diff --git a/mojo/public/bindings/lib/bindings_support.cc b/mojo/public/bindings/lib/bindings_support.cc
deleted file mode 100644
index 8ea2013..0000000
--- a/mojo/public/bindings/lib/bindings_support.cc
+++ /dev/null
@@ -1,27 +0,0 @@
-// 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.
-
-#include "mojo/public/bindings/lib/bindings_support.h"
-
-#include <assert.h>
-#include <stddef.h>
-
-namespace mojo {
-
-namespace {
-BindingsSupport* g_bindings_support = NULL;
-}
-
-// static
-void BindingsSupport::Set(BindingsSupport* support) {
- g_bindings_support = support;
-}
-
-// static
-BindingsSupport* BindingsSupport::Get() {
- assert(g_bindings_support);
- return g_bindings_support;
-}
-
-} // namespace mojo
diff --git a/mojo/public/bindings/lib/bindings_support.h b/mojo/public/bindings/lib/bindings_support.h
deleted file mode 100644
index 555131d..0000000
--- a/mojo/public/bindings/lib/bindings_support.h
+++ /dev/null
@@ -1,52 +0,0 @@
-// 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_PUBLIC_BINDINGS_LIB_BINDINGS_SUPPORT_H_
-#define MOJO_PUBLIC_BINDINGS_LIB_BINDINGS_SUPPORT_H_
-
-#include "mojo/public/system/core_cpp.h"
-
-namespace mojo {
-class Buffer;
-
-// An embedder of the bindings library MUST implement BindingsSupport and call
-// BindingsSupport::Set prior to using the library.
-class BindingsSupport {
- public:
- class AsyncWaitCallback {
- public:
- virtual ~AsyncWaitCallback() {}
- virtual void OnHandleReady(MojoResult result) = 0;
- };
-
- typedef void* AsyncWaitID;
-
- static void Set(BindingsSupport* support);
- static BindingsSupport* Get();
-
- // Get/set the current thread's Buffer pointer. SetCurrentBuffer returns the
- // previously current Buffer.
- virtual Buffer* GetCurrentBuffer() = 0;
- virtual Buffer* SetCurrentBuffer(Buffer* buf) = 0;
-
- // Asynchronously call MojoWait on a background thread, and pass the result
- // of MojoWait to the given AsyncWaitCallback on the current thread. Returns
- // an AsyncWaitID that can be used with CancelWait to stop waiting. This
- // identifier becomes invalid once the callback runs.
- virtual AsyncWaitID AsyncWait(const Handle& handle,
- MojoWaitFlags flags,
- AsyncWaitCallback* callback) = 0;
-
- // Cancel an existing call to AsyncWait with the given AsyncWaitID. The
- // corresponding AsyncWaitCallback's OnHandleReady method will not be called
- // in this case.
- virtual void CancelWait(AsyncWaitID id) = 0;
-
- protected:
- virtual ~BindingsSupport() {}
-};
-
-} // namespace mojo
-
-#endif // MOJO_PUBLIC_BINDINGS_LIB_BINDINGS_SUPPORT_H_
diff --git a/mojo/public/bindings/lib/buffer.cc b/mojo/public/bindings/lib/buffer.cc
index 6b303fb..bb7a53a 100644
--- a/mojo/public/bindings/lib/buffer.cc
+++ b/mojo/public/bindings/lib/buffer.cc
@@ -11,7 +11,7 @@
#include <algorithm>
#include "mojo/public/bindings/lib/bindings_serialization.h"
-#include "mojo/public/bindings/lib/bindings_support.h"
+#include "mojo/public/environment/buffer_tls.h"
// Scrub memory in debug builds to help catch use-after-free bugs.
#ifdef NDEBUG
@@ -25,17 +25,16 @@ namespace mojo {
//-----------------------------------------------------------------------------
Buffer::Buffer() {
- previous_ = BindingsSupport::Get()->SetCurrentBuffer(this);
+ previous_ = internal::SetCurrentBuffer(this);
}
Buffer::~Buffer() {
- Buffer* buf MOJO_ALLOW_UNUSED =
- BindingsSupport::Get()->SetCurrentBuffer(previous_);
+ Buffer* buf MOJO_ALLOW_UNUSED = internal::SetCurrentBuffer(previous_);
assert(buf == this);
}
Buffer* Buffer::current() {
- return BindingsSupport::Get()->GetCurrentBuffer();
+ return internal::GetCurrentBuffer();
}
//-----------------------------------------------------------------------------
diff --git a/mojo/public/bindings/lib/connector.cc b/mojo/public/bindings/lib/connector.cc
index 1befc2b..e8f54aa 100644
--- a/mojo/public/bindings/lib/connector.cc
+++ b/mojo/public/bindings/lib/connector.cc
@@ -14,8 +14,10 @@ namespace internal {
// ----------------------------------------------------------------------------
-Connector::Connector(ScopedMessagePipeHandle message_pipe)
- : message_pipe_(message_pipe.Pass()),
+Connector::Connector(ScopedMessagePipeHandle message_pipe,
+ MojoAsyncWaiter* waiter)
+ : waiter_(waiter),
+ message_pipe_(message_pipe.Pass()),
incoming_receiver_(NULL),
error_(false) {
}
@@ -54,19 +56,26 @@ void Connector::OnHandleReady(Callback* callback, MojoResult result) {
}
void Connector::WaitToReadMore() {
- read_callback_.SetOwnerToNotify(this);
- read_callback_.SetAsyncWaitID(
- BindingsSupport::Get()->AsyncWait(message_pipe_.get(),
- MOJO_WAIT_FLAG_READABLE,
- &read_callback_));
+ CallAsyncWait(MOJO_WAIT_FLAG_READABLE, &read_callback_);
}
void Connector::WaitToWriteMore() {
- write_callback_.SetOwnerToNotify(this);
- write_callback_.SetAsyncWaitID(
- BindingsSupport::Get()->AsyncWait(message_pipe_.get(),
- MOJO_WAIT_FLAG_WRITABLE,
- &write_callback_));
+ CallAsyncWait(MOJO_WAIT_FLAG_WRITABLE, &write_callback_);
+}
+
+void Connector::CallAsyncWait(MojoWaitFlags flags, Callback* callback) {
+ callback->SetOwnerToNotify(this);
+ callback->SetAsyncWaitID(
+ waiter_->AsyncWait(waiter_,
+ message_pipe_.get().value(),
+ MOJO_WAIT_FLAG_READABLE,
+ MOJO_DEADLINE_INDEFINITE,
+ &Callback::OnHandleReady,
+ callback));
+}
+
+void Connector::CallCancelWait(MojoAsyncWaitID async_wait_id) {
+ waiter_->CancelWait(waiter_, async_wait_id);
}
void Connector::ReadMore() {
@@ -155,7 +164,7 @@ Connector::Callback::Callback()
Connector::Callback::~Callback() {
if (owner_)
- BindingsSupport::Get()->CancelWait(async_wait_id_);
+ owner_->CallCancelWait(async_wait_id_);
}
void Connector::Callback::SetOwnerToNotify(Connector* owner) {
@@ -163,15 +172,20 @@ void Connector::Callback::SetOwnerToNotify(Connector* owner) {
owner_ = owner;
}
-void Connector::Callback::SetAsyncWaitID(BindingsSupport::AsyncWaitID id) {
+void Connector::Callback::SetAsyncWaitID(MojoAsyncWaitID id) {
async_wait_id_ = id;
}
-void Connector::Callback::OnHandleReady(MojoResult result) {
- assert(owner_);
+// static
+void Connector::Callback::OnHandleReady(void* closure, MojoResult result) {
+ Callback* self = static_cast<Callback*>(closure);
+
+ // Reset |owner_| to indicate that we are no longer in the waiting state.
+
+ assert(self->owner_);
Connector* owner = NULL;
- std::swap(owner, owner_);
- owner->OnHandleReady(this, result);
+ std::swap(owner, self->owner_);
+ owner->OnHandleReady(self, result);
}
} // namespace internal
diff --git a/mojo/public/bindings/lib/connector.h b/mojo/public/bindings/lib/connector.h
index 35e6293..c90979e 100644
--- a/mojo/public/bindings/lib/connector.h
+++ b/mojo/public/bindings/lib/connector.h
@@ -5,9 +5,9 @@
#ifndef MOJO_PUBLIC_BINDINGS_LIB_CONNECTOR_H_
#define MOJO_PUBLIC_BINDINGS_LIB_CONNECTOR_H_
-#include "mojo/public/bindings/lib/bindings_support.h"
#include "mojo/public/bindings/lib/message.h"
#include "mojo/public/bindings/lib/message_queue.h"
+#include "mojo/public/environment/default_async_waiter.h"
#include "mojo/public/system/core_cpp.h"
namespace mojo {
@@ -23,7 +23,8 @@ namespace internal {
class Connector : public MessageReceiver {
public:
// The Connector takes ownership of |message_pipe|.
- explicit Connector(ScopedMessagePipeHandle message_pipe);
+ explicit Connector(ScopedMessagePipeHandle message_pipe,
+ MojoAsyncWaiter* waiter = GetDefaultAsyncWaiter());
virtual ~Connector();
// Sets the receiver to handle messages read from the message pipe. The
@@ -39,29 +40,33 @@ class Connector : public MessageReceiver {
virtual bool Accept(Message* message) MOJO_OVERRIDE;
private:
- class Callback : public BindingsSupport::AsyncWaitCallback {
+ class Callback {
public:
Callback();
- virtual ~Callback();
+ ~Callback();
void SetOwnerToNotify(Connector* owner);
- void SetAsyncWaitID(BindingsSupport::AsyncWaitID async_wait_id);
+ void SetAsyncWaitID(MojoAsyncWaitID async_wait_id);
- virtual void OnHandleReady(MojoResult result) MOJO_OVERRIDE;
+ static void OnHandleReady(void* closure, MojoResult result);
private:
Connector* owner_;
- BindingsSupport::AsyncWaitID async_wait_id_;
+ MojoAsyncWaitID async_wait_id_;
};
friend class Callback;
void OnHandleReady(Callback* callback, MojoResult result);
void WaitToReadMore();
void WaitToWriteMore();
+ void CallAsyncWait(MojoWaitFlags flags, Callback* callback);
+ void CallCancelWait(MojoAsyncWaitID async_wait_id);
void ReadMore();
void WriteMore();
void WriteOne(Message* message, bool* wait_to_write);
+ MojoAsyncWaiter* waiter_;
+
ScopedMessagePipeHandle message_pipe_;
MessageReceiver* incoming_receiver_;
MessageQueue write_queue_;
diff --git a/mojo/public/bindings/lib/remote_ptr.h b/mojo/public/bindings/lib/remote_ptr.h
index a0c42e3..3ab5fb2 100644
--- a/mojo/public/bindings/lib/remote_ptr.h
+++ b/mojo/public/bindings/lib/remote_ptr.h
@@ -48,13 +48,15 @@ namespace mojo {
//
template <typename S>
class RemotePtr {
+ struct State;
MOJO_MOVE_ONLY_TYPE_FOR_CPP_03(RemotePtr, RValue);
public:
RemotePtr() : state_(NULL) {}
explicit RemotePtr(ScopedMessagePipeHandle message_pipe,
- typename S::_Peer* peer = NULL)
- : state_(new State(message_pipe.Pass(), peer)) {
+ typename S::_Peer* peer = NULL,
+ MojoAsyncWaiter* waiter = GetDefaultAsyncWaiter())
+ : state_(new State(message_pipe.Pass(), peer, waiter)) {
}
// Move-only constructor and operator=.
@@ -87,9 +89,10 @@ class RemotePtr {
}
void reset(ScopedMessagePipeHandle message_pipe,
- typename S::_Peer* peer = NULL) {
+ typename S::_Peer* peer = NULL,
+ MojoAsyncWaiter* waiter = GetDefaultAsyncWaiter()) {
delete state_;
- state_ = new State(message_pipe.Pass(), peer);
+ state_ = new State(message_pipe.Pass(), peer, waiter);
}
bool encountered_error() const {
@@ -99,8 +102,9 @@ class RemotePtr {
private:
struct State {
- State(ScopedMessagePipeHandle message_pipe, typename S::_Peer* peer)
- : connector(message_pipe.Pass()),
+ State(ScopedMessagePipeHandle message_pipe, typename S::_Peer* peer,
+ MojoAsyncWaiter* waiter)
+ : connector(message_pipe.Pass(), waiter),
proxy(&connector),
stub(peer) {
if (peer)
diff --git a/mojo/public/environment/DEPS b/mojo/public/environment/DEPS
new file mode 100644
index 0000000..7758789
--- /dev/null
+++ b/mojo/public/environment/DEPS
@@ -0,0 +1,4 @@
+include_rules = [
+ "-mojo/public"
+ "+mojo/public/system"
+]
diff --git a/mojo/public/environment/buffer_tls.h b/mojo/public/environment/buffer_tls.h
new file mode 100644
index 0000000..60929e9
--- /dev/null
+++ b/mojo/public/environment/buffer_tls.h
@@ -0,0 +1,20 @@
+// Copyright 2014 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_PUBLIC_ENVIRONMENT_BUFFER_TLS_H_
+#define MOJO_PUBLIC_ENVIRONMENT_BUFFER_TLS_H_
+
+namespace mojo {
+class Buffer;
+
+namespace internal {
+
+// Get/Set the |Buffer*| associated with current thread.
+Buffer* GetCurrentBuffer();
+Buffer* SetCurrentBuffer(Buffer* buffer);
+
+} // namespace internal
+} // namespace mojo
+
+#endif // MOJO_PUBLIC_ENVIRONMENT_BUFFER_TLS_H_
diff --git a/mojo/public/environment/default_async_waiter.h b/mojo/public/environment/default_async_waiter.h
new file mode 100644
index 0000000..97cef12
--- /dev/null
+++ b/mojo/public/environment/default_async_waiter.h
@@ -0,0 +1,17 @@
+// Copyright 2014 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_PUBLIC_ENVIRONMENT_DEFAULT_ASYNC_WAITER_H_
+#define MOJO_PUBLIC_ENVIRONMENT_DEFAULT_ASYNC_WAITER_H_
+
+#include "mojo/public/system/async_waiter.h"
+
+namespace mojo {
+
+// Returns a default implementation of MojoAsyncWaiter.
+MojoAsyncWaiter* GetDefaultAsyncWaiter();
+
+} // namespace mojo
+
+#endif // MOJO_PUBLIC_ENVIRONMENT_DEFAULT_ASYNC_WAITER_H_
diff --git a/mojo/public/environment/environment.h b/mojo/public/environment/environment.h
new file mode 100644
index 0000000..ce93726
--- /dev/null
+++ b/mojo/public/environment/environment.h
@@ -0,0 +1,24 @@
+// Copyright 2014 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_PUBLIC_ENVIRONMENT_ENVIRONMENT_H_
+#define MOJO_PUBLIC_ENVIRONMENT_ENVIRONMENT_H_
+
+#include "mojo/public/system/macros.h"
+
+namespace mojo {
+
+// This class must be instantiated before using any Mojo APIs.
+class Environment {
+ public:
+ Environment();
+ ~Environment();
+
+ private:
+ MOJO_DISALLOW_COPY_AND_ASSIGN(Environment);
+};
+
+} // namespace mojo
+
+#endif // MOJO_PUBLIC_ENVIRONMENT_ENVIRONMENT_H_
diff --git a/mojo/public/environment/standalone/DEPS b/mojo/public/environment/standalone/DEPS
new file mode 100644
index 0000000..a04b88f
--- /dev/null
+++ b/mojo/public/environment/standalone/DEPS
@@ -0,0 +1,4 @@
+include_rules = [
+ "+mojo/public/environment"
+ "+mojo/public/utility"
+]
diff --git a/mojo/public/environment/standalone/buffer_tls.cc b/mojo/public/environment/standalone/buffer_tls.cc
new file mode 100644
index 0000000..a26d30d
--- /dev/null
+++ b/mojo/public/environment/standalone/buffer_tls.cc
@@ -0,0 +1,34 @@
+// Copyright 2014 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.
+
+#include "mojo/public/environment/buffer_tls.h"
+
+#include "mojo/public/environment/standalone/buffer_tls_setup.h"
+#include "mojo/public/utility/thread_local.h"
+
+namespace mojo {
+namespace internal {
+
+static ThreadLocalPlatform::SlotType s_slot;
+
+void SetUpCurrentBuffer() {
+ ThreadLocalPlatform::AllocateSlot(&s_slot);
+}
+
+void TearDownCurrentBuffer() {
+ ThreadLocalPlatform::FreeSlot(s_slot);
+}
+
+Buffer* GetCurrentBuffer() {
+ return static_cast<Buffer*>(ThreadLocalPlatform::GetValueFromSlot(s_slot));
+}
+
+Buffer* SetCurrentBuffer(Buffer* buf) {
+ Buffer* old_buf = GetCurrentBuffer();
+ ThreadLocalPlatform::SetValueInSlot(s_slot, buf);
+ return old_buf;
+}
+
+} // namespace internal
+} // namespace mojo
diff --git a/mojo/public/environment/standalone/buffer_tls_setup.h b/mojo/public/environment/standalone/buffer_tls_setup.h
new file mode 100644
index 0000000..8f5daa1
--- /dev/null
+++ b/mojo/public/environment/standalone/buffer_tls_setup.h
@@ -0,0 +1,17 @@
+// Copyright 2014 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_PUBLIC_ENVIRONMENT_STANDALONE_BUFFER_TLS_SETUP_H_
+#define MOJO_PUBLIC_ENVIRONMENT_STANDALONE_BUFFER_TLS_SETUP_H_
+
+namespace mojo {
+namespace internal {
+
+void SetUpCurrentBuffer();
+void TearDownCurrentBuffer();
+
+} // namespace internal
+} // namespace mojo
+
+#endif // MOJO_PUBLIC_ENVIRONMENT_STANDALONE_BUFFER_TLS_SETUP_H_
diff --git a/mojo/public/environment/standalone/default_async_waiter.cc b/mojo/public/environment/standalone/default_async_waiter.cc
new file mode 100644
index 0000000..ff2dfae
--- /dev/null
+++ b/mojo/public/environment/standalone/default_async_waiter.cc
@@ -0,0 +1,93 @@
+// Copyright 2014 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.
+
+#include "mojo/public/environment/default_async_waiter.h"
+
+#include <assert.h>
+
+#include "mojo/public/utility/run_loop.h"
+#include "mojo/public/utility/run_loop_handler.h"
+
+namespace mojo {
+namespace {
+
+// RunLoopHandler implementation used for a request to AsyncWait(). There are
+// two ways RunLoopHandlerImpl is deleted:
+// . when the handle is ready (or errored).
+// . when CancelWait() is invoked.
+class RunLoopHandlerImpl : public RunLoopHandler {
+ public:
+ RunLoopHandlerImpl(const Handle& handle,
+ MojoAsyncWaitCallback callback,
+ void* closure)
+ : handle_(handle),
+ callback_(callback),
+ closure_(closure) {
+ }
+
+ virtual ~RunLoopHandlerImpl() {
+ RunLoop::current()->RemoveHandler(handle_);
+ }
+
+ // RunLoopHandler:
+ virtual void OnHandleReady(const Handle& handle) MOJO_OVERRIDE {
+ NotifyCallback(MOJO_RESULT_OK);
+ }
+
+ virtual void OnHandleError(const Handle& handle,
+ MojoResult result) MOJO_OVERRIDE {
+ NotifyCallback(result);
+ }
+
+ private:
+ void NotifyCallback(MojoResult result) {
+ // Delete this to unregister the handle. That way if the callback
+ // reregisters everything is ok.
+ MojoAsyncWaitCallback callback = callback_;
+ void* closure = closure_;
+ delete this;
+
+ callback(closure, result);
+ }
+
+ const Handle handle_;
+ MojoAsyncWaitCallback callback_;
+ void* closure_;
+
+ MOJO_DISALLOW_COPY_AND_ASSIGN(RunLoopHandlerImpl);
+};
+
+MojoAsyncWaitID AsyncWait(MojoAsyncWaiter* waiter,
+ MojoHandle handle,
+ MojoWaitFlags flags,
+ MojoDeadline deadline,
+ MojoAsyncWaitCallback callback,
+ void* closure) {
+ RunLoop* run_loop = RunLoop::current();
+ assert(run_loop);
+
+ // |run_loop_handler| is destroyed either when the handle is ready or if
+ // CancelWait is invoked.
+ RunLoopHandlerImpl* run_loop_handler =
+ new RunLoopHandlerImpl(Handle(handle), callback, closure);
+ run_loop->AddHandler(run_loop_handler, Handle(handle), flags, deadline);
+ return reinterpret_cast<MojoAsyncWaitID>(run_loop_handler);
+}
+
+void CancelWait(MojoAsyncWaiter* waiter, MojoAsyncWaitID wait_id) {
+ delete reinterpret_cast<RunLoopHandlerImpl*>(wait_id);
+}
+
+MojoAsyncWaiter s_default_async_waiter = {
+ AsyncWait,
+ CancelWait
+};
+
+} // namespace
+
+MojoAsyncWaiter* GetDefaultAsyncWaiter() {
+ return &s_default_async_waiter;
+}
+
+} // namespace mojo
diff --git a/mojo/public/environment/standalone/environment.cc b/mojo/public/environment/standalone/environment.cc
new file mode 100644
index 0000000..39d2219
--- /dev/null
+++ b/mojo/public/environment/standalone/environment.cc
@@ -0,0 +1,22 @@
+// Copyright 2014 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.
+
+#include "mojo/public/environment/environment.h"
+
+#include "mojo/public/environment/standalone/buffer_tls_setup.h"
+#include "mojo/public/utility/run_loop.h"
+
+namespace mojo {
+
+Environment::Environment() {
+ internal::SetUpCurrentBuffer();
+ RunLoop::SetUp();
+}
+
+Environment::~Environment() {
+ RunLoop::TearDown();
+ internal::TearDownCurrentBuffer();
+}
+
+} // namespace mojo
diff --git a/mojo/public/system/async_waiter.h b/mojo/public/system/async_waiter.h
new file mode 100644
index 0000000..fc7c207
--- /dev/null
+++ b/mojo/public/system/async_waiter.h
@@ -0,0 +1,40 @@
+// Copyright 2014 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_PUBLIC_SYSTEM_ASYNC_WAITER_H_
+#define MOJO_PUBLIC_SYSTEM_ASYNC_WAITER_H_
+
+#include "mojo/public/system/core.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+typedef uintptr_t MojoAsyncWaitID;
+
+typedef void (*MojoAsyncWaitCallback)(void* closure, MojoResult result);
+
+struct MojoAsyncWaiter {
+ // Asynchronously call MojoWait on a background thread, and pass the result
+ // of MojoWait to the given MojoAsyncWaitCallback on the current thread.
+ // Returns a non-zero MojoAsyncWaitID that can be used with CancelWait to
+ // stop waiting. This identifier becomes invalid once the callback runs.
+ MojoAsyncWaitID (*AsyncWait)(MojoAsyncWaiter* waiter,
+ MojoHandle handle,
+ MojoWaitFlags flags,
+ MojoDeadline deadline,
+ MojoAsyncWaitCallback callback,
+ void* closure);
+
+ // Cancel an existing call to AsyncWait with the given MojoAsyncWaitID. The
+ // corresponding MojoAsyncWaitCallback will not be called in this case.
+ void (*CancelWait)(MojoAsyncWaiter* waiter,
+ MojoAsyncWaitID wait_id);
+};
+
+#ifdef __cplusplus
+} // extern "C"
+#endif
+
+#endif // MOJO_PUBLIC_SYSTEM_ASYNC_WAITER_H_
diff --git a/mojo/public/tests/bindings/array_unittest.cc b/mojo/public/tests/bindings/array_unittest.cc
index bb46c67..dac4b50 100644
--- a/mojo/public/tests/bindings/array_unittest.cc
+++ b/mojo/public/tests/bindings/array_unittest.cc
@@ -3,7 +3,7 @@
// found in the LICENSE file.
#include "mojo/public/bindings/lib/array.h"
-#include "mojo/public/tests/bindings/simple_bindings_support.h"
+#include "mojo/public/environment/environment.h"
#include "testing/gtest/include/gtest/gtest.h"
namespace mojo {
@@ -11,7 +11,7 @@ namespace test {
// Tests that basic Array operations work.
TEST(ArrayTest, Basic) {
- SimpleBindingsSupport bindings_support;
+ Environment env;
// 8 bytes for the array, with 8 bytes left over for elements.
internal::FixedBuffer buf(8 + 8*sizeof(char));
@@ -34,7 +34,7 @@ TEST(ArrayTest, Basic) {
// Tests that basic Array<bool> operations work, and that it's packed into 1
// bit per element.
TEST(ArrayTest, Bool) {
- SimpleBindingsSupport bindings_support;
+ Environment env;
// 8 bytes for the array header, with 8 bytes left over for elements.
internal::FixedBuffer buf(8 + 3);
@@ -57,7 +57,7 @@ TEST(ArrayTest, Bool) {
// Tests that Array<Handle> supports transferring handles.
TEST(ArrayTest, Handle) {
- SimpleBindingsSupport bindings_support;
+ Environment env;
AllocationScope scope;
diff --git a/mojo/public/tests/bindings/buffer_unittest.cc b/mojo/public/tests/bindings/buffer_unittest.cc
index ab181505..06cb4ca 100644
--- a/mojo/public/tests/bindings/buffer_unittest.cc
+++ b/mojo/public/tests/bindings/buffer_unittest.cc
@@ -4,7 +4,7 @@
#include "mojo/public/bindings/lib/bindings_serialization.h"
#include "mojo/public/bindings/lib/buffer.h"
-#include "mojo/public/tests/bindings/simple_bindings_support.h"
+#include "mojo/public/environment/environment.h"
#include "testing/gtest/include/gtest/gtest.h"
namespace mojo {
@@ -21,7 +21,7 @@ bool IsZero(void* p_buf, size_t size) {
// Tests small and large allocations in ScratchBuffer.
TEST(ScratchBufferTest, Basic) {
- SimpleBindingsSupport bindings_support;
+ Environment env;
// Test that a small allocation is placed on the stack.
internal::ScratchBuffer buf;
@@ -42,7 +42,7 @@ TEST(ScratchBufferTest, Basic) {
// Tests that Buffer::current() returns the correct value.
TEST(ScratchBufferTest, Stacked) {
- SimpleBindingsSupport bindings_support;
+ Environment env;
EXPECT_FALSE(Buffer::current());
@@ -61,7 +61,7 @@ TEST(ScratchBufferTest, Stacked) {
// Tests that FixedBuffer allocates memory aligned to 8 byte boundaries.
TEST(FixedBufferTest, Alignment) {
- SimpleBindingsSupport bindings_support;
+ Environment env;
internal::FixedBuffer buf(internal::Align(10) * 2);
ASSERT_EQ(buf.size(), 16u * 2);
@@ -81,7 +81,7 @@ TEST(FixedBufferTest, Alignment) {
// Tests that FixedBuffer::Leak passes ownership to the caller.
TEST(FixedBufferTest, Leak) {
- SimpleBindingsSupport bindings_support;
+ Environment env;
void* ptr = NULL;
void* buf_ptr = NULL;
diff --git a/mojo/public/tests/bindings/connector_unittest.cc b/mojo/public/tests/bindings/connector_unittest.cc
index 4e1feba..a814ffc 100644
--- a/mojo/public/tests/bindings/connector_unittest.cc
+++ b/mojo/public/tests/bindings/connector_unittest.cc
@@ -5,11 +5,11 @@
#include <stdlib.h>
#include <string.h>
-#include "mojo/public/bindings/lib/bindings_support.h"
#include "mojo/public/bindings/lib/connector.h"
#include "mojo/public/bindings/lib/message_queue.h"
+#include "mojo/public/environment/environment.h"
#include "mojo/public/system/macros.h"
-#include "mojo/public/tests/bindings/simple_bindings_support.h"
+#include "mojo/public/utility/run_loop.h"
#include "testing/gtest/include/gtest/gtest.h"
namespace mojo {
@@ -59,7 +59,7 @@ class ConnectorTest : public testing::Test {
}
void PumpMessages() {
- bindings_support_.Process();
+ loop_.RunUntilIdle();
}
protected:
@@ -67,7 +67,8 @@ class ConnectorTest : public testing::Test {
ScopedMessagePipeHandle handle1_;
private:
- SimpleBindingsSupport bindings_support_;
+ Environment env_;
+ RunLoop loop_;
};
TEST_F(ConnectorTest, Basic) {
diff --git a/mojo/public/tests/bindings/handle_passing_unittest.cc b/mojo/public/tests/bindings/handle_passing_unittest.cc
index 21b26f2..ca2d2709 100644
--- a/mojo/public/tests/bindings/handle_passing_unittest.cc
+++ b/mojo/public/tests/bindings/handle_passing_unittest.cc
@@ -3,8 +3,9 @@
// found in the LICENSE file.
#include "mojo/public/bindings/lib/remote_ptr.h"
-#include "mojo/public/tests/bindings/simple_bindings_support.h"
+#include "mojo/public/environment/environment.h"
#include "mojo/public/tests/test_support.h"
+#include "mojo/public/utility/run_loop.h"
#include "mojom/sample_factory.h"
#include "testing/gtest/include/gtest/gtest.h"
@@ -125,17 +126,18 @@ class SampleFactoryClientImpl : public sample::FactoryClient {
} // namespace
-class BindingsHandlePassingTest : public testing::Test {
+class HandlePassingTest : public testing::Test {
public:
void PumpMessages() {
- bindings_support_.Process();
+ loop_.RunUntilIdle();
}
private:
- SimpleBindingsSupport bindings_support_;
+ Environment env_;
+ RunLoop loop_;
};
-TEST_F(BindingsHandlePassingTest, Basic) {
+TEST_F(HandlePassingTest, Basic) {
ScopedMessagePipeHandle pipe0;
ScopedMessagePipeHandle pipe1;
CreateMessagePipe(&pipe0, &pipe1);
@@ -152,7 +154,7 @@ TEST_F(BindingsHandlePassingTest, Basic) {
EXPECT_TRUE(factory_client.got_response());
}
-TEST_F(BindingsHandlePassingTest, PassInvalid) {
+TEST_F(HandlePassingTest, PassInvalid) {
ScopedMessagePipeHandle pipe0;
ScopedMessagePipeHandle pipe1;
CreateMessagePipe(&pipe0, &pipe1);
diff --git a/mojo/public/tests/bindings/remote_ptr_unittest.cc b/mojo/public/tests/bindings/remote_ptr_unittest.cc
index d990bce..f4f3b23 100644
--- a/mojo/public/tests/bindings/remote_ptr_unittest.cc
+++ b/mojo/public/tests/bindings/remote_ptr_unittest.cc
@@ -3,7 +3,8 @@
// found in the LICENSE file.
#include "mojo/public/bindings/lib/remote_ptr.h"
-#include "mojo/public/tests/bindings/simple_bindings_support.h"
+#include "mojo/public/environment/environment.h"
+#include "mojo/public/utility/run_loop.h"
#include "mojom/math_calculator.h"
#include "testing/gtest/include/gtest/gtest.h"
@@ -89,7 +90,7 @@ class RemotePtrTest : public testing::Test {
}
void PumpMessages() {
- bindings_support_.Process();
+ loop_.RunUntilIdle();
}
protected:
@@ -97,7 +98,8 @@ class RemotePtrTest : public testing::Test {
ScopedMessagePipeHandle pipe1_;
private:
- SimpleBindingsSupport bindings_support_;
+ Environment env_;
+ RunLoop loop_;
};
TEST_F(RemotePtrTest, EndToEnd) {
diff --git a/mojo/public/tests/bindings/sample_service_unittests.cc b/mojo/public/tests/bindings/sample_service_unittests.cc
index 3fe8a11..f31b08d 100644
--- a/mojo/public/tests/bindings/sample_service_unittests.cc
+++ b/mojo/public/tests/bindings/sample_service_unittests.cc
@@ -6,7 +6,7 @@
#include <ostream>
#include <string>
-#include "mojo/public/tests/bindings/simple_bindings_support.h"
+#include "mojo/public/environment/environment.h"
#include "mojom/sample_service.h"
#include "testing/gtest/include/gtest/gtest.h"
@@ -286,7 +286,7 @@ class SimpleMessageReceiver : public mojo::MessageReceiver {
} // namespace
TEST(BindingsSampleTest, Basic) {
- mojo::test::SimpleBindingsSupport bindings_support;
+ mojo::Environment env;
SimpleMessageReceiver receiver;
// User has a proxy to a Service somehow.
diff --git a/mojo/public/tests/bindings/simple_bindings_support.cc b/mojo/public/tests/bindings/simple_bindings_support.cc
deleted file mode 100644
index ceabc1e..0000000
--- a/mojo/public/tests/bindings/simple_bindings_support.cc
+++ /dev/null
@@ -1,101 +0,0 @@
-// 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.
-
-#include "mojo/public/tests/bindings/simple_bindings_support.h"
-
-#include <stdlib.h>
-
-#include <algorithm>
-
-namespace mojo {
-namespace test {
-
-SimpleBindingsSupport::SimpleBindingsSupport()
- : buf_(NULL) {
- BindingsSupport::Set(this);
-}
-
-SimpleBindingsSupport::~SimpleBindingsSupport() {
- BindingsSupport::Set(NULL);
-
- for (WaiterList::iterator it = waiters_.begin(); it != waiters_.end(); ++it)
- delete *it;
-}
-
-Buffer* SimpleBindingsSupport::SetCurrentBuffer(Buffer* buf) {
- // This is a simplistic implementation that assumes it is only ever used from
- // a single thread, which is common in tests.
- std::swap(buf_, buf);
- return buf;
-}
-
-Buffer* SimpleBindingsSupport::GetCurrentBuffer() {
- return buf_;
-}
-
-BindingsSupport::AsyncWaitID SimpleBindingsSupport::AsyncWait(
- const Handle& handle,
- MojoWaitFlags flags,
- AsyncWaitCallback* callback) {
- Waiter* waiter = new Waiter();
- waiter->handle = handle;
- waiter->flags = flags;
- waiter->callback = callback;
- waiters_.push_back(waiter);
- return waiter;
-}
-
-void SimpleBindingsSupport::CancelWait(AsyncWaitID async_wait_id) {
- Waiter* waiter = static_cast<Waiter*>(async_wait_id);
-
- WaiterList::iterator it = waiters_.begin();
- while (it != waiters_.end()) {
- if (*it == waiter) {
- WaiterList::iterator doomed = it++;
- waiters_.erase(doomed);
- } else {
- ++it;
- }
- }
-
- delete waiter;
-}
-
-void SimpleBindingsSupport::Process() {
- for (;;) {
- typedef std::pair<AsyncWaitCallback*, MojoResult> Result;
- std::list<Result> results;
-
- WaiterList::iterator it = waiters_.begin();
- while (it != waiters_.end()) {
- Waiter* waiter = *it;
- MojoResult result;
- if (IsReady(waiter->handle, waiter->flags, &result)) {
- results.push_back(std::make_pair(waiter->callback, result));
- WaiterList::iterator doomed = it++;
- waiters_.erase(doomed);
- delete waiter;
- } else {
- ++it;
- }
- }
-
- for (std::list<Result>::const_iterator it = results.begin();
- it != results.end();
- ++it) {
- it->first->OnHandleReady(it->second);
- }
- if (results.empty())
- break;
- }
-}
-
-bool SimpleBindingsSupport::IsReady(const Handle& handle, MojoWaitFlags flags,
- MojoResult* result) {
- *result = Wait(handle, flags, 0);
- return *result != MOJO_RESULT_DEADLINE_EXCEEDED;
-}
-
-} // namespace test
-} // namespace mojo
diff --git a/mojo/public/tests/bindings/simple_bindings_support.h b/mojo/public/tests/bindings/simple_bindings_support.h
deleted file mode 100644
index e124625..0000000
--- a/mojo/public/tests/bindings/simple_bindings_support.h
+++ /dev/null
@@ -1,51 +0,0 @@
-// 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_PUBLIC_TESTS_SIMPLE_BINDINGS_SUPPORT_H_
-#define MOJO_PUBLIC_TESTS_SIMPLE_BINDINGS_SUPPORT_H_
-
-#include <list>
-
-#include "mojo/public/bindings/lib/bindings_support.h"
-
-namespace mojo {
-namespace test {
-
-class SimpleBindingsSupport : public BindingsSupport {
- public:
- SimpleBindingsSupport();
- virtual ~SimpleBindingsSupport();
-
- virtual Buffer* SetCurrentBuffer(Buffer* buf) MOJO_OVERRIDE;
- virtual Buffer* GetCurrentBuffer() MOJO_OVERRIDE;
-
- virtual AsyncWaitID AsyncWait(const Handle& handle,
- MojoWaitFlags flags,
- AsyncWaitCallback* callback) MOJO_OVERRIDE;
- virtual void CancelWait(AsyncWaitID async_wait_id) MOJO_OVERRIDE;
-
- // This method is called by unit tests to check the status of any handles
- // that we are asynchronously waiting on and to dispatch callbacks for any
- // handles that are ready.
- void Process();
-
- private:
- bool IsReady(const Handle& handle, MojoWaitFlags flags, MojoResult* result);
-
- struct Waiter {
- Handle handle;
- MojoWaitFlags flags;
- AsyncWaitCallback* callback;
- };
-
- typedef std::list<Waiter*> WaiterList;
- WaiterList waiters_;
-
- Buffer* buf_;
-};
-
-} // namespace test
-} // namespace mojo
-
-#endif // MOJO_PUBLIC_TESTS_SIMPLE_BINDINGS_SUPPORT_H_
diff --git a/mojo/public/tests/bindings/type_conversion_unittest.cc b/mojo/public/tests/bindings/type_conversion_unittest.cc
index fb92b60..ad0d1f7 100644
--- a/mojo/public/tests/bindings/type_conversion_unittest.cc
+++ b/mojo/public/tests/bindings/type_conversion_unittest.cc
@@ -2,7 +2,7 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-#include "mojo/public/tests/bindings/simple_bindings_support.h"
+#include "mojo/public/environment/environment.h"
#include "mojom/test_structs.h"
#include "testing/gtest/include/gtest/gtest.h"
@@ -66,7 +66,7 @@ namespace test {
class TypeConversionTest : public testing::Test {
private:
- SimpleBindingsSupport bindings_support_;
+ Environment env_;
};
TEST_F(TypeConversionTest, String) {
diff --git a/mojo/public/tests/utility/bindings_support_impl_unittest.cc b/mojo/public/tests/environment/async_waiter_unittest.cc
index b2c248c..dd0f397 100644
--- a/mojo/public/tests/utility/bindings_support_impl_unittest.cc
+++ b/mojo/public/tests/environment/async_waiter_unittest.cc
@@ -1,20 +1,19 @@
-// Copyright 2013 The Chromium Authors. All rights reserved.
+// Copyright 2014 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.
-#include "mojo/public/utility/bindings_support_impl.h"
+#include "mojo/public/environment/default_async_waiter.h"
-#include "base/basictypes.h"
+#include "mojo/public/environment/environment.h"
#include "mojo/public/system/core_cpp.h"
#include "mojo/public/tests/test_support.h"
-#include "mojo/public/utility/environment.h"
#include "mojo/public/utility/run_loop.h"
#include "testing/gtest/include/gtest/gtest.h"
namespace mojo {
namespace {
-class TestAsyncWaitCallback : public BindingsSupport::AsyncWaitCallback {
+class TestAsyncWaitCallback {
public:
TestAsyncWaitCallback() : result_count_(0), last_result_(MOJO_RESULT_OK) {
}
@@ -24,10 +23,11 @@ class TestAsyncWaitCallback : public BindingsSupport::AsyncWaitCallback {
MojoResult last_result() const { return last_result_; }
- // RunLoopHandler:
- virtual void OnHandleReady(MojoResult result) OVERRIDE {
- result_count_++;
- last_result_ = result;
+ // MojoAsyncWaitCallback:
+ static void OnHandleReady(void* closure, MojoResult result) {
+ TestAsyncWaitCallback* self = static_cast<TestAsyncWaitCallback*>(closure);
+ self->result_count_++;
+ self->last_result_ = result;
}
private:
@@ -37,9 +37,26 @@ class TestAsyncWaitCallback : public BindingsSupport::AsyncWaitCallback {
DISALLOW_COPY_AND_ASSIGN(TestAsyncWaitCallback);
};
-class BindingsSupportImplTest : public testing::Test {
+MojoAsyncWaitID CallAsyncWait(const Handle& handle,
+ MojoWaitFlags flags,
+ TestAsyncWaitCallback* callback) {
+ MojoAsyncWaiter* waiter = GetDefaultAsyncWaiter();
+ return waiter->AsyncWait(waiter,
+ handle.value(),
+ flags,
+ MOJO_DEADLINE_INDEFINITE,
+ &TestAsyncWaitCallback::OnHandleReady,
+ callback);
+}
+
+void CallCancelWait(MojoAsyncWaitID wait_id) {
+ MojoAsyncWaiter* waiter = GetDefaultAsyncWaiter();
+ waiter->CancelWait(waiter, wait_id);
+}
+
+class AsyncWaiterTest : public testing::Test {
public:
- BindingsSupportImplTest() {}
+ AsyncWaiterTest() {}
virtual void SetUp() OVERRIDE {
Test::SetUp();
@@ -56,25 +73,26 @@ class BindingsSupportImplTest : public testing::Test {
scoped_ptr<Environment> environment_;
scoped_ptr<RunLoop> run_loop_;
- DISALLOW_COPY_AND_ASSIGN(BindingsSupportImplTest);
+ DISALLOW_COPY_AND_ASSIGN(AsyncWaiterTest);
};
// Verifies AsyncWaitCallback is notified when pipe is ready.
-TEST_F(BindingsSupportImplTest, CallbackNotified) {
+TEST_F(AsyncWaiterTest, CallbackNotified) {
TestAsyncWaitCallback callback;
MessagePipe test_pipe;
EXPECT_EQ(MOJO_RESULT_OK,
test::WriteEmptyMessage(test_pipe.handle1.get()));
- BindingsSupport::Get()->AsyncWait(test_pipe.handle0.get(),
- MOJO_WAIT_FLAG_READABLE, &callback);
+ CallAsyncWait(test_pipe.handle0.get(),
+ MOJO_WAIT_FLAG_READABLE,
+ &callback);
RunLoop::current()->Run();
EXPECT_EQ(1, callback.result_count());
EXPECT_EQ(MOJO_RESULT_OK, callback.last_result());
}
// Verifies 2 AsyncWaitCallbacks are notified when there pipes are ready.
-TEST_F(BindingsSupportImplTest, TwoCallbacksNotified) {
+TEST_F(AsyncWaiterTest, TwoCallbacksNotified) {
TestAsyncWaitCallback callback1;
TestAsyncWaitCallback callback2;
MessagePipe test_pipe1;
@@ -84,10 +102,9 @@ TEST_F(BindingsSupportImplTest, TwoCallbacksNotified) {
EXPECT_EQ(MOJO_RESULT_OK,
test::WriteEmptyMessage(test_pipe2.handle1.get()));
- BindingsSupport::Get()->AsyncWait(test_pipe1.handle0.get(),
- MOJO_WAIT_FLAG_READABLE, &callback1);
- BindingsSupport::Get()->AsyncWait(test_pipe2.handle0.get(),
- MOJO_WAIT_FLAG_READABLE, &callback2);
+ CallAsyncWait(test_pipe1.handle0.get(), MOJO_WAIT_FLAG_READABLE, &callback1);
+ CallAsyncWait(test_pipe2.handle0.get(), MOJO_WAIT_FLAG_READABLE, &callback2);
+
RunLoop::current()->Run();
EXPECT_EQ(1, callback1.result_count());
EXPECT_EQ(MOJO_RESULT_OK, callback1.last_result());
@@ -96,14 +113,15 @@ TEST_F(BindingsSupportImplTest, TwoCallbacksNotified) {
}
// Verifies cancel works.
-TEST_F(BindingsSupportImplTest, CancelCallback) {
+TEST_F(AsyncWaiterTest, CancelCallback) {
TestAsyncWaitCallback callback;
MessagePipe test_pipe;
EXPECT_EQ(MOJO_RESULT_OK, test::WriteEmptyMessage(test_pipe.handle1.get()));
- BindingsSupport::Get()->CancelWait(
- BindingsSupport::Get()->AsyncWait(test_pipe.handle0.get(),
- MOJO_WAIT_FLAG_READABLE, &callback));
+ CallCancelWait(
+ CallAsyncWait(test_pipe.handle0.get(),
+ MOJO_WAIT_FLAG_READABLE,
+ &callback));
RunLoop::current()->Run();
EXPECT_EQ(0, callback.result_count());
}
diff --git a/mojo/public/utility/DEPS b/mojo/public/utility/DEPS
new file mode 100644
index 0000000..dd7669a
--- /dev/null
+++ b/mojo/public/utility/DEPS
@@ -0,0 +1,3 @@
+include_rules = [
+ "+mojo/public/system",
+]
diff --git a/mojo/public/utility/bindings_support_impl.cc b/mojo/public/utility/bindings_support_impl.cc
deleted file mode 100644
index b78f782..0000000
--- a/mojo/public/utility/bindings_support_impl.cc
+++ /dev/null
@@ -1,111 +0,0 @@
-// 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.
-
-#include "mojo/public/utility/bindings_support_impl.h"
-
-#include <assert.h>
-
-#include "mojo/public/bindings/lib/buffer.h"
-#include "mojo/public/utility/run_loop.h"
-#include "mojo/public/utility/run_loop_handler.h"
-#include "mojo/public/utility/thread_local.h"
-
-namespace mojo {
-namespace internal {
-namespace {
-
-ThreadLocalPointer<Buffer>* tls_buffer = NULL;
-
-// RunLoopHandler implementation used for a request to AsyncWait(). There are
-// two ways RunLoopHandlerImpl is deleted:
-// . when the handle is ready (or errored).
-// . when BindingsSupport::CancelWait() is invoked.
-class RunLoopHandlerImpl : public RunLoopHandler {
- public:
- RunLoopHandlerImpl(const Handle& handle,
- BindingsSupport::AsyncWaitCallback* callback)
- : handle_(handle),
- callback_(callback) {}
- virtual ~RunLoopHandlerImpl() {
- RunLoop::current()->RemoveHandler(handle_);
- }
-
- // RunLoopHandler:
- virtual void OnHandleReady(const Handle& handle) MOJO_OVERRIDE {
- NotifyCallback(MOJO_RESULT_OK);
- }
-
- virtual void OnHandleError(const Handle& handle,
- MojoResult result) MOJO_OVERRIDE {
- NotifyCallback(result);
- }
-
- private:
- void NotifyCallback(MojoResult result) {
- // Delete this to unregister the handle. That way if the callback
- // reregisters everything is ok.
- BindingsSupport::AsyncWaitCallback* callback = callback_;
- delete this;
-
- callback->OnHandleReady(result);
- }
-
- const Handle handle_;
- BindingsSupport::AsyncWaitCallback* callback_;
-
- MOJO_DISALLOW_COPY_AND_ASSIGN(RunLoopHandlerImpl);
-};
-
-} // namespace
-
-BindingsSupportImpl::BindingsSupportImpl() {
-}
-
-BindingsSupportImpl::~BindingsSupportImpl() {
-}
-
-// static
-void BindingsSupportImpl::SetUp() {
- assert(!tls_buffer);
- tls_buffer = new ThreadLocalPointer<Buffer>;
-}
-
-// static
-void BindingsSupportImpl::TearDown() {
- assert(tls_buffer);
- delete tls_buffer;
- tls_buffer = NULL;
-}
-
-Buffer* BindingsSupportImpl::GetCurrentBuffer() {
- return tls_buffer->Get();
-}
-
-Buffer* BindingsSupportImpl::SetCurrentBuffer(Buffer* buf) {
- Buffer* old_buf = tls_buffer->Get();
- tls_buffer->Set(buf);
- return old_buf;
-}
-
-BindingsSupport::AsyncWaitID BindingsSupportImpl::AsyncWait(
- const Handle& handle,
- MojoWaitFlags flags,
- AsyncWaitCallback* callback) {
- RunLoop* run_loop = RunLoop::current();
- assert(run_loop);
- // |run_loop_handler| is destroyed either when the handle is ready or if
- // CancelWait is invoked.
- RunLoopHandlerImpl* run_loop_handler =
- new RunLoopHandlerImpl(handle, callback);
- run_loop->AddHandler(run_loop_handler, handle, flags,
- MOJO_DEADLINE_INDEFINITE);
- return run_loop_handler;
-}
-
-void BindingsSupportImpl::CancelWait(AsyncWaitID async_wait_id) {
- delete static_cast<RunLoopHandlerImpl*>(async_wait_id);
-}
-
-} // namespace internal
-} // namespace mojo
diff --git a/mojo/public/utility/bindings_support_impl.h b/mojo/public/utility/bindings_support_impl.h
deleted file mode 100644
index 6216227..0000000
--- a/mojo/public/utility/bindings_support_impl.h
+++ /dev/null
@@ -1,44 +0,0 @@
-// 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_PUBLIC_UTILITY_BINDINGS_SUPPORT_IMPL_H_
-#define MOJO_PUBLIC_UTILITY_BINDINGS_SUPPORT_IMPL_H_
-
-#include "mojo/public/bindings/lib/bindings_support.h"
-#include "mojo/public/system/macros.h"
-
-namespace mojo {
-namespace internal {
-
-// BindingsSupport implementation that uses RunLoop. Before using this you must
-// have created a RunLoop on the current thread.
-// You shouldn't create this directly, instead use Environment.
-class BindingsSupportImpl : public BindingsSupport {
- public:
- BindingsSupportImpl();
- virtual ~BindingsSupportImpl();
-
- // Sets up state needed for BindingsSupportImpl. This must be invoked before
- // creating a BindingsSupportImpl.
- static void SetUp();
-
- // Cleans state created by Setup().
- static void TearDown();
-
- // BindingsSupport methods:
- virtual Buffer* GetCurrentBuffer() MOJO_OVERRIDE;
- virtual Buffer* SetCurrentBuffer(Buffer* buf) MOJO_OVERRIDE;
- virtual AsyncWaitID AsyncWait(const Handle& handle,
- MojoWaitFlags flags,
- AsyncWaitCallback* callback) MOJO_OVERRIDE;
- virtual void CancelWait(AsyncWaitID async_wait_id) MOJO_OVERRIDE;
-
- private:
- MOJO_DISALLOW_COPY_AND_ASSIGN(BindingsSupportImpl);
-};
-
-} // namespace internal
-} // namespace mojo
-
-#endif // MOJO_PUBLIC_UTILITY_BINDINGS_SUPPORT_IMPL_H_
diff --git a/mojo/public/utility/environment.cc b/mojo/public/utility/environment.cc
deleted file mode 100644
index b492030..0000000
--- a/mojo/public/utility/environment.cc
+++ /dev/null
@@ -1,30 +0,0 @@
-// 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.
-
-#include "mojo/public/utility/environment.h"
-
-#include "mojo/public/utility/bindings_support_impl.h"
-#include "mojo/public/utility/run_loop.h"
-
-namespace mojo {
-
-Environment::Environment() : bindings_support_(NULL) {
- RunLoop::SetUp();
-
- internal::BindingsSupportImpl::SetUp();
- bindings_support_ = new internal::BindingsSupportImpl;
- BindingsSupport::Set(bindings_support_);
-}
-
-Environment::~Environment() {
- // Allow for someone to have replaced BindingsSupport.
- if (BindingsSupport::Get() == bindings_support_)
- BindingsSupport::Set(NULL);
- delete bindings_support_;
- internal::BindingsSupportImpl::TearDown();
-
- RunLoop::TearDown();
-}
-
-} // namespace mojo
diff --git a/mojo/public/utility/environment.h b/mojo/public/utility/environment.h
deleted file mode 100644
index e7ea6a7..0000000
--- a/mojo/public/utility/environment.h
+++ /dev/null
@@ -1,32 +0,0 @@
-// 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_PUBLIC_UTILITY_ENVIRONMENT_H_
-#define MOJO_PUBLIC_UTILITY_ENVIRONMENT_H_
-
-#include "mojo/public/system/macros.h"
-
-namespace mojo {
-
-namespace internal {
-class BindingsSupportImpl;
-} // namespace internal
-
-class RunLoop;
-
-// Use Environment to cofigure state.
-class Environment {
- public:
- Environment();
- ~Environment();
-
- private:
- internal::BindingsSupportImpl* bindings_support_;
-
- MOJO_DISALLOW_COPY_AND_ASSIGN(Environment);
-};
-
-} // namespace mojo
-
-#endif // MOJO_PUBLIC_UTILITY_ENVIRONMENT_H_
diff --git a/mojo/public/utility/run_loop.cc b/mojo/public/utility/run_loop.cc
index 56f7c42..bec828d 100644
--- a/mojo/public/utility/run_loop.cc
+++ b/mojo/public/utility/run_loop.cc
@@ -103,7 +103,21 @@ void RunLoop::Run() {
RunState run_state;
run_state_ = &run_state;
while (!run_state.should_quit)
- Wait();
+ Wait(false);
+ run_state_ = old_state;
+}
+
+void RunLoop::RunUntilIdle() {
+ assert(current() == this);
+ // We don't currently support nesting.
+ assert(!run_state_);
+ RunState* old_state = run_state_;
+ RunState run_state;
+ run_state_ = &run_state;
+ while (!run_state.should_quit) {
+ if (!Wait(true))
+ break;
+ }
run_state_ = old_state;
}
@@ -113,11 +127,11 @@ void RunLoop::Quit() {
run_state_->should_quit = true;
}
-void RunLoop::Wait() {
- const WaitState wait_state = GetWaitState();
+bool RunLoop::Wait(bool non_blocking) {
+ const WaitState wait_state = GetWaitState(non_blocking);
if (wait_state.handles.empty()) {
Quit();
- return;
+ return false;
}
const MojoResult result =
@@ -128,23 +142,24 @@ void RunLoop::Wait() {
handler_data_.end());
handler_data_[wait_state.handles[index]].handler->OnHandleReady(
wait_state.handles[index]);
- } else {
- switch (result) {
- case MOJO_RESULT_INVALID_ARGUMENT:
- case MOJO_RESULT_FAILED_PRECONDITION:
- RemoveFirstInvalidHandle(wait_state);
- break;
- case MOJO_RESULT_DEADLINE_EXCEEDED:
- break;
- default:
- assert(false);
- }
+ return true;
+ }
+
+ switch (result) {
+ case MOJO_RESULT_INVALID_ARGUMENT:
+ case MOJO_RESULT_FAILED_PRECONDITION:
+ return RemoveFirstInvalidHandle(wait_state);
+ case MOJO_RESULT_DEADLINE_EXCEEDED:
+ return NotifyDeadlineExceeded();
}
- NotifyDeadlineExceeded();
+ assert(false);
+ return false;
}
-void RunLoop::NotifyDeadlineExceeded() {
+bool RunLoop::NotifyDeadlineExceeded() {
+ bool notified = false;
+
// Make a copy in case someone tries to add/remove new handlers as part of
// notifying.
const HandleToHandlerData cloned_handlers(handler_data_);
@@ -159,11 +174,14 @@ void RunLoop::NotifyDeadlineExceeded() {
handler_data_[i->first].id == i->second.id) {
handler_data_.erase(i->first);
i->second.handler->OnHandleError(i->first, MOJO_RESULT_DEADLINE_EXCEEDED);
+ notified = true;
}
}
+
+ return notified;
}
-void RunLoop::RemoveFirstInvalidHandle(const WaitState& wait_state) {
+bool RunLoop::RemoveFirstInvalidHandle(const WaitState& wait_state) {
for (size_t i = 0; i < wait_state.handles.size(); ++i) {
const MojoResult result =
mojo::Wait(wait_state.handles[i], wait_state.wait_flags[i],
@@ -177,26 +195,28 @@ void RunLoop::RemoveFirstInvalidHandle(const WaitState& wait_state) {
handler_data_[wait_state.handles[i]].handler;
handler_data_.erase(wait_state.handles[i]);
handler->OnHandleError(wait_state.handles[i], result);
- return;
- } else {
- assert(MOJO_RESULT_DEADLINE_EXCEEDED == result);
+ return true;
}
+ assert(MOJO_RESULT_DEADLINE_EXCEEDED == result);
}
+ return false;
}
-RunLoop::WaitState RunLoop::GetWaitState() const {
+RunLoop::WaitState RunLoop::GetWaitState(bool non_blocking) const {
WaitState wait_state;
MojoTimeTicks min_time = kInvalidTimeTicks;
for (HandleToHandlerData::const_iterator i = handler_data_.begin();
i != handler_data_.end(); ++i) {
wait_state.handles.push_back(i->first);
wait_state.wait_flags.push_back(i->second.wait_flags);
- if (i->second.deadline != kInvalidTimeTicks &&
+ if (!non_blocking && i->second.deadline != kInvalidTimeTicks &&
(min_time == kInvalidTimeTicks || i->second.deadline < min_time)) {
min_time = i->second.deadline;
}
}
- if (min_time != kInvalidTimeTicks) {
+ if (non_blocking) {
+ wait_state.deadline = static_cast<MojoDeadline>(0);
+ } else if (min_time != kInvalidTimeTicks) {
const MojoTimeTicks now = GetTimeTicksNow();
if (min_time < now)
wait_state.deadline = static_cast<MojoDeadline>(0);
diff --git a/mojo/public/utility/run_loop.h b/mojo/public/utility/run_loop.h
index 49c8c2d..be39edb 100644
--- a/mojo/public/utility/run_loop.h
+++ b/mojo/public/utility/run_loop.h
@@ -41,6 +41,12 @@ class RunLoop {
// Runs the loop servicing handles as they are ready. This returns when Quit()
// is invoked, or there no more handles.
void Run();
+
+ // Runs the loop servicing any handles that are ready. Does not wait for
+ // handles to become ready before returning. Returns early if Quit() is
+ // invoked.
+ void RunUntilIdle();
+
void Quit();
private:
@@ -65,18 +71,21 @@ class RunLoop {
typedef std::map<Handle, HandlerData> HandleToHandlerData;
// Waits for a handle to be ready. Returns after servicing at least one
- // handle (or there are no more handles).
- void Wait();
+ // handle (or there are no more handles) unless |non_blocking| is true,
+ // in which case it will also return if servicing at least one handle
+ // would require blocking. Returns true if a RunLoopHandler was notified.
+ bool Wait(bool non_blocking);
- // Notifies any handlers whose deadline has expired.
- void NotifyDeadlineExceeded();
+ // Notifies any handlers whose deadline has expired. Returns true if a
+ // RunLoopHandler was notified.
+ bool NotifyDeadlineExceeded();
// Removes the first invalid handle. This is called if MojoWaitMany() finds an
- // invalid handle.
- void RemoveFirstInvalidHandle(const WaitState& wait_state);
+ // invalid handle. Returns true if a RunLoopHandler was notified.
+ bool RemoveFirstInvalidHandle(const WaitState& wait_state);
// Returns the state needed to pass to WaitMany().
- WaitState GetWaitState() const;
+ WaitState GetWaitState(bool non_blocking) const;
HandleToHandlerData handler_data_;
diff --git a/mojo/services/native_viewport/native_viewport_service.cc b/mojo/services/native_viewport/native_viewport_service.cc
index 0352ddf..4a375ea 100644
--- a/mojo/services/native_viewport/native_viewport_service.cc
+++ b/mojo/services/native_viewport/native_viewport_service.cc
@@ -6,7 +6,6 @@
#include "base/message_loop/message_loop.h"
#include "base/time/time.h"
-#include "mojo/common/bindings_support_impl.h"
#include "mojo/services/gles2/gles2_impl.h"
#include "mojo/services/native_viewport/native_viewport.h"
#include "mojom/native_viewport.h"
@@ -182,15 +181,10 @@ mojo::services::NativeViewportService*
extern "C" MOJO_NATIVE_VIEWPORT_EXPORT MojoResult MojoMain(
const MojoHandle shell_handle) {
- mojo::common::BindingsSupportImpl bindings_support_impl;
- mojo::BindingsSupport::Set(&bindings_support_impl);
-
base::MessageLoopForUI loop;
mojo::services::NativeViewportService app(
mojo::MakeScopedHandle(mojo::MessagePipeHandle(shell_handle)).Pass());
base::MessageLoop::current()->Run();
-
- mojo::BindingsSupport::Set(NULL);
return MOJO_RESULT_OK;
}
diff --git a/mojo/shell/context.cc b/mojo/shell/context.cc
index 2cb8a54..3f136c25 100644
--- a/mojo/shell/context.cc
+++ b/mojo/shell/context.cc
@@ -20,14 +20,12 @@ Context::Context()
scoped_ptr<net::NetworkDelegate>(new NetworkDelegate()),
storage_.profile_path()) {
embedder::Init();
- BindingsSupport::Set(&bindings_support_impl_);
dynamic_service_loader_.reset(new DynamicServiceLoader(this));
service_manager_.set_default_loader(dynamic_service_loader_.get());
}
Context::~Context() {
service_manager_.set_default_loader(NULL);
- BindingsSupport::Set(NULL);
}
} // namespace shell
diff --git a/mojo/shell/context.h b/mojo/shell/context.h
index 566440f..2a4c5c2 100644
--- a/mojo/shell/context.h
+++ b/mojo/shell/context.h
@@ -5,7 +5,6 @@
#ifndef MOJO_SHELL_CONTEXT_H_
#define MOJO_SHELL_CONTEXT_H_
-#include "mojo/common/bindings_support_impl.h"
#include "mojo/shell/loader.h"
#include "mojo/shell/service_manager.h"
#include "mojo/shell/storage.h"
@@ -40,7 +39,6 @@ class Context {
Storage storage_;
Loader loader_;
ServiceManager service_manager_;
- common::BindingsSupportImpl bindings_support_impl_;
scoped_ptr<DynamicServiceLoader> dynamic_service_loader_;
#if defined(OS_ANDROID)
diff --git a/mojo/shell/service_manager_unittest.cc b/mojo/shell/service_manager_unittest.cc
index 9573694..549d762 100644
--- a/mojo/shell/service_manager_unittest.cc
+++ b/mojo/shell/service_manager_unittest.cc
@@ -3,7 +3,6 @@
// found in the LICENSE file.
#include "base/message_loop/message_loop.h"
-#include "mojo/common/bindings_support_impl.h"
#include "mojo/public/bindings/lib/remote_ptr.h"
#include "mojo/shell/service_manager.h"
#include "mojom/shell.h"
@@ -81,7 +80,6 @@ class ServiceManagerTest : public testing::Test,
}
virtual void SetUp() OVERRIDE {
- mojo::BindingsSupport::Set(&support_);
GURL test_url("test:testService");
service_manager_.reset(new ServiceManager);
service_manager_->SetLoaderForURL(this, test_url);
@@ -94,7 +92,6 @@ class ServiceManagerTest : public testing::Test,
test_client_.reset(NULL);
test_app_.reset(NULL);
service_manager_.reset(NULL);
- mojo::BindingsSupport::Set(NULL);
}
virtual void Load(const GURL& url,
@@ -103,7 +100,6 @@ class ServiceManagerTest : public testing::Test,
}
protected:
- common::BindingsSupportImpl support_;
base::MessageLoop loop_;
scoped_ptr<TestApp> test_app_;
scoped_ptr<TestClientImpl> test_client_;
diff --git a/mojo/tools/mojob.sh b/mojo/tools/mojob.sh
index 5d99a6a..ae05015 100755
--- a/mojo/tools/mojob.sh
+++ b/mojo/tools/mojob.sh
@@ -50,11 +50,11 @@ do_unittests() {
"out/$1/mojo_common_unittests" || exit 1
"out/$1/mojo_js_unittests" || exit 1
"out/$1/mojo_public_bindings_unittests" || exit 1
+ "out/$1/mojo_public_environment_unittests" || exit 1
"out/$1/mojo_public_system_unittests" || exit 1
"out/$1/mojo_public_utility_unittests" || exit 1
"out/$1/mojo_shell_unittests" || exit 1
"out/$1/mojo_system_unittests" || exit 1
- "out/$1/mojo_utility_unittests" || exit 1
}
do_perftests() {