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
7from .core import IRunner, ICoreOwner, Core
8
9class ThreadCoreOwner(ICoreOwner):
10 def __init__(self, thread):
11 self.thread = thread
12
13 def claim(self):
14 if not self.thread.isRunning():
15 raise ValueError
16 lib.mCoreThreadInterrupt(self.thread._native)
17 return self.thread._core
18
19 def release(self):
20 lib.mCoreThreadContinue(self.thread._native)
21
22class Thread(IRunner):
23 def __init__(self, native=None):
24 if native:
25 self._native = native
26 self._core = Core(native.core)
27 self._core._wasReset = lib.mCoreThreadHasStarted(self._native)
28 else:
29 self._native = ffi.new("struct mCoreThread*")
30
31 def start(self, core):
32 if lib.mCoreThreadHasStarted(self._native):
33 raise ValueError
34 self._core = core
35 self._native.core = core._core
36 lib.mCoreThreadStart(self._native)
37 self._core._wasReset = lib.mCoreThreadHasStarted(self._native)
38
39 def end(self):
40 if not lib.mCoreThreadHasStarted(self._native):
41 raise ValueError
42 lib.mCoreThreadEnd(self._native)
43 lib.mCoreThreadJoin(self._native)
44
45 def pause(self):
46 lib.mCoreThreadPause(self._native)
47
48 def unpause(self):
49 lib.mCoreThreadUnpause(self._native)
50
51 def isRunning(self):
52 return bool(lib.mCoreThreadIsActive(self._native))
53
54 def isPaused(self):
55 return bool(lib.mCoreThreadIsPaused(self._native))
56
57 def useCore(self):
58 return ThreadCoreOwner(self)