static bool spinTryLockWithTimeout(OSSpinLock *spinlock, OSTime duration) { auto thread = OSGetCurrentThread(); auto owner = mem::untranslate(thread); if (spinlock->owner.load(std::memory_order_relaxed) == owner) { ++spinlock->recursion; return true; } uint32_t expected = 0; auto timeout = OSGetSystemTime() + duration; while (!spinlock->owner.compare_exchange_weak(expected, owner, std::memory_order_release, std::memory_order_relaxed)) { if (OSGetSystemTime() >= timeout) { return false; } expected = 0; } increaseSpinLockCount(thread); return true; }
void VsyncAlarmHandler(OSAlarm *alarm, OSContext *context) { gLastVsync = OSGetSystemTime(); OSWakeupThread(gVsyncThreadQueue); auto callback = gEventCallbacks[GX2EventCallback::Vsync]; if (callback.func) { callback.func(GX2EventCallback::Vsync, callback.data); } }
/** * Time since epoch */ OSTime OSGetTime() { return OSGetSystemTime() + sBaseTicks.count(); }
// Ticks since system start up OSTick OSGetSystemTick() { return OSGetSystemTime() & 0xFFFFFFFF; }
int main(int argc, char **argv) { #if 1 setup_os_exceptions(); #else InstallExceptionHandler(); #endif ProcUIInit(&SaveCallback); #ifdef IS_SALAMANDER socket_lib_init(); #else network_init(); #endif #if defined(PC_DEVELOPMENT_IP_ADDRESS) && defined(PC_DEVELOPMENT_TCP_PORT) log_init(PC_DEVELOPMENT_IP_ADDRESS, PC_DEVELOPMENT_TCP_PORT); devoptab_list[STD_OUT] = &dotab_stdout; devoptab_list[STD_ERR] = &dotab_stdout; #endif #ifndef IS_SALAMANDER VPADInit(); WPADEnableURCC(true); WPADEnableWiiRemote(true); KPADInit(); #endif verbosity_enable(); #ifndef IS_SALAMANDER ControllerPatcherInit(); #endif fflush(stdout); DEBUG_VAR(ARGV_PTR); if(ARGV_PTR && ((u32)ARGV_PTR < 0x01000000)) { struct { u32 magic; u32 argc; char * argv[3]; }*param = ARGV_PTR; if(param->magic == ARGV_MAGIC) { argc = param->argc; argv = param->argv; } ARGV_PTR = NULL; } DEBUG_VAR(argc); DEBUG_STR(argv[0]); DEBUG_STR(argv[1]); fflush(stdout); #ifdef IS_SALAMANDER int salamander_main(int, char **); salamander_main(argc, argv); #else #if 1 #if 0 int argc_ = 2; // char* argv_[] = {WIIU_SD_PATH "retroarch/retroarch.elf", WIIU_SD_PATH "rom.nes", NULL}; char *argv_[] = {WIIU_SD_PATH "retroarch/retroarch.elf", WIIU_SD_PATH "rom.sfc", NULL}; rarch_main(argc_, argv_, NULL); #else rarch_main(argc, argv, NULL); #endif do { unsigned sleep_ms = 0; if(video_driver_get_ptr(false)) { OSTime start_time = OSGetSystemTime(); task_queue_wait(swap_is_pending, &start_time); } else task_queue_wait(NULL, NULL); int ret = runloop_iterate(&sleep_ms); if (ret == 1 && sleep_ms > 0) retro_sleep(sleep_ms); if (ret == -1) break; } while (1); #ifndef IS_SALAMANDER ControllerPatcherDeInit(); #endif main_exit(NULL); #endif #endif fflush(stdout); fflush(stderr); ProcUIShutdown(); #if defined(PC_DEVELOPMENT_IP_ADDRESS) && defined(PC_DEVELOPMENT_TCP_PORT) log_deinit(); #endif /* returning non 0 here can prevent loading a different rpx/elf in the HBL environment */ return 0; }