Index: mojo/public/python/mojo/system_impl.pyx |
diff --git a/mojo/public/python/mojo/system_impl.pyx b/mojo/public/python/mojo/system_impl.pyx |
new file mode 100644 |
index 0000000000000000000000000000000000000000..6e79c51b0e7421cca16adb508914afbc579aba51 |
--- /dev/null |
+++ b/mojo/public/python/mojo/system_impl.pyx |
@@ -0,0 +1,75 @@ |
+# Copyright 2014 The Chromium Authors. All rights reserved. |
+# Use of this source code is governed by a BSD-style license that can be |
+# found in the LICENSE file. |
+ |
+# distutils language = c++ |
+ |
+cimport c_core |
+cimport c_environment |
+ |
+ |
+from libc.stdint cimport uintptr_t |
+ |
+def SetSystemThunks(system_thunks_as_object): |
+ """Bind the basic Mojo Core functions. |
+ """ |
+ cdef const c_core.MojoSystemThunks* system_thunks = ( |
+ <const c_core.MojoSystemThunks*><uintptr_t>system_thunks_as_object) |
+ c_core.MojoSetSystemThunks(system_thunks) |
+ |
+ |
+cdef class RunLoop(object): |
+ """RunLoop to use when using asynchronous operations on handles.""" |
+ |
+ cdef c_environment.CRunLoop* c_run_loop |
+ |
+ def __init__(self): |
+ assert not <uintptr_t>(c_environment.CRunLoopCurrent()) |
+ self.c_run_loop = new c_environment.CRunLoop() |
+ |
+ def __dealloc__(self): |
+ del self.c_run_loop |
+ |
+ def Run(self): |
+ """Run the runloop until Quit is called.""" |
+ self.c_run_loop.Run() |
+ |
+ def RunUntilIdle(self): |
+ """Run the runloop until Quit is called or no operation is waiting.""" |
+ self.c_run_loop.RunUntilIdle() |
+ |
+ def Quit(self): |
+ """Quit the runloop.""" |
+ self.c_run_loop.Quit() |
+ |
+ def PostDelayedTask(self, runnable, delay=0): |
+ """ |
+ Post a task on the runloop. This must be called from the thread owning the |
+ runloop. |
+ """ |
+ cdef c_environment.CClosure closure = c_environment.BuildClosure(runnable) |
+ self.c_run_loop.PostDelayedTask(closure, delay) |
+ |
+ |
+# We use a wrapping class to be able to call the C++ class PythonAsyncWaiter |
+# across module boundaries. |
+cdef class _AsyncWaiter(object): |
+ cdef c_environment.CEnvironment* _cenvironment |
+ cdef c_environment.PythonAsyncWaiter* _c_async_waiter |
+ |
+ def __init__(self): |
+ self._cenvironment = new c_environment.CEnvironment() |
+ self._c_async_waiter = new c_environment.PythonAsyncWaiter() |
+ |
+ def __dealloc__(self): |
+ del self._c_async_waiter |
+ del self._cenvironment |
+ |
+ def AsyncWait(self, handle, signals, deadline, callback): |
+ return self._c_async_waiter.AsyncWait(handle, signals, deadline, callback) |
+ |
+ def CancelWait(self, wait_id): |
+ self._c_async_waiter.CancelWait(wait_id) |
+ |
+ |
+ASYNC_WAITER = _AsyncWaiter() |