1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
|
#include "JSystem/JSystem.h" // IWYU pragma: keep
#include "JSystem/JAudio2/JASTaskThread.h"
#include "JSystem/JAudio2/JASCalc.h"
#include "JSystem/JAudio2/JASCriticalSection.h"
#include "JSystem/JKernel/JKRSolidHeap.h"
JASTaskThread::JASTaskThread(int priority, int msgCount, u32 stackSize) :
JKRThread(JASDram, stackSize, msgCount, priority)
{
field_0x84 = false;
OSInitThreadQueue(&threadQueue_);
}
JASTaskThread::~JASTaskThread() {
OSMessage msg;
BOOL received;
while (true) {
msg = waitMessage(&received);
if (!received) {
return;
}
JASKernel::getCommandHeap()->free(msg);
}
}
void* JASTaskThread::allocCallStack(JASThreadCallback callback, const void* msg, u32 msgSize) {
ThreadMemPool* heap;
u32 size = msgSize + offsetof(JASThreadCallStack, msg);
JASThreadCallStack *callStack = (JASThreadCallStack*) JASKernel::getCommandHeap()->alloc(size);
if (callStack == NULL) {
return NULL;
}
callStack->msgType_ = 1;
JASCalc::bcopy(msg, callStack->msg.buffer, msgSize);
callStack->callback_ = callback;
return callStack;
}
void* JASTaskThread::allocCallStack(JASThreadCallback callback, void* msg) {
JASThreadCallStack *callStack;
callStack = (JASThreadCallStack*)JASKernel::getCommandHeap()->alloc(offsetof(JASThreadCallStack, msg) + sizeof(void*));
if (callStack == NULL) {
return NULL;
}
callStack->msgType_ = 0;
callStack->msg.bufferPtr = msg;
callStack->callback_ = callback;
return callStack;
}
int JASTaskThread::sendCmdMsg(JASThreadCallback callback, const void* msg, u32 msgSize) {
void* callstack;
callstack = allocCallStack(callback, msg, msgSize);
if (callstack == NULL) {
return 0;
}
BOOL iVar2 = sendMessage(callstack);
if (!iVar2) {
JASKernel::getCommandHeap()->free(callstack);
}
return iVar2;
}
int JASTaskThread::sendCmdMsg(JASThreadCallback callback, void* msg) {
void* callstack;
callstack = allocCallStack(callback, msg);
if (callstack == NULL) {
return 0;
}
BOOL iVar2 = sendMessage(callstack);
if (!iVar2) {
JASKernel::getCommandHeap()->free(callstack);
}
return iVar2;
}
void* JASTaskThread::run() {
JASThreadCallStack* callstack;
OSInitFastCast();
do {
callstack = static_cast<JASThreadCallStack*>(waitMessageBlock());
if (field_0x84) {
OSSleepThread(&threadQueue_);
}
if (callstack->msgType_) {
callstack->callback_(callstack->msg.buffer);
} else {
callstack->callback_(callstack->msg.bufferPtr);
}
JASKernel::getCommandHeap()->free(callstack);
} while (true);
}
void JASTaskThread::pause(bool param_0) {
JASCriticalSection aJStack_14;
if (param_0) {
field_0x84 = 1;
} else {
if (field_0x84) {
OSWakeupThread(&threadQueue_);
}
field_0x84 = 0;
}
}
|