all repos — mgba @ 6d4d014cfddedde7a46c3ced171669594b911a7b

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
 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)