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