void checkLwMutex(int doDispatch) { SceLwMutexWorkarea workarea; dispatchCheckpoint("sceKernelCreateLwMutex: %08x", sceKernelCreateLwMutex(&workarea, "lwmutex", 0, 1, NULL)); dispatchCheckpoint("sceKernelUnlockLwMutex: %08x", sceKernelUnlockLwMutex(&workarea, 1)); dispatchCheckpoint("sceKernelLockLwMutex: %08x", sceKernelLockLwMutex(&workarea, 1, NULL)); dispatchCheckpoint("sceKernelLockLwMutex invalid: %08x", sceKernelLockLwMutex(&workarea, -1, NULL)); dispatchCheckpoint("sceKernelDeleteLwMutex: %08x", sceKernelDeleteLwMutex(&workarea)); dispatchCheckpoint("sceKernelCreateLwMutex: %08x", sceKernelCreateLwMutex(&workarea, "lwmutex", 0, 1, NULL)); startLockThreadLwMutex(&workarea); int state; if (doDispatch) { ++ignoreResched; state = sceKernelSuspendDispatchThread(); dispatchCheckpoint("sceKernelSuspendDispatchThread: %08x", state); } SceUInt timeout = 300; dispatchCheckpoint("sceKernelLockLwMutex: %08x", sceKernelLockLwMutex(&workarea, 1, &timeout)); dispatchCheckpoint("sceKernelUnlockLwMutex: %08x", sceKernelUnlockLwMutex(&workarea, 1)); if (doDispatch) { dispatchCheckpoint("sceKernelResumeDispatchThread: %08x", sceKernelResumeDispatchThread(state)); --ignoreResched; } endLockThreadLwMutex(&workarea); dispatchCheckpoint("sceKernelTryLockLwMutex: %08x", sceKernelTryLockLwMutex_600(&workarea, 1)); dispatchCheckpoint("sceKernelDeleteLwMutex: %08x", sceKernelDeleteLwMutex(&workarea)); }
// Kernel_Library_DC692EE3 s32 sceKernelTryLockLwMutex(SceLwMutex *mutex, s32 count) { // Kernel_Library_37431849 if (sceKernelTryLockLwMutex_600(mutex, count) != SCE_ERROR_OK) { // 0x800201C4 return SCE_ERROR_KERNEL_MUTEX_LOCKED; } return SCE_ERROR_OK; }
// Kernel_Library_1FC64E09 s32 sceKernelLockLwMutexCB(SceLwMutex *mutex, s32 count) { s32 ret; if (g_thread == NULL) { // 0x80020064 return SCE_ERROR_KERNEL_CANNOT_BE_CALLED_FROM_INTERRUPT; } if (!sceKernelIsCpuIntrEnable() || g_thread->unk2 != 0) { // 0x800201A7 return SCE_ERROR_KERNEL_WAIT_CAN_NOT_WAIT; } ret = sceKernelTryLockLwMutex_600(mutex, count); /* mutex already locked, block until it is available */ if ((u32)ret == SCE_ERROR_KERNEL_LWMUTEX_LOCKED) { // ThreadManForUser_31327F19 return _sceKernelLockLwMutexCB(mutex, count); } return ret; }