11320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci# Copyright 2014 The Chromium Authors. All rights reserved.
21320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci# Use of this source code is governed by a BSD-style license that can be
31320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci# found in the LICENSE file.
41320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
51320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci# distutils language = c++
61320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
71320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccicimport c_core
81320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccicimport c_environment
91320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccifrom cpython.buffer cimport PyBUF_CONTIG
121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccifrom cpython.buffer cimport PyBUF_CONTIG_RO
131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccifrom cpython.buffer cimport Py_buffer
141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccifrom cpython.buffer cimport PyBuffer_FillInfo
151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccifrom cpython.buffer cimport PyBuffer_Release
161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccifrom cpython.buffer cimport PyObject_GetBuffer
171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccifrom cpython.mem cimport PyMem_Malloc, PyMem_Free
181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccifrom libc.stdint cimport int32_t, int64_t, uint32_t, uint64_t, uintptr_t
191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccidef SetSystemThunks(system_thunks_as_object):
211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  """Bind the basic Mojo Core functions.
221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  This should only be used by the embedder.
241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  """
251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  cdef const c_core.MojoSystemThunks* system_thunks = (
261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      <const c_core.MojoSystemThunks*><uintptr_t>system_thunks_as_object)
271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  c_core.MojoSetSystemThunks(system_thunks)
281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciHANDLE_INVALID = c_core.MOJO_HANDLE_INVALID
301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciRESULT_OK = c_core.MOJO_RESULT_OK
311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciRESULT_CANCELLED = c_core.MOJO_RESULT_CANCELLED
321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciRESULT_UNKNOWN = c_core.MOJO_RESULT_UNKNOWN
331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciRESULT_INVALID_ARGUMENT = c_core.MOJO_RESULT_INVALID_ARGUMENT
341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciRESULT_DEADLINE_EXCEEDED = c_core.MOJO_RESULT_DEADLINE_EXCEEDED
351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciRESULT_NOT_FOUND = c_core.MOJO_RESULT_NOT_FOUND
361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciRESULT_ALREADY_EXISTS = c_core.MOJO_RESULT_ALREADY_EXISTS
371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciRESULT_PERMISSION_DENIED = c_core.MOJO_RESULT_PERMISSION_DENIED
381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciRESULT_RESOURCE_EXHAUSTED = c_core.MOJO_RESULT_RESOURCE_EXHAUSTED
391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciRESULT_FAILED_PRECONDITION = c_core.MOJO_RESULT_FAILED_PRECONDITION
401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciRESULT_ABORTED = c_core.MOJO_RESULT_ABORTED
411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciRESULT_OUT_OF_RANGE = c_core.MOJO_RESULT_OUT_OF_RANGE
421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciRESULT_UNIMPLEMENTED = c_core.MOJO_RESULT_UNIMPLEMENTED
431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciRESULT_INTERNAL = c_core.MOJO_RESULT_INTERNAL
441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciRESULT_UNAVAILABLE = c_core.MOJO_RESULT_UNAVAILABLE
451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciRESULT_DATA_LOSS = c_core.MOJO_RESULT_DATA_LOSS
461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciRESULT_BUSY = c_core.MOJO_RESULT_BUSY
471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciRESULT_SHOULD_WAIT = c_core.MOJO_RESULT_SHOULD_WAIT
481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciDEADLINE_INDEFINITE = c_core.MOJO_DEADLINE_INDEFINITE
491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciHANDLE_SIGNAL_NONE = c_core.MOJO_HANDLE_SIGNAL_NONE
501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciHANDLE_SIGNAL_READABLE = c_core.MOJO_HANDLE_SIGNAL_READABLE
511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciHANDLE_SIGNAL_WRITABLE = c_core.MOJO_HANDLE_SIGNAL_WRITABLE
521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciWRITE_MESSAGE_FLAG_NONE = c_core.MOJO_WRITE_MESSAGE_FLAG_NONE
531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciREAD_MESSAGE_FLAG_NONE = c_core.MOJO_READ_MESSAGE_FLAG_NONE
541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciREAD_MESSAGE_FLAG_MAY_DISCARD = c_core.MOJO_READ_MESSAGE_FLAG_MAY_DISCARD
551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciWRITE_DATA_FLAG_NONE = c_core.MOJO_WRITE_DATA_FLAG_NONE
561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciWRITE_DATA_FLAG_ALL_OR_NONE = c_core.MOJO_WRITE_DATA_FLAG_ALL_OR_NONE
571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciREAD_DATA_FLAG_NONE = c_core.MOJO_READ_DATA_FLAG_NONE
581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciREAD_DATA_FLAG_ALL_OR_NONE = c_core.MOJO_READ_DATA_FLAG_ALL_OR_NONE
591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciREAD_DATA_FLAG_DISCARD = c_core.MOJO_READ_DATA_FLAG_DISCARD
601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciREAD_DATA_FLAG_QUERY = c_core.MOJO_READ_DATA_FLAG_QUERY
611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciMAP_BUFFER_FLAG_NONE = c_core.MOJO_MAP_BUFFER_FLAG_NONE
621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccidef GetTimeTicksNow():
641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  """Monotonically increasing tick count representing "right now."
651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  See mojo/public/c/system/functions.h
671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  """
681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return c_core.MojoGetTimeTicksNow()
691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccicdef class _ScopedMemory:
711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  """Allocate memory at creation, and deallocate it at destruction."""
721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  cdef void* memory
731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  def __init__(self, size):
741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    self.memory = PyMem_Malloc(size)
751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  def __dealloc__(self):
771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    PyMem_Free(self.memory)
781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccicdef class _ScopedBuffer:
801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  """Retrieve pointer to a buffer a creation, and release it at destruction.
811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  """
821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  cdef Py_buffer _buf
831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  cdef void* buf
841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  cdef Py_ssize_t len
851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  def __init__(self, obj, flags=PyBUF_CONTIG_RO):
871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if obj:
881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      if PyObject_GetBuffer(obj, &self._buf, flags) < 0:
891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        raise TypeError('Unable to read buffer.')
901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      self.buf = self._buf.buf
911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      self.len = self._buf.len
921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    else:
931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      self.buf = NULL
941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      self.len = 0
951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  def __dealloc__(self):
971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if self.buf:
981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      PyBuffer_Release(&self._buf)
991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccidef _SliceBuffer(buffer, size):
1011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  """Slice the given buffer, reducing it to the given size.
1021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  Return None if None is passed in.
1041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  """
1051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if not buffer:
1061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return buffer
1071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return buffer[:size]
1081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccicdef class _NativeMemoryView(object):
1101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  """Create a python buffer wrapping the given memory.
1111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  Will also retain the given handle until this object is deallocated.
1131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  """
1141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  cdef void* _memory
1151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  cdef uint32_t _size
1161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  cdef char _read_only
1171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  cdef char _wrapped
1181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  cdef object _handle
1191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  def __init__(self, handle):
1211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    self._handle = handle
1221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  def __cinit__(self):
1241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    self._memory = NULL
1251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    self._size = 0
1261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    self._read_only = True
1271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    self._wrapped = False
1281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  cdef Wrap(self,
1301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            const void* memory,
1311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            uint32_t size,
1321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            read_only=True):
1331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    """Makes this buffer wraps the given memory.
1341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    Must be called before using this buffer, and must only be called once.
1361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    """
1371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    assert not self._wrapped
1381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    self._wrapped = True
1391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    self._memory = <void*>memory
1401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    self._size = size
1411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    self._read_only = read_only
1421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  # buffer interface (PEP 3118)
1441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  def __getbuffer__(self, Py_buffer *view, int flags):
1451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    assert self._wrapped
1461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if view == NULL:
1471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      return
1481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    PyBuffer_FillInfo(view,
1491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                      self,
1501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                      self._memory,
1511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                      self._size,
1521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                      self._read_only,
1531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                      flags)
1541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  def __releasebuffer__(self, Py_buffer *view):
1561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    assert self._wrapped
1571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    pass
1581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  # legacy buffer interface
1601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  def __getsegcount__(self, Py_ssize_t *sizes):
1611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    assert self._wrapped
1621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if sizes != NULL:
1631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      sizes[0] = self._size
1641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return 1
1651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  def __getreadbuffer__(self, Py_ssize_t index, void **data):
1671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    assert self._wrapped
1681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if index != 0:
1691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      raise SystemError('Index out of bounds: %d' % index)
1701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    data[0] = self._memory
1711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return self._size
1721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  def __getwritebuffer__(self, Py_ssize_t index, void **data):
1741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    assert self._wrapped
1751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if index != 0:
1761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      raise SystemError('Index out of bounds: %d' % index)
1771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if self._read_only:
1781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      raise TypeError('Buffer is read-only.')
1791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    data[0] = self._memory
1801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return self._size
1811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciclass MojoException(Exception):
1831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  """Exception wrapping a mojo result error code."""
1841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  def __init__(self, mojo_result):
1861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    self.mojo_result = mojo_result
1871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccidef WaitMany(handles_and_signals, deadline):
1891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  """Waits on a list of handles.
1901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  Args:
1921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    handles_and_signals: list of tuples of handle and signal.
1931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  See mojo/public/c/system/functions.h
1951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  """
1961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  cdef uint32_t length = len(handles_and_signals)
1971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  cdef _ScopedMemory handles_alloc = _ScopedMemory(
1981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      sizeof(c_core.MojoHandle) * length)
1991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  cdef _ScopedMemory signals_alloc = _ScopedMemory(
2001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      sizeof(c_core.MojoHandleSignals) * length)
2011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  cdef c_core.MojoHandle* handles = <c_core.MojoHandle*>handles_alloc.memory
2021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  cdef c_core.MojoHandleSignals* signals = (
2031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      <c_core.MojoHandleSignals*>signals_alloc.memory)
2041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  cdef int index = 0
2051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  for (h, s) in handles_and_signals:
2061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    handles[index] = (<Handle?>h)._mojo_handle
2071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    signals[index] = s
2081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    index += 1
2091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  cdef c_core.MojoResult result = c_core.MOJO_RESULT_OK
2101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  cdef c_core.MojoDeadline cdeadline = deadline
2111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  with nogil:
2121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    result = c_core.MojoWaitMany(handles, signals, length, cdeadline)
2131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return result
2141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccicdef class DataPipeTwoPhaseBuffer(object):
2161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  """Return value for two phases read and write.
2171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  The buffer field contains the python buffer where data can be read or written.
2191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  When done with the buffer, the |end| method must be called with the number of
2201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  bytes read or written.
2211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  """
2221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  cdef object _buffer
2241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  cdef Handle _handle
2251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  cdef char _read
2261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  def __init__(self, handle, buffer, read=True):
2281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    self._buffer = buffer
2291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    self._handle = handle
2301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    self._read = read
2311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  def End(self, num_bytes):
2331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    self._buffer = None
2341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    cdef c_core.MojoResult result
2351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if self._read:
2361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      result = c_core.MojoEndReadData(self._handle._mojo_handle, num_bytes)
2371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    else:
2381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      result = c_core.MojoEndWriteData(self._handle._mojo_handle, num_bytes)
2391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    self._handle = None
2401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return result
2411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  @property
2431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  def buffer(self):
2441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return self._buffer
2451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  def __dealloc__(self):
2471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    assert not self._buffer
2481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccicdef class MappedBuffer(object):
2501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  """Return value for the |map| operation on shared buffer handles.
2511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  The buffer field contains the python buffer where data can be read or written.
2531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  When done with the buffer, the |unmap| method must be called.
2541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  """
2551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  cdef object _buffer
2571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  cdef object _handle
2581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  cdef object _cleanup
2591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  def __init__(self, handle, buffer, cleanup):
2611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    self._buffer = buffer
2621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    self._handle = handle
2631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    self._cleanup = cleanup
2641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  def UnMap(self):
2661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    self._buffer = None
2671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    cdef c_core.MojoResult result = self._cleanup()
2681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    self._cleanup = None
2691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    self._handle = None
2701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return result
2711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  @property
2731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  def buffer(self):
2741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return self._buffer
2751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  def __dealloc__(self):
2771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if self._buffer:
2781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      self.UnMap()
2791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccicdef class Handle(object):
2811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  """A mojo object."""
2821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  cdef c_core.MojoHandle _mojo_handle
2841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  def __init__(self, mojo_handle=c_core.MOJO_HANDLE_INVALID):
2861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    self._mojo_handle = mojo_handle
2871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  def _Invalidate(self):
2891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    """Invalidate the current handle.
2901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    The close operation is not called. It is the responsability of the caller to
2921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    ensure that the handle is not leaked.
2931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    """
2941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    self._mojo_handle = c_core.MOJO_HANDLE_INVALID
2951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  def IsValid(self):
2971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    """Returns whether this handle is valid."""
2981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return self._mojo_handle != c_core.MOJO_HANDLE_INVALID
2991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
3001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  def Close(self):
3011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    """Closes this handle.
3021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
3031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    See mojo/public/c/system/functions.h
3041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    """
3051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    cdef c_core.MojoResult result = c_core.MOJO_RESULT_OK
3061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if self.IsValid():
3071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      result = c_core.MojoClose(self._mojo_handle)
3081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      self._Invalidate()
3091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return result
3101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
3111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  def __dealloc__(self):
3121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    self.Close()
3131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
3141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  def Wait(self, signals, deadline):
3151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    """Waits on the given handle.
3161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
3171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    See mojo/public/c/system/functions.h
3181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    """
3191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    cdef c_core.MojoHandle handle = self._mojo_handle
3201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    cdef c_core.MojoHandleSignals csignals = signals
3211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    cdef c_core.MojoDeadline cdeadline = deadline
3221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    cdef c_core.MojoResult result
3231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    with nogil:
3241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      result = c_core.MojoWait(handle, csignals, cdeadline)
3251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return result
3261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
3271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  def AsyncWait(self, signals, deadline, callback):
3281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    cdef c_core.MojoHandle handle = self._mojo_handle
3291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    cdef c_core.MojoHandleSignals csignals = signals
3301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    cdef c_core.MojoDeadline cdeadline = deadline
3311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    cdef c_environment.MojoAsyncWaitID wait_id = _ASYNC_WAITER.AsyncWait(
3321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        handle,
3331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        csignals,
3341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        cdeadline,
3351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        callback)
3361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    def cancel():
3371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      _ASYNC_WAITER.CancelWait(wait_id)
3381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return cancel
3391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
3401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  def WriteMessage(self,
3411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                    buffer=None,
3421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                    handles=None,
3431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                    flags=WRITE_MESSAGE_FLAG_NONE):
3441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    """Writes a message to the message pipe.
3451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
3461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    This method can only be used on a handle obtained from |MessagePipe()|.
3471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
3481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    See mojo/public/c/system/message_pipe.h
3491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    """
3501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    cdef _ScopedBuffer buffer_as_buffer = _ScopedBuffer(buffer)
3511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    cdef uint32_t input_buffer_length = buffer_as_buffer.len
3521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    cdef c_core.MojoHandle* input_handles = NULL
3531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    cdef uint32_t input_handles_length = 0
3541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    cdef _ScopedMemory handles_alloc = None
3551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if handles:
3561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      input_handles_length = len(handles)
3571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      handles_alloc = _ScopedMemory(sizeof(c_core.MojoHandle) *
3581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                    input_handles_length)
3591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      input_handles = <c_core.MojoHandle*>handles_alloc.memory
3601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      for i in xrange(input_handles_length):
3611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        input_handles[i] = (<Handle?>handles[i])._mojo_handle
3621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    cdef c_core.MojoResult res = c_core.MojoWriteMessage(self._mojo_handle,
3631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                                         buffer_as_buffer.buf,
3641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                                         input_buffer_length,
3651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                                         input_handles,
3661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                                         input_handles_length,
3671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                                         flags)
3681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if res == c_core.MOJO_RESULT_OK and handles:
3691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      # Handles have been transferred. Let's invalidate those.
3701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      for handle in handles:
3711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        handle._Invalidate()
3721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return res
3731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
3741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  def ReadMessage(self,
3751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                   buffer=None,
3761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                   max_number_of_handles=0,
3771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                   flags=READ_MESSAGE_FLAG_NONE):
3781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    """Reads a message from the message pipe.
3791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
3801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    This method can only be used on a handle obtained from |MessagePipe()|.
3811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
3821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    This method returns a triplet of value (code, data, sizes):
3831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    - if code is RESULT_OK, sizes will be None, and data will be a pair of
3841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      (buffer, handles) where buffer is a view of the input buffer with the read
3851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      data, and handles is a list of received handles.
3861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    - if code is RESULT_RESOURCE_EXHAUSTED, data will be None and sizes will be
3871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      a pair of (buffer_size, handles_size) where buffer_size is the size of the
3881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      next message data and handles_size is the number of handles in the next
3891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      message.
3901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    - if code is any other value, data and sizes will be None.
3911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
3921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    See mojo/public/c/system/message_pipe.h
3931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    """
3941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    cdef _ScopedBuffer buffer_as_buffer = _ScopedBuffer(buffer, PyBUF_CONTIG)
3951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    cdef uint32_t input_buffer_length = buffer_as_buffer.len
3961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    cdef c_core.MojoHandle* input_handles = NULL
3971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    cdef uint32_t input_handles_length = 0
3981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    cdef _ScopedMemory handles_alloc = None
3991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if max_number_of_handles > 0:
4001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      input_handles_length = max_number_of_handles
4011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      handles_alloc = _ScopedMemory(sizeof(c_core.MojoHandle) *
4021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                    input_handles_length)
4031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      input_handles = <c_core.MojoHandle*>handles_alloc.memory
4041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    cdef res = c_core.MojoReadMessage(self._mojo_handle,
4051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                      buffer_as_buffer.buf,
4061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                      &input_buffer_length,
4071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                      input_handles,
4081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                      &input_handles_length,
4091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                      flags)
4101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if res == c_core.MOJO_RESULT_RESOURCE_EXHAUSTED:
4111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      return (res, None, (input_buffer_length, input_handles_length))
4121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if res == c_core.MOJO_RESULT_OK:
4131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      returned_handles = [Handle(input_handles[i])
4141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                          for i in xrange(input_handles_length)]
4151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      return (res,
4161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci              (_SliceBuffer(buffer, input_buffer_length), returned_handles),
4171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci              None)
4181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return (res, None, None)
4191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
4201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  def WriteData(self, buffer=None, flags=WRITE_DATA_FLAG_NONE):
4211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    """
4221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    Writes the given data to the data pipe producer.
4231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
4241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    This method can only be used on a producer handle obtained from
4251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    |DataPipe()|.
4261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
4271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    This method returns a tuple (code, num_bytes).
4281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    - If code is RESULT_OK, num_bytes is the number of written bytes.
4291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    - Otherwise, num_bytes is None.
4301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
4311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    See mojo/public/c/system/data_pipe.h
4321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    """
4331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    cdef _ScopedBuffer buffer_as_buffer = _ScopedBuffer(buffer)
4341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    cdef uint32_t input_buffer_length = buffer_as_buffer.len
4351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    cdef c_core.MojoResult res = c_core.MojoWriteData(self._mojo_handle,
4361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                                      buffer_as_buffer.buf,
4371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                                      &input_buffer_length,
4381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                                      flags)
4391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if res == c_core.MOJO_RESULT_OK:
4401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      return (res, input_buffer_length)
4411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return (res, None)
4421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
4431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  def BeginWriteData(self,
4441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                       min_size=None,
4451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                       flags=WRITE_DATA_FLAG_NONE):
4461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    """
4471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    Begins a two-phase write to the data pipe producer.
4481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
4491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    This method can only be used on a producer handle obtained from
4501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    |DataPipe()|.
4511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
4521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    This method returns a tuple (code, two_phase_buffer).
4531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    - If code is RESULT_OK, two_phase_buffer is a writable
4541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      DataPipeTwoPhaseBuffer
4551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    - Otherwise, two_phase_buffer is None.
4561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
4571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    See mojo/public/c/system/data_pipe.h
4581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    """
4591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    cdef void* out_buffer
4601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    cdef uint32_t out_size = 0
4611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if min_size:
4621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      flags |= c_core.MOJO_WRITE_DATA_FLAG_ALL_OR_NONE
4631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      out_size = min_size
4641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    cdef c_core.MojoResult res = c_core.MojoBeginWriteData(self._mojo_handle,
4651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                                           &out_buffer,
4661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                                           &out_size,
4671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                                           flags)
4681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if res != c_core.MOJO_RESULT_OK:
4691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      return (res, None)
4701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    cdef _NativeMemoryView view_buffer = _NativeMemoryView(self)
4711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    view_buffer.Wrap(out_buffer, out_size, read_only=False)
4721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return (res, DataPipeTwoPhaseBuffer(self, memoryview(view_buffer), False))
4731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
4741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  def ReadData(self, buffer=None, flags=READ_DATA_FLAG_NONE):
4751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    """Reads data from the data pipe consumer.
4761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
4771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    This method can only be used on a consumer handle obtained from
4781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    |DataPipe()|.
4791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
4801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    This method returns a tuple (code, buffer)
4811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    - if code is RESULT_OK, buffer will be a view of the input buffer with the
4821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      read data.
4831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    - otherwise, buffer will be None.
4841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
4851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    See mojo/public/c/system/data_pipe.h
4861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    """
4871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    cdef _ScopedBuffer buffer_as_buffer = _ScopedBuffer(buffer)
4881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    cdef uint32_t input_buffer_length = buffer_as_buffer.len
4891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    cdef c_core.MojoResult res = c_core.MojoReadData(self._mojo_handle,
4901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                                     buffer_as_buffer.buf,
4911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                                     &input_buffer_length,
4921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                                     flags)
4931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if res == c_core.MOJO_RESULT_OK:
4941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      return (res, _SliceBuffer(buffer, input_buffer_length))
4951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return (res, None)
4961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
4971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  def QueryData(self, flags=READ_DATA_FLAG_NONE):
4981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    """Queries the amount of data available on the data pipe consumer.
4991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
5001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    This method can only be used on a consumer handle obtained from
5011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    |DataPipe()|.
5021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
5031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    This method returns a tuple (code, num_bytes)
5041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    - if code is RESULT_OK, num_bytes will be the number of bytes available on
5051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      the data pipe consumer.
5061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    - otherwise, num_bytes will be None.
5071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
5081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    See mojo/public/c/system/data_pipe.h
5091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    """
5101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    cdef uint32_t num_bytes = 0
5111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    cdef c_core.MojoResult res = c_core.MojoReadData(
5121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        self._mojo_handle,
5131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        NULL,
5141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        &num_bytes,
5151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        flags|c_core.MOJO_READ_DATA_FLAG_QUERY)
5161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return (res, num_bytes)
5171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
5181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  def BeginReadData(self, min_size=None, flags=READ_DATA_FLAG_NONE):
5191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    """
5201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    Begins a two-phase read to the data pipe consumer.
5211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
5221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    This method can only be used on a consumer handle obtained from
5231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    |DataPipe()|.
5241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
5251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    This method returns a tuple (code, two_phase_buffer).
5261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    - If code is RESULT_OK, two_phase_buffer is a readable
5271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      DataPipeTwoPhaseBuffer
5281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    - Otherwise, two_phase_buffer is None.
5291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
5301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    See mojo/public/c/system/data_pipe.h
5311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    """
5321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    cdef const void* out_buffer
5331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    cdef uint32_t out_size = 0
5341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if min_size:
5351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      flags |= c_core.MOJO_READ_DATA_FLAG_ALL_OR_NONE
5361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      out_size = min_size
5371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    cdef c_core.MojoResult res = c_core.MojoBeginReadData(self._mojo_handle,
5381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                                          &out_buffer,
5391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                                          &out_size,
5401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                                          flags)
5411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if res != c_core.MOJO_RESULT_OK:
5421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      return (res, None)
5431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    cdef _NativeMemoryView view_buffer = _NativeMemoryView(self)
5441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    view_buffer.Wrap(out_buffer, out_size, read_only=True)
5451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return (res, DataPipeTwoPhaseBuffer(self, memoryview(view_buffer), True))
5461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
5471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  def Duplicate(self, options=None):
5481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    """Duplicate the shared buffer handle.
5491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
5501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    This method can only be used on a handle obtained from
5511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    |CreateSharedBuffer()| or |Duplicate()|.
5521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
5531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    See mojo/public/c/system/buffer.h
5541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    """
5551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    cdef c_core.MojoDuplicateBufferHandleOptions coptions
5561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    cdef c_core.MojoDuplicateBufferHandleOptions* coptions_ptr = NULL
5571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    cdef c_core.MojoHandle cnew_handle = c_core.MOJO_HANDLE_INVALID
5581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if options:
5591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      coptions.struct_size = sizeof(c_core.MojoDuplicateBufferHandleOptions)
5601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      coptions.flags = options.flags
5611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      coptions_ptr = &coptions
5621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    cdef c_core.MojoResult result = c_core.MojoDuplicateBufferHandle(
5631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        self._mojo_handle, coptions_ptr, &cnew_handle)
5641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    new_handle = Handle(cnew_handle)
5651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if result != c_core.MOJO_RESULT_OK:
5661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      raise MojoException(result)
5671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return new_handle
5681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
5691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  def Map(self, offset, num_bytes, flags=MAP_BUFFER_FLAG_NONE):
5701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    """Maps the part (at offset |offset| of length |num_bytes|) of the buffer.
5711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
5721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    This method can only be used on a handle obtained from
5731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    |CreateSharedBuffer()| or |Duplicate()|.
5741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
5751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    This method returns a tuple (code, mapped_buffer).
5761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    - If code is RESULT_OK, mapped_buffer is a readable/writable
5771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      MappedBuffer
5781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    - Otherwise, mapped_buffer is None.
5791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
5801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    See mojo/public/c/system/buffer.h
5811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    """
5821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    cdef void* buffer
5831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    res = c_core.MojoMapBuffer(self._mojo_handle,
5841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                               offset,
5851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                               num_bytes,
5861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                               &buffer,
5871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                               flags)
5881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if res != c_core.MOJO_RESULT_OK:
5891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      return (res, None)
5901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    cdef _NativeMemoryView view_buffer = _NativeMemoryView(self)
5911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    view_buffer.Wrap(buffer, num_bytes, read_only=False)
5921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return (res, MappedBuffer(self,
5931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                              memoryview(view_buffer),
5941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                              lambda: c_core.MojoUnmapBuffer(buffer)))
5951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
5961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciclass CreateMessagePipeOptions(object):
5971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  """Options for creating a message pipe.
5981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
5991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  See mojo/public/c/system/message_pipe.h
6001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  """
6011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  FLAG_NONE = c_core.MOJO_CREATE_MESSAGE_PIPE_OPTIONS_FLAG_NONE
6021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
6031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  def __init__(self):
6041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    self.flags = CreateMessagePipeOptions.FLAG_NONE
6051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
6061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciclass MessagePipe(object):
6071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  """Creates a message pipe.
6081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
6091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  The two ends of the message pipe are accessible with the members handle0 and
6101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  handle1.
6111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
6121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  See mojo/public/c/system/message_pipe.h
6131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  """
6141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  def __init__(self, options=None):
6151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    cdef c_core.MojoCreateMessagePipeOptions coptions
6161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    cdef c_core.MojoCreateMessagePipeOptions* coptions_ptr = NULL
6171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    cdef c_core.MojoHandle chandle0 = c_core.MOJO_HANDLE_INVALID
6181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    cdef c_core.MojoHandle chandle1 = c_core.MOJO_HANDLE_INVALID
6191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if options:
6201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      coptions.struct_size = sizeof(c_core.MojoCreateMessagePipeOptions)
6211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      coptions.flags = options.flags
6221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      coptions_ptr = &coptions
6231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    cdef c_core.MojoResult result = c_core.MojoCreateMessagePipe(coptions_ptr,
6241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                                                 &chandle0,
6251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                                                 &chandle1)
6261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    self.handle0 = Handle(chandle0)
6271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    self.handle1 = Handle(chandle1)
6281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if result != c_core.MOJO_RESULT_OK:
6291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      raise c_core.MojoException(result)
6301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
6311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
6321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciclass CreateDataPipeOptions(object):
6331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  """Options for creating a data pipe.
6341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
6351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  See mojo/public/c/system/data_pipe.h
6361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  """
6371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  FLAG_NONE = c_core.MOJO_CREATE_DATA_PIPE_OPTIONS_FLAG_NONE
6381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  FLAG_MAY_DISCARD = c_core.MOJO_CREATE_DATA_PIPE_OPTIONS_FLAG_MAY_DISCARD
6391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
6401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  def __init__(self):
6411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    self.flags = CreateDataPipeOptions.FLAG_NONE
6421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    self.element_num_bytes = 1
6431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    self.capacity_num_bytes = 0
6441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
6451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciclass DataPipe(object):
6461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  """Creates a data pipe.
6471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
6481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  The producer end of the data pipe is accessible with the member
6491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  producer_handle and the consumer end of the data pipe is accessible with the
6501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  member cconsumer_handle.
6511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
6521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  See mojo/public/c/system/data_pipe.h
6531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  """
6541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  def __init__(self, options=None):
6551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    cdef c_core.MojoCreateDataPipeOptions coptions
6561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    cdef c_core.MojoCreateDataPipeOptions* coptions_ptr = NULL
6571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    cdef c_core.MojoHandle cproducer_handle = c_core.MOJO_HANDLE_INVALID
6581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    cdef c_core.MojoHandle cconsumer_handle = c_core.MOJO_HANDLE_INVALID
6591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if options:
6601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      coptions.struct_size = sizeof(c_core.MojoCreateDataPipeOptions)
6611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      coptions.flags = options.flags
6621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      coptions.element_num_bytes = options.element_num_bytes
6631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      coptions.capacity_num_bytes = options.capacity_num_bytes
6641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      coptions_ptr = &coptions
6651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    cdef c_core.MojoResult result = c_core.MojoCreateDataPipe(coptions_ptr,
6661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                                              &cproducer_handle,
6671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                                              &cconsumer_handle)
6681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    self.producer_handle = Handle(cproducer_handle)
6691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    self.consumer_handle = Handle(cconsumer_handle)
6701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if result != c_core.MOJO_RESULT_OK:
6711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      raise MojoException(result)
6721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
6731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciclass CreateSharedBufferOptions(object):
6741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  """Options for creating a shared buffer.
6751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
6761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  See mojo/public/c/system/buffer.h
6771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  """
6781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  FLAG_NONE = c_core.MOJO_CREATE_SHARED_BUFFER_OPTIONS_FLAG_NONE
6791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
6801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  def __init__(self):
6811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    self.flags = CreateSharedBufferOptions.FLAG_NONE
6821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
6831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccidef CreateSharedBuffer(num_bytes, options=None):
6841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  """Creates a buffer of size |num_bytes| bytes that can be shared.
6851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
6861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  See mojo/public/c/system/buffer.h
6871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  """
6881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  cdef c_core.MojoCreateSharedBufferOptions coptions
6891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  cdef c_core.MojoCreateSharedBufferOptions* coptions_ptr = NULL
6901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  cdef c_core.MojoHandle chandle = c_core.MOJO_HANDLE_INVALID
6911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if options:
6921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    coptions.struct_size = sizeof(c_core.MojoCreateSharedBufferOptions)
6931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    coptions.flags = options.flags
6941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    coptions_ptr = &coptions
6951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  cdef c_core.MojoResult result = c_core.MojoCreateSharedBuffer(coptions_ptr,
6961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                                                num_bytes,
6971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                                                &chandle)
6981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  handle = Handle(chandle)
6991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if result != c_core.MOJO_RESULT_OK:
7001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    raise MojoException(result)
7011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return handle
7021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
7031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciclass DuplicateSharedBufferOptions(object):
7041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  """Options for duplicating a shared buffer.
7051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
7061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  See mojo/public/c/system/buffer.h
7071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  """
7081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  FLAG_NONE = c_core.MOJO_DUPLICATE_BUFFER_HANDLE_OPTIONS_FLAG_NONE
7091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
7101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  def __init__(self):
7111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    self.flags = DuplicateSharedBufferOptions.FLAG_NONE
7121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
7131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
7141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccicdef class RunLoop(object):
7151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  """RunLoop to use when using asynchronous operations on handles."""
7161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
7171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  cdef c_environment.CRunLoop c_run_loop
7181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
7191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  def Run(self):
7201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    """Run the runloop until Quit is called."""
7211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    self.c_run_loop.Run()
7221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
7231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  def RunUntilIdle(self):
7241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    """Run the runloop until Quit is called or no operation is waiting."""
7251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    self.c_run_loop.RunUntilIdle()
7261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
7271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  def Quit(self):
7281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    """Quit the runloop."""
7291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    self.c_run_loop.Quit()
7301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
7311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  def PostDelayedTask(self, runnable, delay=0):
7321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    """
7331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    Post a task on the runloop. This must be called from the thread owning the
7341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    runloop.
7351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    """
7361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    cdef c_environment.CClosure closure = c_environment.BuildClosure(runnable)
7371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    self.c_run_loop.PostDelayedTask(closure, delay)
7381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
7391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
7401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccicdef c_environment.CEnvironment* _ENVIRONMENT = new c_environment.CEnvironment()
7411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccicdef c_environment.PythonAsyncWaiter* _ASYNC_WAITER = new c_environment.PythonAsyncWaiter()
742