Created
December 8, 2012 22:00
-
-
Save unknownbrackets/4242160 to your computer and use it in GitHub Desktop.
Messy tests of PSP callback handling
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <common.h> | |
#include <stdarg.h> | |
#include <pspsdk.h> | |
#include <pspkernel.h> | |
#include <pspthreadman.h> | |
#include <psploadexec.h> | |
#include <pspumd.h> | |
char schedulingLog[65536]; | |
char *schedulingLogPos; | |
int cb1, cb2, cb3; | |
int thread1, thread2, thread3; | |
void schedf(const char *format, ...) { | |
va_list args; | |
va_start(args, format); | |
//schedulingLogPos += vsprintf(schedulingLogPos, format, args); | |
vprintf(format, args); | |
va_end(args); | |
} | |
int cbHandler(int unknown, int info, void *arg) { | |
int thread = -1; | |
if (sceKernelGetThreadId() == thread1) | |
thread = 1; | |
else if (sceKernelGetThreadId() == thread2) | |
thread = 2; | |
else if (sceKernelGetThreadId() == thread3) | |
thread = 3; | |
schedf("cbHandler called: %08X, %08X, %08X on thread %d\n", (uint)unknown, (uint)info, (uint)arg, thread); | |
return 0; | |
} | |
int sleeperFunc(SceSize argc, void* argv) { | |
schedf("sleeperFunc: START\n"); | |
thread2 = sceKernelGetThreadId(); | |
schedf("sleeperFunc: GOT ME A THREAD ID\n"); | |
cb2 = sceKernelCreateCallback("cbHandler2", cbHandler, (void *)0x4567); | |
schedf("sleeperFunc: CALLBACK DONE CREATED\n"); | |
sceKernelNotifyCallback(cb2, 0x22); | |
schedf("sleeperFunc: NOTIF BE SENT\n"); | |
sceKernelCheckCallback(); | |
schedf("sleeperFunc: CHECKIN ALL DAY LONG\n"); | |
sceKernelSleepThreadCB(); | |
schedf("thread2 awake\n"); | |
return 0; | |
} | |
int sleeperFunc3(SceSize argc, void* argv) { | |
schedf("sleeperFunc3: START\n"); | |
thread3 = sceKernelGetThreadId(); | |
schedf("sleeperFunc3: GOT ME A THREAD ID\n"); | |
cb3 = sceKernelCreateCallback("cbHandler3", cbHandler, (void *)0x8901); | |
schedf("sleeperFunc3: CALLBACK DONE CREATED\n"); | |
sceKernelNotifyCallback(cb2, 0x23); | |
schedf("sleeperFunc3: NOTIF BE SENT\n"); | |
sceKernelCheckCallback(); | |
schedf("sleeperFunc3: CHECKIN ALL DAY LONG\n"); | |
sceKernelDelayThreadCB(1000000); | |
schedf("thread3 awake\n"); | |
return 0; | |
} | |
void attempt_sceKernelLockMutexCB(const char *name, SceUID mutex, int n, SceUInt *timeout) { | |
sceKernelNotifyCallback(cb1, 0x11); | |
sceKernelNotifyCallback(cb2, 0x21); | |
sceKernelNotifyCallback(cb3, 0x31); | |
int result = sceKernelLockMutexCB(mutex, n, timeout); | |
schedf("%s: %08X\n", name, result); | |
} | |
int main(int argc, char **argv) { | |
schedulingLogPos = schedulingLog; | |
thread1 = sceKernelGetThreadId(); | |
SceUID sleeperThread = sceKernelCreateThread("sleeperFunc", sleeperFunc, 0x20, 0x1000, 0, 0); | |
sceKernelStartThread(sleeperThread, 0, 0); | |
sceKernelDelayThread(10000); | |
SceUID sleeperThread3 = sceKernelCreateThread("sleeperFunc3", sleeperFunc3, 0x70, 0x1000, 0, 0); | |
sceKernelStartThread(sleeperThread3, 0, 0); | |
sceKernelDelayThread(10000); | |
schedf("thread1 awake\n"); | |
SceUID mutex = sceKernelCreateMutex("lock", 0, 0, 0); | |
cb1 = sceKernelCreateCallback("cbHandler1", cbHandler, (void *)0x1234); | |
attempt_sceKernelLockMutexCB("Lock 0 => 5", mutex, 5, NULL); | |
attempt_sceKernelLockMutexCB("Lock 0 => 1", mutex, 1, NULL); | |
attempt_sceKernelLockMutexCB("Lock 1 => 1", mutex, 1, NULL); | |
schedf("Forcing a resched...\n"); | |
sceKernelNotifyCallback(cb2, 0x21); | |
sceKernelDelayThread(10); | |
schedf("Forcing a CB resched...\n"); | |
sceKernelDelayThreadCB(10); | |
sceKernelNotifyCallback(cb2, 0x21); | |
schedf("Check callbacks on thread1 with pending on thread2...\n"); | |
sceKernelCheckCallback(); | |
schedf("Forcing a CB resched...\n"); | |
sceKernelDelayThreadCB(10); | |
printf("%s", schedulingLog); | |
return 0; | |
} | |
/* | |
Expected result: | |
sleeperFunc: START | |
sleeperFunc: GOT ME A THREAD ID | |
sleeperFunc: CALLBACK DONE CREATED | |
sleeperFunc: NOTIF BE SENT | |
cbHandler called: 00000001, 00000022, 00004567 on thread 2 | |
sleeperFunc: CHECKIN ALL DAY LONG | |
sleeperFunc3: START | |
sleeperFunc3: GOT ME A THREAD ID | |
sleeperFunc3: CALLBACK DONE CREATED | |
cbHandler called: 00000001, 00000023, 00004567 on thread 2 | |
sleeperFunc3: NOTIF BE SENT | |
sleeperFunc3: CHECKIN ALL DAY LONG | |
thread1 awake | |
Lock 0 => 5: 800201BD | |
cbHandler called: 00000002, 00000011, 00001234 on thread 1 | |
Lock 0 => 1: 00000000 | |
Lock 1 => 1: 800201C8 | |
Forcing a resched... | |
cbHandler called: 00000004, 00000021, 00004567 on thread 2 | |
cbHandler called: 00000003, 00000031, 00008901 on thread 3 | |
Forcing a CB resched... | |
cbHandler called: 00000001, 00000011, 00001234 on thread 1 | |
Check callbacks on thread1 with pending on thread2... | |
Forcing a CB resched... | |
cbHandler called: 00000001, 00000021, 00004567 on thread 2 | |
*/ |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment