void printSceKernelEventFlagInfo(int evid) { SceKernelEventFlagInfo info; info.size = sizeof(SceKernelEventFlagInfo); memset(&info, 0xFF, sizeof(SceKernelEventFlagInfo)); int result = sceKernelReferEventFlagStatus(evid, &info); printf("\nsceKernelReferEventFlagStatus result %08x\n", result); if (info.attr != PSP_EVENT_WAITMULTIPLE || info.initPattern != INITIAL_PATTERN) printf("attr %08x initPattern %08x\n", info.attr, info.initPattern); printf("pattern %08x wait# %d/%08x\n\n", info.currentPattern, info.numWaitThreads, info.numWaitThreads); }
int main(int argc, char **argv) { SceUID flag = sceKernelCreateEventFlag("refer1", 0, 0, NULL); SceKernelEventFlagInfo flaginfo; // Crashes. //REFER_TEST("NULL info", flag, NULL); REFER_TEST("Normal", flag, &flaginfo); sceKernelDeleteEventFlag(flag); REFER_TEST("NULL", 0, &flaginfo); REFER_TEST("Invalid", 0xDEADBEEF, &flaginfo); REFER_TEST("Deleted", flag, &flaginfo); BASIC_SCHED_TEST("NULL", result = sceKernelReferEventFlagStatus(NULL, &flaginfo); );
int main(int argc, char **argv) { SceUID flag = sceKernelCreateEventFlag("wait1", 0, 0xFFFFFFFF, NULL); SceKernelEventFlagInfo flaginfo; // Something weird is happening: first time status is garbled? sceKernelReferEventFlagStatus(flag, &flaginfo); WAIT_TEST_SIMPLE("And 0x00000000", flag, 0, PSP_EVENT_WAITAND, 1); WAIT_TEST_SIMPLE("Or 0x00000000", flag, 0, PSP_EVENT_WAITOR, 1); WAIT_TEST_SIMPLE("Clear 0x00000000", flag, 0, PSP_EVENT_WAITCLEAR, 1); WAIT_TEST_SIMPLE("Wrong (0x04) 0x00000000", flag, 0, 0x04, 1); WAIT_TEST_SIMPLE("Wrong (0xFF) 0x00000000", flag, 0, 0xFF, 1); WAIT_TEST_SIMPLE("And 0x00000001", flag, 1, PSP_EVENT_WAITAND, 1); WAIT_TEST_SIMPLE("Or 0x00000001", flag, 1, PSP_EVENT_WAITOR, 1); WAIT_TEST_SIMPLE("Clear 0x00000001", flag, 1, PSP_EVENT_WAITCLEAR, 1); WAIT_TEST_SIMPLE("Wrong (0x02) 0x00000001", flag, 1, 0x02, 1); WAIT_TEST_SIMPLE("Wrong (0x04) 0x00000001", flag, 1, 0x04, 1); WAIT_TEST_SIMPLE("Wrong (0x08) 0x00000001", flag, 1, 0x08, 1); WAIT_TEST_SIMPLE("Wrong (0x40) 0x00000001", flag, 1, 0x40, 1); WAIT_TEST_SIMPLE("Wrong (0x80) 0x00000001", flag, 1, 0x80, 1); WAIT_TEST_SIMPLE("Wrong (0xFF) 0x00000001", flag, 1, 0xFF, 1); sceKernelSetEventFlag(flag, 0xFFFFFFFF); WAIT_TEST_SIMPLE("Clear/Or 0x00000000", flag, 0, PSP_EVENT_WAITCLEAR | PSP_EVENT_WAITOR, 1); sceKernelSetEventFlag(flag, 0xFFFFFFFF); WAIT_TEST_SIMPLE("Clear/Or 0x00000001", flag, 1, PSP_EVENT_WAITCLEAR | PSP_EVENT_WAITOR, 1); sceKernelSetEventFlag(flag, 0xFFFFFFFF); WAIT_TEST_SIMPLE("Clear/Or 0x00000001 (no out bits)", flag, 1, PSP_EVENT_WAITCLEAR | PSP_EVENT_WAITOR, 0); sceKernelSetEventFlag(flag, 0xFFFFFFFF); WAIT_TEST_SIMPLE_TIMEOUT("0xFFFFFFFF & 0x00000000", flag, 0x00000000, PSP_EVENT_WAITAND, 500); WAIT_TEST_SIMPLE_TIMEOUT("0xFFFFFFFF & 0xFFFFFFFF", flag, 0xFFFFFFFF, PSP_EVENT_WAITAND, 500); WAIT_TEST_SIMPLE_TIMEOUT("0xFFFFFFFF | 0xFFFFFFFF", flag, 0xFFFFFFFF, PSP_EVENT_WAITOR, 500); sceKernelClearEventFlag(flag, 0x0000FFFF); WAIT_TEST_SIMPLE_TIMEOUT("0x0000FFFF & 0xFFFFFFFF", flag, 0xFFFFFFFF, PSP_EVENT_WAITAND, 500); WAIT_TEST_SIMPLE_TIMEOUT("0x0000FFFF | 0xFFFFFFFF", flag, 0xFFFFFFFF, PSP_EVENT_WAITOR, 500); WAIT_TEST_SIMPLE_TIMEOUT("0x0000FFFF & 0xFFFFFFFF with clear", flag, 0xFFFFFFFF, PSP_EVENT_WAITAND | PSP_EVENT_WAITCLEAR, 500); WAIT_TEST_SIMPLE_TIMEOUT("0x0000FFFF | 0xFFFFFFFF with clear", flag, 0xFFFFFFFF, PSP_EVENT_WAITOR | PSP_EVENT_WAITCLEAR, 500); sceKernelClearEventFlag(flag, 0x0000FFFF); WAIT_TEST_SIMPLE_TIMEOUT("0x0000FFFF & 0xFFFFFFFF with clear all", flag, 0xFFFFFFFF, PSP_EVENT_WAITAND | PSP_EVENT_WAITCLEARALL, 500); WAIT_TEST_SIMPLE_TIMEOUT("0x0000FFFF | 0xFFFFFFFF with clear all", flag, 0xFFFFFFFF, PSP_EVENT_WAITOR | PSP_EVENT_WAITCLEARALL, 500); sceKernelClearEventFlag(flag, 0x00000000); WAIT_TEST_SIMPLE_TIMEOUT("0x00000000 & 0xFFFFFFFF", flag, 0xFFFFFFFF, PSP_EVENT_WAITAND, 500); WAIT_TEST_SIMPLE_TIMEOUT("Zero timeout", flag, 0xFFFFFFFF, PSP_EVENT_WAITAND, 0); WAIT_TEST_SIMPLE_TIMEOUT("5ms timeout", flag, 0xFFFFFFFF, PSP_EVENT_WAITAND, 5); // Set off thread. schedulingLogPos = 0; schedulingPlacement = 1; SCHED_LOG(A, 1); SceUInt timeout = 5000; SceUID thread = sceKernelCreateThread("waitTest", (void *)&waitTestFunc, 0x12, 0x10000, 0, NULL); sceKernelStartThread(thread, sizeof(flag), &flag); SCHED_LOG(B, 1); int result = sceKernelWaitEventFlag(flag, 0xFFFFFFFF, PSP_EVENT_WAITAND, NULL, &timeout); SCHED_LOG(E, 1); printf("Wait timeout: %s (thread=%08X, main=%08X, remaining=%d)\n", schedulingLog, schedulingResult, result, (timeout + 5) / 1000); sceKernelDeleteEventFlag(flag); SceUID deleteThread = CREATE_SIMPLE_THREAD(deleteMeFunc); flag = sceKernelCreateEventFlag("wait1", 0, 0x00000000, NULL); sceKernelStartThread(deleteThread, sizeof(int), &flag); sceKernelDelayThread(500); sceKernelDeleteEventFlag(flag); WAIT_TEST_SIMPLE("NULL", 0, 0, PSP_EVENT_WAITAND, 0); WAIT_TEST_SIMPLE("Invalid", 0xDEADBEEF, 0, PSP_EVENT_WAITAND, 0); WAIT_TEST_SIMPLE("Deleted", flag, 0, PSP_EVENT_WAITAND, 0); BASIC_SCHED_TEST("NULL", result = sceKernelWaitEventFlag(0, 0xFFFFFFFF, PSP_EVENT_WAITAND, NULL, NULL); );