Skip to content

Instantly share code, notes, and snippets.

@unknownbrackets
Created December 8, 2012 22:00
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save unknownbrackets/4242160 to your computer and use it in GitHub Desktop.
Save unknownbrackets/4242160 to your computer and use it in GitHub Desktop.
Messy tests of PSP callback handling
#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