mirror of
https://github.com/wheremyfoodat/Panda3DS.git
synced 2025-04-12 09:09:47 +12:00
[Kernel] Fix release mutex
This commit is contained in:
parent
134d63c515
commit
7f2715d06c
3 changed files with 29 additions and 7 deletions
|
@ -73,6 +73,7 @@ private:
|
||||||
void rescheduleThreads();
|
void rescheduleThreads();
|
||||||
bool canThreadRun(const Thread& t);
|
bool canThreadRun(const Thread& t);
|
||||||
bool shouldWaitOnObject(KernelObject* object);
|
bool shouldWaitOnObject(KernelObject* object);
|
||||||
|
void releaseMutex(Mutex* moo);
|
||||||
|
|
||||||
std::optional<Handle> getPortHandle(const char* name);
|
std::optional<Handle> getPortHandle(const char* name);
|
||||||
void deleteObjectData(KernelObject& object);
|
void deleteObjectData(KernelObject& object);
|
||||||
|
@ -106,7 +107,6 @@ private:
|
||||||
void createAddressArbiter();
|
void createAddressArbiter();
|
||||||
void createEvent();
|
void createEvent();
|
||||||
void createMemoryBlock();
|
void createMemoryBlock();
|
||||||
void createMutex();
|
|
||||||
void createThread();
|
void createThread();
|
||||||
void controlMemory();
|
void controlMemory();
|
||||||
void duplicateHandle();
|
void duplicateHandle();
|
||||||
|
@ -121,11 +121,12 @@ private:
|
||||||
void getSystemTick();
|
void getSystemTick();
|
||||||
void getThreadID();
|
void getThreadID();
|
||||||
void getThreadPriority();
|
void getThreadPriority();
|
||||||
void releaseMutex();
|
|
||||||
void sendSyncRequest();
|
void sendSyncRequest();
|
||||||
void setThreadPriority();
|
void setThreadPriority();
|
||||||
void signalEvent();
|
void signalEvent();
|
||||||
void svcCloseHandle();
|
void svcCloseHandle();
|
||||||
|
void svcCreateMutex();
|
||||||
|
void svcReleaseMutex();
|
||||||
void svcSleepThread();
|
void svcSleepThread();
|
||||||
void connectToPort();
|
void connectToPort();
|
||||||
void outputDebugString();
|
void outputDebugString();
|
||||||
|
|
|
@ -33,8 +33,8 @@ void Kernel::serviceSVC(u32 svc) {
|
||||||
case 0x0A: svcSleepThread(); break;
|
case 0x0A: svcSleepThread(); break;
|
||||||
case 0x0B: getThreadPriority(); break;
|
case 0x0B: getThreadPriority(); break;
|
||||||
case 0x0C: setThreadPriority(); break;
|
case 0x0C: setThreadPriority(); break;
|
||||||
case 0x13: createMutex(); break;
|
case 0x13: svcCreateMutex(); break;
|
||||||
case 0x14: releaseMutex(); break;
|
case 0x14: svcReleaseMutex(); break;
|
||||||
case 0x17: createEvent(); break;
|
case 0x17: createEvent(); break;
|
||||||
case 0x18: signalEvent(); break;
|
case 0x18: signalEvent(); break;
|
||||||
case 0x19: clearEvent(); break;
|
case 0x19: clearEvent(); break;
|
||||||
|
|
|
@ -171,6 +171,13 @@ Handle Kernel::makeMutex(bool locked) {
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Kernel::releaseMutex(Mutex* moo) {
|
||||||
|
moo->locked = false;
|
||||||
|
if (moo->waitlist != 0) {
|
||||||
|
Helpers::panic("Mutex got freed while it's got more threads waiting for it. Must make a new thread claim it.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
Handle Kernel::makeSemaphore(u32 initialCount, u32 maximumCount) {
|
Handle Kernel::makeSemaphore(u32 initialCount, u32 maximumCount) {
|
||||||
Handle ret = makeObject(KernelObjectType::Semaphore);
|
Handle ret = makeObject(KernelObjectType::Semaphore);
|
||||||
objects[ret].data = new Semaphore(initialCount, maximumCount);
|
objects[ret].data = new Semaphore(initialCount, maximumCount);
|
||||||
|
@ -335,7 +342,7 @@ void Kernel::exitThread() {
|
||||||
switchToNextThread();
|
switchToNextThread();
|
||||||
}
|
}
|
||||||
|
|
||||||
void Kernel::createMutex() {
|
void Kernel::svcCreateMutex() {
|
||||||
bool locked = regs[1] != 0;
|
bool locked = regs[1] != 0;
|
||||||
logSVC("CreateMutex (locked = %s)\n", locked ? "yes" : "no");
|
logSVC("CreateMutex (locked = %s)\n", locked ? "yes" : "no");
|
||||||
|
|
||||||
|
@ -343,10 +350,24 @@ void Kernel::createMutex() {
|
||||||
regs[1] = makeMutex(locked);
|
regs[1] = makeMutex(locked);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Kernel::releaseMutex() {
|
void Kernel::svcReleaseMutex() {
|
||||||
const Handle handle = regs[0];
|
const Handle handle = regs[0];
|
||||||
|
|
||||||
logSVC("ReleaseMutex (handle = %x) (STUBBED)\n", handle);
|
logSVC("ReleaseMutex (handle = %x) (STUBBED)\n", handle);
|
||||||
|
|
||||||
|
const auto object = getObject(handle, KernelObjectType::Mutex);
|
||||||
|
if (object == nullptr) [[unlikely]] {
|
||||||
|
Helpers::panic("Tried to release non-existent mutex");
|
||||||
|
regs[0] = SVCResult::BadHandle;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
Mutex* moo = object->getData<Mutex>();
|
||||||
|
// A thread can't release a mutex it does not own
|
||||||
|
if (!moo->locked || moo->ownerThread != currentThreadIndex) {
|
||||||
|
Helpers::panic("[ReleaseMutex] Tried to release mutex that does not belong to thread");
|
||||||
|
}
|
||||||
|
|
||||||
|
releaseMutex(moo);
|
||||||
regs[0] = SVCResult::Success;
|
regs[0] = SVCResult::Success;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue