src/platform/python/mgba/thread.py (view raw)
1# Copyright (c) 2013-2017 Jeffrey Pfau
2#
3# This Source Code Form is subject to the terms of the Mozilla Public
4# License, v. 2.0. If a copy of the MPL was not distributed with this
5# file, You can obtain one at http://mozilla.org/MPL/2.0/.
6from ._pylib import ffi, lib # pylint: disable=no-name-in-module
7from .core import IRunner, ICoreOwner, Core
8
9
10class ThreadCoreOwner(ICoreOwner):
11 def __init__(self, thread):
12 self.thread = thread
13
14 def claim(self):
15 if not self.thread.isRunning():
16 raise ValueError
17 lib.mCoreThreadInterrupt(self.thread._native)
18 return self.thread._core
19
20 def release(self):
21 lib.mCoreThreadContinue(self.thread._native)
22
23
24class Thread(IRunner):
25 def __init__(self, native=None):
26 if native:
27 self._native = native
28 self._core = Core(native.core)
29 self._core._was_reset = lib.mCoreThreadHasStarted(self._native)
30 else:
31 self._native = ffi.new("struct mCoreThread*")
32
33 def start(self, core):
34 if lib.mCoreThreadHasStarted(self._native):
35 raise ValueError
36 self._core = core
37 self._native.core = core._core
38 lib.mCoreThreadStart(self._native)
39 self._core._was_reset = lib.mCoreThreadHasStarted(self._native)
40
41 def end(self):
42 if not lib.mCoreThreadHasStarted(self._native):
43 raise ValueError
44 lib.mCoreThreadEnd(self._native)
45 lib.mCoreThreadJoin(self._native)
46
47 def pause(self):
48 lib.mCoreThreadPause(self._native)
49
50 def unpause(self):
51 lib.mCoreThreadUnpause(self._native)
52
53 @property
54 def running(self):
55 return bool(lib.mCoreThreadIsActive(self._native))
56
57 @property
58 def paused(self):
59 return bool(lib.mCoreThreadIsPaused(self._native))
60
61 def use_core(self):
62 return ThreadCoreOwner(self)