| Index: mojo/public/python/src/common.cc
|
| diff --git a/mojo/public/python/src/common.cc b/mojo/public/python/src/common.cc
|
| deleted file mode 100644
|
| index a80d01331259ca09bd39440c4c08db34a9c88613..0000000000000000000000000000000000000000
|
| --- a/mojo/public/python/src/common.cc
|
| +++ /dev/null
|
| @@ -1,173 +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/python/src/common.h"
|
| -
|
| -#include <Python.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 {
|
| -
|
| -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
|
| -
|
| -namespace mojo {
|
| -namespace python {
|
| -
|
| -ScopedGIL::ScopedGIL() {
|
| - state_ = PyGILState_Ensure();
|
| -}
|
| -
|
| -ScopedGIL::~ScopedGIL() {
|
| - PyGILState_Release(state_);
|
| -}
|
| -
|
| -ScopedPyRef::ScopedPyRef(PyObject* object) : object_(object) {
|
| -}
|
| -
|
| -ScopedPyRef::ScopedPyRef(PyObject* object, ScopedPyRefAcquire)
|
| - : object_(object) {
|
| - Py_XINCREF(object_);
|
| -}
|
| -
|
| -ScopedPyRef::~ScopedPyRef() {
|
| - if (object_) {
|
| - ScopedGIL acquire_gil;
|
| - Py_DECREF(object_);
|
| - }
|
| -}
|
| -
|
| -ScopedPyRef::operator PyObject*() const {
|
| - return object_;
|
| -}
|
| -
|
| -PythonClosure::PythonClosure(PyObject* callable, const mojo::Closure& quit)
|
| - : callable_(callable, kAcquire), quit_(quit) {
|
| - MOJO_DCHECK(callable);
|
| -}
|
| -
|
| -PythonClosure::~PythonClosure() {}
|
| -
|
| -void PythonClosure::Run() const {
|
| - ScopedGIL acquire_gil;
|
| - ScopedPyRef empty_tuple(PyTuple_New(0));
|
| - if (!empty_tuple) {
|
| - quit_.Run();
|
| - return;
|
| - }
|
| -
|
| - ScopedPyRef result(PyObject_CallObject(callable_, empty_tuple));
|
| - if (!result) {
|
| - quit_.Run();
|
| - return;
|
| - }
|
| -}
|
| -
|
| -Closure::Runnable* NewRunnableFromCallable(PyObject* callable,
|
| - const mojo::Closure& quit_closure) {
|
| - MOJO_DCHECK(PyCallable_Check(callable));
|
| -
|
| - return new PythonClosure(callable, quit_closure);
|
| -}
|
| -
|
| -class PythonAsyncWaiter::AsyncWaiterRunnable
|
| - : public mojo::Callback<void(MojoResult)>::Runnable {
|
| - public:
|
| - 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(MojoAsyncWaitID wait_id) { wait_id_ = wait_id; }
|
| -
|
| - void Run(MojoResult mojo_result) const override {
|
| - MOJO_DCHECK(wait_id_);
|
| -
|
| - // Remove to reference to this object from PythonAsyncWaiter and ensure this
|
| - // object will be destroyed when this method exits.
|
| - MOJO_DCHECK(callbacks_->find(wait_id_) != callbacks_->end());
|
| - internal::SharedPtr<mojo::Callback<void(MojoResult)>> self =
|
| - (*callbacks_)[wait_id_];
|
| - callbacks_->erase(wait_id_);
|
| -
|
| - ScopedGIL acquire_gil;
|
| - ScopedPyRef args_tuple(Py_BuildValue("(i)", mojo_result));
|
| - if (!args_tuple) {
|
| - quit_.Run();
|
| - return;
|
| - }
|
| -
|
| - ScopedPyRef result(PyObject_CallObject(callable_, args_tuple));
|
| - if (!result) {
|
| - quit_.Run();
|
| - return;
|
| - }
|
| - }
|
| -
|
| - private:
|
| - MojoAsyncWaitID wait_id_;
|
| - ScopedPyRef callable_;
|
| - CallbackMap* callbacks_;
|
| - const mojo::Closure quit_;
|
| -
|
| - MOJO_DISALLOW_COPY_AND_ASSIGN(AsyncWaiterRunnable);
|
| -};
|
| -
|
| -PythonAsyncWaiter::PythonAsyncWaiter(const mojo::Closure& quit_closure)
|
| - : quit_(quit_closure) {
|
| - async_waiter_ = Environment::GetDefaultAsyncWaiter();
|
| -}
|
| -
|
| -PythonAsyncWaiter::~PythonAsyncWaiter() {
|
| - for (CallbackMap::const_iterator it = callbacks_.begin();
|
| - it != callbacks_.end();
|
| - ++it) {
|
| - async_waiter_->CancelWait(it->first);
|
| - }
|
| -}
|
| -
|
| -MojoAsyncWaitID PythonAsyncWaiter::AsyncWait(MojoHandle handle,
|
| - MojoHandleSignals signals,
|
| - MojoDeadline deadline,
|
| - PyObject* callable) {
|
| - 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)));
|
| - MojoAsyncWaitID wait_id = async_waiter_->AsyncWait(
|
| - handle, signals, deadline, &AsyncCallbackForwarder, callback.get());
|
| - callbacks_[wait_id] = callback;
|
| - runner->set_wait_id(wait_id);
|
| - return wait_id;
|
| -}
|
| -
|
| -void PythonAsyncWaiter::CancelWait(MojoAsyncWaitID wait_id) {
|
| - if (callbacks_.find(wait_id) != callbacks_.end()) {
|
| - async_waiter_->CancelWait(wait_id);
|
| - callbacks_.erase(wait_id);
|
| - }
|
| -}
|
| -
|
| -} // namespace python
|
| -} // namespace mojo
|
|
|