Index: mojo/public/python/src/common.cc |
diff --git a/mojo/public/python/src/python_system_helper.cc b/mojo/public/python/src/common.cc |
similarity index 57% |
copy from mojo/public/python/src/python_system_helper.cc |
copy to mojo/public/python/src/common.cc |
index 22b6bbb4a5d47eff3e459168b387df4e58b3ddf9..a80d01331259ca09bd39440c4c08db34a9c88613 100644 |
--- a/mojo/public/python/src/python_system_helper.cc |
+++ b/mojo/public/python/src/common.cc |
@@ -1,105 +1,104 @@ |
-// Copyright 2014 The Chromium Authors. All rights reserved. |
+// 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/python/src/python_system_helper.h" |
+#include "mojo/public/python/src/common.h" |
-#include "Python.h" |
+#include <Python.h> |
-#include "mojo/public/cpp/environment/environment.h" |
+#include "mojo/public/c/environment/async_waiter.h" |
+#include "mojo/public/cpp/bindings/callback.h" |
+#include "mojo/public/cpp/bindings/lib/shared_ptr.h" |
#include "mojo/public/cpp/environment/logging.h" |
+#include "mojo/public/cpp/system/core.h" |
#include "mojo/public/cpp/system/macros.h" |
#include "mojo/public/cpp/utility/run_loop.h" |
namespace { |
-class ScopedGIL { |
- public: |
- ScopedGIL() { state_ = PyGILState_Ensure(); } |
+void AsyncCallbackForwarder(void* closure, MojoResult result) { |
+ mojo::Callback<void(MojoResult)>* callback = |
+ static_cast<mojo::Callback<void(MojoResult)>*>(closure); |
+ // callback will be deleted when it is run. |
+ callback->Run(result); |
+} |
- ~ScopedGIL() { PyGILState_Release(state_); } |
+} // namespace |
- private: |
- PyGILState_STATE state_; |
+namespace mojo { |
+namespace python { |
- MOJO_DISALLOW_COPY_AND_ASSIGN(ScopedGIL); |
-}; |
+ScopedGIL::ScopedGIL() { |
+ state_ = PyGILState_Ensure(); |
+} |
-enum ScopedPyRefAcquire { |
- kAcquire, |
-}; |
+ScopedGIL::~ScopedGIL() { |
+ PyGILState_Release(state_); |
+} |
-class ScopedPyRef { |
- public: |
- ScopedPyRef(PyObject* object) : object_(object) {} |
- ScopedPyRef(PyObject* object, ScopedPyRefAcquire) : object_(object) { |
- Py_XINCREF(object_); |
- } |
+ScopedPyRef::ScopedPyRef(PyObject* object) : object_(object) { |
+} |
- ~ScopedPyRef() { |
- if (object_) { |
- ScopedGIL acquire_gil; |
- Py_DECREF(object_); |
- } |
+ScopedPyRef::ScopedPyRef(PyObject* object, ScopedPyRefAcquire) |
+ : object_(object) { |
+ Py_XINCREF(object_); |
+} |
+ |
+ScopedPyRef::~ScopedPyRef() { |
+ if (object_) { |
+ ScopedGIL acquire_gil; |
+ Py_DECREF(object_); |
} |
+} |
- operator PyObject*() const { return object_; } |
+ScopedPyRef::operator PyObject*() const { |
+ return object_; |
+} |
- private: |
- PyObject* object_; |
+PythonClosure::PythonClosure(PyObject* callable, const mojo::Closure& quit) |
+ : callable_(callable, kAcquire), quit_(quit) { |
+ MOJO_DCHECK(callable); |
+} |
- MOJO_DISALLOW_COPY_AND_ASSIGN(ScopedPyRef); |
-}; |
+PythonClosure::~PythonClosure() {} |
-class PythonClosure : public mojo::Closure::Runnable { |
- public: |
- PythonClosure(PyObject* callable) : callable_(callable, kAcquire) { |
- MOJO_DCHECK(callable); |
+void PythonClosure::Run() const { |
+ ScopedGIL acquire_gil; |
+ ScopedPyRef empty_tuple(PyTuple_New(0)); |
+ if (!empty_tuple) { |
+ quit_.Run(); |
+ return; |
} |
- void Run() const override { |
- ScopedGIL acquire_gil; |
- ScopedPyRef empty_tuple(PyTuple_New(0)); |
- if (!empty_tuple) { |
- mojo::RunLoop::current()->Quit(); |
- return; |
- } |
- |
- ScopedPyRef result(PyObject_CallObject(callable_, empty_tuple)); |
- if (!result) { |
- mojo::RunLoop::current()->Quit(); |
- return; |
- } |
+ ScopedPyRef result(PyObject_CallObject(callable_, empty_tuple)); |
+ if (!result) { |
+ quit_.Run(); |
+ return; |
} |
- |
- private: |
- ScopedPyRef callable_; |
- |
- MOJO_DISALLOW_COPY_AND_ASSIGN(PythonClosure); |
-}; |
- |
-void AsyncCallbackForwarder(void* closure, MojoResult result) { |
- mojo::Callback<void(MojoResult)>* callback = |
- static_cast<mojo::Callback<void(MojoResult)>*>(closure); |
- // callback will be deleted when it is run. |
- callback->Run(result); |
} |
-} // namespace |
+Closure::Runnable* NewRunnableFromCallable(PyObject* callable, |
+ const mojo::Closure& quit_closure) { |
+ MOJO_DCHECK(PyCallable_Check(callable)); |
-namespace mojo { |
-namespace python { |
+ return new PythonClosure(callable, quit_closure); |
+} |
class PythonAsyncWaiter::AsyncWaiterRunnable |
: public mojo::Callback<void(MojoResult)>::Runnable { |
public: |
- AsyncWaiterRunnable(PyObject* callable, CallbackMap* callbacks) |
- : wait_id_(0), callable_(callable, kAcquire), callbacks_(callbacks) { |
- MOJO_DCHECK(callable); |
+ AsyncWaiterRunnable(PyObject* callable, |
+ CallbackMap* callbacks, |
+ const mojo::Closure& quit) |
+ : wait_id_(0), |
+ callable_(callable, kAcquire), |
+ callbacks_(callbacks), |
+ quit_(quit) { |
+ MOJO_DCHECK(callable_); |
MOJO_DCHECK(callbacks_); |
} |
- void set_wait_id(int wait_id) { wait_id_ = wait_id; } |
+ void set_wait_id(MojoAsyncWaitID wait_id) { wait_id_ = wait_id; } |
void Run(MojoResult mojo_result) const override { |
MOJO_DCHECK(wait_id_); |
@@ -114,13 +113,13 @@ class PythonAsyncWaiter::AsyncWaiterRunnable |
ScopedGIL acquire_gil; |
ScopedPyRef args_tuple(Py_BuildValue("(i)", mojo_result)); |
if (!args_tuple) { |
- mojo::RunLoop::current()->Quit(); |
+ quit_.Run(); |
return; |
} |
ScopedPyRef result(PyObject_CallObject(callable_, args_tuple)); |
if (!result) { |
- mojo::RunLoop::current()->Quit(); |
+ quit_.Run(); |
return; |
} |
} |
@@ -129,19 +128,13 @@ class PythonAsyncWaiter::AsyncWaiterRunnable |
MojoAsyncWaitID wait_id_; |
ScopedPyRef callable_; |
CallbackMap* callbacks_; |
+ const mojo::Closure quit_; |
MOJO_DISALLOW_COPY_AND_ASSIGN(AsyncWaiterRunnable); |
}; |
-Closure BuildClosure(PyObject* callable) { |
- if (!PyCallable_Check(callable)) |
- return Closure(); |
- |
- return Closure( |
- static_cast<mojo::Closure::Runnable*>(new PythonClosure(callable))); |
-} |
- |
-PythonAsyncWaiter::PythonAsyncWaiter() { |
+PythonAsyncWaiter::PythonAsyncWaiter(const mojo::Closure& quit_closure) |
+ : quit_(quit_closure) { |
async_waiter_ = Environment::GetDefaultAsyncWaiter(); |
} |
@@ -157,7 +150,8 @@ MojoAsyncWaitID PythonAsyncWaiter::AsyncWait(MojoHandle handle, |
MojoHandleSignals signals, |
MojoDeadline deadline, |
PyObject* callable) { |
- AsyncWaiterRunnable* runner = new AsyncWaiterRunnable(callable, &callbacks_); |
+ AsyncWaiterRunnable* runner = |
+ new AsyncWaiterRunnable(callable, &callbacks_, quit_); |
internal::SharedPtr<mojo::Callback<void(MojoResult)>> callback( |
new mojo::Callback<void(MojoResult)>( |
static_cast<mojo::Callback<void(MojoResult)>::Runnable*>(runner))); |