mirror of
https://github.com/ACreTeam/ac-decomp
synced 2026-05-29 16:14:59 -04:00
84 lines
2.2 KiB
C
84 lines
2.2 KiB
C
#include "libforest/osreport.h"
|
|
#include "dolphin/os/OSInterrupt.h"
|
|
#include "dolphin/os/OSRtc.h"
|
|
|
|
#include "MSL_C/printf.h"
|
|
|
|
static BOOL __OSReport_disable;
|
|
static OSThread* __OSReport_MonopolyThread;
|
|
static u8 print_mutex_initialized;
|
|
static OSMutex print_mutex;
|
|
|
|
extern void OSReportDisable() {
|
|
__OSReport_disable = TRUE;
|
|
}
|
|
|
|
extern void OSReportEnable() {
|
|
__OSReport_disable = FALSE;
|
|
}
|
|
|
|
void OSVReport(const char* fmt, va_list list) {
|
|
OSThread* cur_thread;
|
|
u32 enable;
|
|
|
|
if (__OSReport_disable == FALSE) {
|
|
cur_thread = OSGetCurrentThread();
|
|
if ((cur_thread != NULL) && (cur_thread->state != (u32)OS_THREAD_STATE_RUNNING)) {
|
|
cur_thread = NULL;
|
|
}
|
|
if ((__OSReport_MonopolyThread == NULL) || (__OSReport_MonopolyThread == cur_thread)) {
|
|
enable = OSDisableInterrupts();
|
|
if (print_mutex_initialized == FALSE) {
|
|
OSInitMutex(&print_mutex);
|
|
print_mutex_initialized = TRUE;
|
|
printf("*** OSVReport - OSInitMutex ***");
|
|
}
|
|
OSRestoreInterrupts(enable);
|
|
if (cur_thread != NULL) {
|
|
OSLockMutex(&print_mutex);
|
|
}
|
|
vprintf(fmt, list);
|
|
if (cur_thread != NULL) {
|
|
OSUnlockMutex(&print_mutex);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
void OSReport(const char* fmt, ...) {
|
|
va_list arg;
|
|
va_start(arg, fmt);
|
|
OSVReport(fmt, arg);
|
|
va_end(arg);
|
|
}
|
|
|
|
void OSPanic(const char* file, int line, const char* fmt, ...) {
|
|
va_list list;
|
|
u32 enable;
|
|
OSThread* thread;
|
|
enable = OSDisableInterrupts();
|
|
|
|
|
|
va_start(list, fmt);
|
|
vprintf(fmt, list);
|
|
va_end(list);
|
|
printf(" in \"%s\" on line %d.\n", file, line);
|
|
|
|
thread = OSGetCurrentThread();
|
|
|
|
OSSetThreadPriority(thread, OS_PRIORITY_IDLE);
|
|
OSRestoreInterrupts(enable);
|
|
OSThrow(); /* Stop processor execution forcefully */
|
|
}
|
|
|
|
extern void OSChangeBootMode(u32 mode) {
|
|
__OSSetBootMode(mode ? OS_BOOT_MODE_RETAIL : OS_BOOT_MODE_DEBUG);
|
|
|
|
while(__OSSyncSram() == FALSE) { }
|
|
}
|
|
|
|
extern void OSDVDFatalError(void) {
|
|
OSReport("OSDVDFatalError called.\nExitThread.\n");
|
|
OSExitThread(NULL);
|
|
}
|