Index: mojo/public/python/mojo/system.pyx |
diff --git a/mojo/public/python/mojo/system.pyx b/mojo/public/python/mojo/system.pyx |
index 35b8093fd8ae402a09909dd74c1c68f2cbc68ad0..2533babe672c4b56d45ddc8b2280e4eb5b89c04c 100644 |
--- a/mojo/public/python/mojo/system.pyx |
+++ b/mojo/public/python/mojo/system.pyx |
@@ -5,6 +5,8 @@ |
# distutils language = c++ |
cimport c_core |
+cimport c_export # needed so the init function gets exported |
+cimport c_thunks |
from cpython.buffer cimport PyBUF_CONTIG |
@@ -27,10 +29,9 @@ def SetSystemThunks(system_thunks_as_object): |
This should only be used by the embedder. |
""" |
- cdef const c_core.MojoSystemThunks* system_thunks = ( |
- <const c_core.MojoSystemThunks*><uintptr_t>system_thunks_as_object) |
- c_core.MojoSetSystemThunks(system_thunks) |
- mojo.system_impl.SetSystemThunks(system_thunks_as_object) |
+ cdef const c_thunks.MojoSystemThunks* system_thunks = ( |
+ <const c_thunks.MojoSystemThunks*><uintptr_t>system_thunks_as_object) |
+ c_thunks.MojoSetSystemThunks(system_thunks) |
HANDLE_INVALID = c_core.MOJO_HANDLE_INVALID |
RESULT_OK = c_core.MOJO_RESULT_OK |
@@ -68,6 +69,9 @@ READ_DATA_FLAG_QUERY = c_core.MOJO_READ_DATA_FLAG_QUERY |
READ_DATA_FLAG_PEEK = c_core.MOJO_READ_DATA_FLAG_PEEK |
MAP_BUFFER_FLAG_NONE = c_core.MOJO_MAP_BUFFER_FLAG_NONE |
+_WAITMANY_NO_SIGNAL_STATE_ERRORS = [RESULT_INVALID_ARGUMENT, |
+ RESULT_RESOURCE_EXHAUSTED] |
+ |
def GetTimeTicksNow(): |
"""Monotonically increasing tick count representing "right now." |
@@ -202,13 +206,19 @@ def WaitMany(handles_and_signals, deadline): |
See mojo/public/c/system/functions.h |
""" |
cdef uint32_t length = len(handles_and_signals) |
+ cdef uint32_t result_index = <uint32_t>(-1) |
+ |
cdef _ScopedMemory handles_alloc = _ScopedMemory( |
sizeof(c_core.MojoHandle) * length) |
cdef _ScopedMemory signals_alloc = _ScopedMemory( |
sizeof(c_core.MojoHandleSignals) * length) |
+ cdef _ScopedMemory states_alloc = _ScopedMemory( |
+ sizeof(c_core.MojoHandleSignalsState) * length) |
cdef c_core.MojoHandle* handles = <c_core.MojoHandle*>handles_alloc.memory |
cdef c_core.MojoHandleSignals* signals = ( |
<c_core.MojoHandleSignals*>signals_alloc.memory) |
+ cdef c_core.MojoHandleSignalsState* states = ( |
+ <c_core.MojoHandleSignalsState*>states_alloc.memory) |
cdef int index = 0 |
for (h, s) in handles_and_signals: |
handles[index] = (<Handle?>h)._mojo_handle |
@@ -217,8 +227,20 @@ def WaitMany(handles_and_signals, deadline): |
cdef c_core.MojoResult result = c_core.MOJO_RESULT_OK |
cdef c_core.MojoDeadline cdeadline = deadline |
with nogil: |
- result = c_core.MojoWaitMany(handles, signals, length, cdeadline) |
- return result |
+ result = c_core.MojoWaitMany(handles, signals, length, cdeadline, |
+ &result_index, states) |
+ |
+ returned_result_index = None |
+ if result_index != <uint32_t>(-1): |
+ returned_result_index = result_index |
+ |
+ returned_states = None |
+ if result not in _WAITMANY_NO_SIGNAL_STATE_ERRORS: |
+ returned_states = [(states[i].satisfied_signals, |
+ states[i].satisfiable_signals) for i in xrange(length)] |
+ |
+ return (result, returned_result_index, returned_states) |
+ |
cdef class DataPipeTwoPhaseBuffer(object): |
"""Return value for two phases read and write. |
@@ -340,10 +362,17 @@ cdef class Handle(object): |
cdef c_core.MojoHandle handle = self._mojo_handle |
cdef c_core.MojoHandleSignals csignals = signals |
cdef c_core.MojoDeadline cdeadline = deadline |
+ cdef c_core.MojoHandleSignalsState signal_states |
cdef c_core.MojoResult result |
with nogil: |
- result = c_core.MojoWait(handle, csignals, cdeadline) |
- return result |
+ result = c_core.MojoWait(handle, csignals, cdeadline, &signal_states) |
+ |
+ returned_states = None |
+ if result not in _WAITMANY_NO_SIGNAL_STATE_ERRORS: |
+ returned_states = (signal_states.satisfied_signals, |
+ signal_states.satisfiable_signals) |
+ |
+ return (result, returned_states) |
def AsyncWait(self, signals, deadline, callback): |
cdef c_core.MojoHandle handle = self._mojo_handle |
@@ -772,4 +801,4 @@ class RunLoop(object): |
return None |
-_ASYNC_WAITER = mojo.system_impl.ASYNC_WAITER |
+_ASYNC_WAITER = mojo.system_impl.AsyncWaiter() |