all repos — mgba @ d571d8921fed313733803973629780633e3d5774

mGBA Game Boy Advance Emulator

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)