src/gba/gba-thread.h (view raw)
1#ifndef GBA_THREAD_H
2#define GBA_THREAD_H
3
4#include "common.h"
5
6#include "gba.h"
7
8#include "util/threading.h"
9
10struct GBAThread;
11typedef void (*ThreadCallback)(struct GBAThread* threadContext);
12
13enum ThreadState {
14 THREAD_INITIALIZED = -1,
15 THREAD_RUNNING = 0,
16 THREAD_INTERRUPTED = 1,
17 THREAD_PAUSED = 2,
18 THREAD_EXITING = 3,
19 THREAD_SHUTDOWN = 4
20};
21
22struct GBASync {
23 int videoFramePending;
24 int videoFrameWait;
25 int videoFrameSkip;
26 int videoFrameOn;
27 Mutex videoFrameMutex;
28 Condition videoFrameAvailableCond;
29 Condition videoFrameRequiredCond;
30
31 int audioWait;
32 Condition audioRequiredCond;
33 Mutex audioBufferMutex;
34};
35
36struct GBAThread {
37 // Output
38 enum ThreadState state;
39 struct GBA* gba;
40
41 // Input
42 struct GBAVideoRenderer* renderer;
43 struct GBASIODriverSet sioDrivers;
44 struct ARMDebugger* debugger;
45 int fd;
46 int biosFd;
47 const char* fname;
48 int activeKeys;
49 int frameskip;
50
51 // Threading state
52 Thread thread;
53
54 Mutex stateMutex;
55 Condition stateCond;
56 enum ThreadState savedState;
57
58 GBALogHandler logHandler;
59 ThreadCallback startCallback;
60 ThreadCallback cleanCallback;
61 ThreadCallback frameCallback;
62 void* userData;
63
64 struct GBASync sync;
65
66 int rewindBufferSize;
67 int rewindBufferCapacity;
68 int rewindBufferInterval;
69 int rewindBufferNext;
70 struct GBASerializedState** rewindBuffer;
71 int rewindBufferWriteOffset;
72};
73
74int GBAThreadStart(struct GBAThread* threadContext);
75int GBAThreadHasStarted(struct GBAThread* threadContext);
76void GBAThreadEnd(struct GBAThread* threadContext);
77void GBAThreadJoin(struct GBAThread* threadContext);
78
79void GBAThreadInterrupt(struct GBAThread* threadContext);
80void GBAThreadContinue(struct GBAThread* threadContext);
81
82void GBAThreadPause(struct GBAThread* threadContext);
83void GBAThreadUnpause(struct GBAThread* threadContext);
84int GBAThreadIsPaused(struct GBAThread* threadContext);
85void GBAThreadTogglePause(struct GBAThread* threadContext);
86struct GBAThread* GBAThreadGetContext(void);
87
88void GBASyncPostFrame(struct GBASync* sync);
89int GBASyncWaitFrameStart(struct GBASync* sync, int frameskip);
90void GBASyncWaitFrameEnd(struct GBASync* sync);
91int GBASyncDrawingFrame(struct GBASync* sync);
92
93void GBASyncProduceAudio(struct GBASync* sync, int wait);
94void GBASyncLockAudio(struct GBASync* sync);
95void GBASyncConsumeAudio(struct GBASync* sync);
96
97#endif