OLD | NEW |
---|---|
1 # Copyright 2014 The Chromium Authors. All rights reserved. | 1 # Copyright 2014 The Chromium Authors. All rights reserved. |
2 # Use of this source code is governed by a BSD-style license that can be | 2 # Use of this source code is governed by a BSD-style license that can be |
3 # found in the LICENSE file. | 3 # found in the LICENSE file. |
4 | 4 |
5 # distutils language = c++ | 5 # distutils language = c++ |
6 | 6 |
7 cimport c_core | 7 cimport c_core |
8 cimport c_environment | 8 cimport c_environment |
9 | 9 |
10 | 10 |
11 from cpython.buffer cimport PyBUF_CONTIG | 11 from cpython.buffer cimport PyBUF_CONTIG |
12 from cpython.buffer cimport PyBUF_CONTIG_RO | 12 from cpython.buffer cimport PyBUF_CONTIG_RO |
13 from cpython.buffer cimport Py_buffer | 13 from cpython.buffer cimport Py_buffer |
14 from cpython.buffer cimport PyBuffer_FillInfo | 14 from cpython.buffer cimport PyBuffer_FillInfo |
15 from cpython.buffer cimport PyBuffer_Release | 15 from cpython.buffer cimport PyBuffer_Release |
16 from cpython.buffer cimport PyObject_GetBuffer | 16 from cpython.buffer cimport PyObject_GetBuffer |
17 from cpython.mem cimport PyMem_Malloc, PyMem_Free | 17 from cpython.mem cimport PyMem_Malloc, PyMem_Free |
18 from libc.stdint cimport int32_t, int64_t, uint32_t, uint64_t, uintptr_t | 18 from libc.stdint cimport int32_t, int64_t, uint32_t, uint64_t, uintptr_t |
19 | 19 |
20 import ctypes | |
21 import threading | |
22 | |
20 def SetSystemThunks(system_thunks_as_object): | 23 def SetSystemThunks(system_thunks_as_object): |
21 """Bind the basic Mojo Core functions. | 24 """Bind the basic Mojo Core functions. |
22 | 25 |
23 This should only be used by the embedder. | 26 This should only be used by the embedder. |
24 """ | 27 """ |
25 cdef const c_core.MojoSystemThunks* system_thunks = ( | 28 cdef const c_core.MojoSystemThunks* system_thunks = ( |
26 <const c_core.MojoSystemThunks*><uintptr_t>system_thunks_as_object) | 29 <const c_core.MojoSystemThunks*><uintptr_t>system_thunks_as_object) |
27 c_core.MojoSetSystemThunks(system_thunks) | 30 c_core.MojoSetSystemThunks(system_thunks) |
28 | 31 |
29 HANDLE_INVALID = c_core.MOJO_HANDLE_INVALID | 32 HANDLE_INVALID = c_core.MOJO_HANDLE_INVALID |
(...skipping 674 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
704 """Options for duplicating a shared buffer. | 707 """Options for duplicating a shared buffer. |
705 | 708 |
706 See mojo/public/c/system/buffer.h | 709 See mojo/public/c/system/buffer.h |
707 """ | 710 """ |
708 FLAG_NONE = c_core.MOJO_DUPLICATE_BUFFER_HANDLE_OPTIONS_FLAG_NONE | 711 FLAG_NONE = c_core.MOJO_DUPLICATE_BUFFER_HANDLE_OPTIONS_FLAG_NONE |
709 | 712 |
710 def __init__(self): | 713 def __init__(self): |
711 self.flags = DuplicateSharedBufferOptions.FLAG_NONE | 714 self.flags = DuplicateSharedBufferOptions.FLAG_NONE |
712 | 715 |
713 | 716 |
717 _RUN_LOOPS = threading.local() | |
sdefresne
2014/10/10 12:29:44
IIUC, _RUN_LOOPS is used to keep a weak-ref to the
qsr
2014/10/10 12:34:07
Done.
| |
718 | |
719 | |
714 cdef class RunLoop(object): | 720 cdef class RunLoop(object): |
715 """RunLoop to use when using asynchronous operations on handles.""" | 721 """RunLoop to use when using asynchronous operations on handles.""" |
716 | 722 |
717 cdef c_environment.CRunLoop c_run_loop | 723 cdef c_environment.CRunLoop* c_run_loop |
724 | |
725 def __init__(self): | |
726 assert not <uintptr_t>(c_environment.CRunLoopCurrent()) | |
727 self.c_run_loop = new c_environment.CRunLoop() | |
728 _RUN_LOOPS.loop = id(self) | |
729 | |
730 def __dealloc__(self): | |
731 del _RUN_LOOPS.loop | |
732 del self.c_run_loop | |
733 | |
734 @staticmethod | |
735 def Current(): | |
736 if hasattr(_RUN_LOOPS, 'loop'): | |
737 return ctypes.cast(_RUN_LOOPS.loop, ctypes.py_object).value | |
738 return None | |
718 | 739 |
719 def Run(self): | 740 def Run(self): |
720 """Run the runloop until Quit is called.""" | 741 """Run the runloop until Quit is called.""" |
721 self.c_run_loop.Run() | 742 self.c_run_loop.Run() |
722 | 743 |
723 def RunUntilIdle(self): | 744 def RunUntilIdle(self): |
724 """Run the runloop until Quit is called or no operation is waiting.""" | 745 """Run the runloop until Quit is called or no operation is waiting.""" |
725 self.c_run_loop.RunUntilIdle() | 746 self.c_run_loop.RunUntilIdle() |
726 | 747 |
727 def Quit(self): | 748 def Quit(self): |
728 """Quit the runloop.""" | 749 """Quit the runloop.""" |
729 self.c_run_loop.Quit() | 750 self.c_run_loop.Quit() |
730 | 751 |
731 def PostDelayedTask(self, runnable, delay=0): | 752 def PostDelayedTask(self, runnable, delay=0): |
732 """ | 753 """ |
733 Post a task on the runloop. This must be called from the thread owning the | 754 Post a task on the runloop. This must be called from the thread owning the |
734 runloop. | 755 runloop. |
735 """ | 756 """ |
736 cdef c_environment.CClosure closure = c_environment.BuildClosure(runnable) | 757 cdef c_environment.CClosure closure = c_environment.BuildClosure(runnable) |
737 self.c_run_loop.PostDelayedTask(closure, delay) | 758 self.c_run_loop.PostDelayedTask(closure, delay) |
738 | 759 |
739 | 760 |
740 cdef c_environment.CEnvironment* _ENVIRONMENT = new c_environment.CEnvironment() | 761 cdef c_environment.CEnvironment* _ENVIRONMENT = new c_environment.CEnvironment() |
741 cdef c_environment.PythonAsyncWaiter* _ASYNC_WAITER = new c_environment.PythonAs yncWaiter() | 762 cdef c_environment.PythonAsyncWaiter* _ASYNC_WAITER = new c_environment.PythonAs yncWaiter() |
OLD | NEW |