src/core/thread.h (view raw)
1/* Copyright (c) 2013-2016 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/. */
6#ifndef M_CORE_THREAD_H
7#define M_CORE_THREAD_H
8
9#include "util/common.h"
10
11#include "core/log.h"
12#include "core/sync.h"
13#include "util/threading.h"
14
15struct mCoreThread;
16struct mCore;
17
18typedef void (*ThreadCallback)(struct mCoreThread* threadContext);
19
20enum mCoreThreadState {
21 THREAD_INITIALIZED = -1,
22 THREAD_RUNNING = 0,
23 THREAD_INTERRUPTED,
24 THREAD_INTERRUPTING,
25 THREAD_PAUSED,
26 THREAD_PAUSING,
27 THREAD_RUN_ON,
28 THREAD_RESETING,
29 THREAD_EXITING,
30 THREAD_SHUTDOWN,
31 THREAD_CRASHED
32};
33
34struct mCoreThread;
35struct mThreadLogger {
36 struct mLogger d;
37 struct mCoreThread* p;
38};
39
40struct mCoreThread {
41 // Input
42 struct mCore* core;
43
44 // Threading state
45 Thread thread;
46 enum mCoreThreadState state;
47
48 Mutex stateMutex;
49 Condition stateCond;
50 enum mCoreThreadState savedState;
51 int interruptDepth;
52 bool frameWasOn;
53
54 struct mThreadLogger logger;
55 enum mLogLevel logLevel;
56 ThreadCallback startCallback;
57 ThreadCallback resetCallback;
58 ThreadCallback cleanCallback;
59 ThreadCallback frameCallback;
60 void* userData;
61 void (*run)(struct mCoreThread*);
62
63 struct mCoreSync sync;
64};
65
66bool mCoreThreadStart(struct mCoreThread* threadContext);
67bool mCoreThreadHasStarted(struct mCoreThread* threadContext);
68bool mCoreThreadHasExited(struct mCoreThread* threadContext);
69bool mCoreThreadHasCrashed(struct mCoreThread* threadContext);
70void mCoreThreadEnd(struct mCoreThread* threadContext);
71void mCoreThreadReset(struct mCoreThread* threadContext);
72void mCoreThreadJoin(struct mCoreThread* threadContext);
73
74bool mCoreThreadIsActive(struct mCoreThread* threadContext);
75void mCoreThreadInterrupt(struct mCoreThread* threadContext);
76void mCoreThreadInterruptFromThread(struct mCoreThread* threadContext);
77void mCoreThreadContinue(struct mCoreThread* threadContext);
78
79void mCoreThreadRunFunction(struct mCoreThread* threadContext, void (*run)(struct mCoreThread*));
80
81void mCoreThreadPause(struct mCoreThread* threadContext);
82void mCoreThreadUnpause(struct mCoreThread* threadContext);
83bool mCoreThreadIsPaused(struct mCoreThread* threadContext);
84void mCoreThreadTogglePause(struct mCoreThread* threadContext);
85void mCoreThreadPauseFromThread(struct mCoreThread* threadContext);
86
87struct mCoreThread* mCoreThreadGet(void);
88struct mLogger* mCoreThreadLogger(void);
89
90#endif