예제 #1
0
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));
}
예제 #2
0
파일: lwmutex.c 프로젝트: Kaegell/uofw
// 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;
}
예제 #3
0
파일: lwmutex.c 프로젝트: Kaegell/uofw
// 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;
}