1// Copyright 2014 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#ifndef MOJO_PUBLIC_PYTHON_SRC_PYTHON_SYSTEM_HELPER_H_
6#define MOJO_PUBLIC_PYTHON_SRC_PYTHON_SYSTEM_HELPER_H_
7
8// Python must be the first include, as it defines preprocessor variable without
9// checking if they already exist.
10#include <Python.h>
11
12#include <map>
13
14#include "mojo/public/c/environment/async_waiter.h"
15#include "mojo/public/c/system/types.h"
16#include "mojo/public/cpp/bindings/callback.h"
17#include "mojo/public/cpp/bindings/lib/shared_ptr.h"
18
19namespace mojo {
20namespace python {
21
22// Create a mojo::Closure from a callable python object.
23mojo::Closure BuildClosure(PyObject* callable);
24
25class PythonAsyncWaiter {
26 public:
27  PythonAsyncWaiter();
28  ~PythonAsyncWaiter();
29  MojoAsyncWaitID AsyncWait(MojoHandle handle,
30                            MojoHandleSignals signals,
31                            MojoDeadline deadline,
32                            PyObject* callable);
33
34  void CancelWait(MojoAsyncWaitID wait_id);
35
36 private:
37  class AsyncWaiterRunnable;
38
39  typedef std::map<MojoAsyncWaitID,
40                   internal::SharedPtr<mojo::Callback<void(MojoResult)> > >
41      CallbackMap;
42
43  CallbackMap callbacks_;
44  const MojoAsyncWaiter* async_waiter_;
45};
46
47}  // namespace python
48}  // namespace mojo
49
50#endif  // MOJO_PUBLIC_PYTHON_SRC_PYTHON_SYSTEM_HELPER_H_
51