42 lines
931 B
C
Raw Normal View History

#define LIBCO_C
#include "libco.h"
#include <stdlib.h>
#include <pspthreadman.h>
2020-05-14 09:27:58 +02:00
typedef void (*entrypoint_t)(void);
2023-02-23 13:15:14 +01:00
cothread_t co_active(void)
{
2023-02-23 13:15:14 +01:00
return (void *)sceKernelGetThreadId();
}
2020-05-14 09:27:58 +02:00
static int thread_wrap(unsigned int argc, void *argp)
{
2020-05-14 09:27:58 +02:00
entrypoint_t entrypoint = *(entrypoint_t *) argp;
sceKernelSleepThread();
entrypoint();
return 0;
}
2020-05-14 09:27:58 +02:00
cothread_t co_create(unsigned int size, void (*entrypoint)(void))
{
SceUID new_thread_id = sceKernelCreateThread("cothread", thread_wrap, 0x12, size, 0, NULL);
sceKernelStartThread(new_thread_id, sizeof (entrypoint), &entrypoint);
return (void *) new_thread_id;
}
void co_delete(cothread_t handle)
{
2020-05-14 09:27:58 +02:00
SceUID id = (SceUID) handle;
sceKernelTerminateDeleteThread(id);
}
void co_switch(cothread_t handle)
{
2020-05-14 09:27:58 +02:00
SceUID id = (SceUID) handle;
sceKernelWakeupThread(id);
/* Sleep the currently active thread so the new thread can start */
sceKernelSleepThread();
2020-05-14 09:27:58 +02:00
}