2020-01-05 11:32:28 +01:00
|
|
|
#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);
|
2020-01-05 11:32:28 +01:00
|
|
|
|
2023-02-23 13:15:14 +01:00
|
|
|
cothread_t co_active(void)
|
2020-01-05 11:32:28 +01:00
|
|
|
{
|
2023-02-23 13:15:14 +01:00
|
|
|
return (void *)sceKernelGetThreadId();
|
2020-01-05 11:32:28 +01:00
|
|
|
}
|
|
|
|
|
2020-05-14 09:27:58 +02:00
|
|
|
static int thread_wrap(unsigned int argc, void *argp)
|
2020-01-05 11:32:28 +01:00
|
|
|
{
|
2020-05-14 09:27:58 +02:00
|
|
|
entrypoint_t entrypoint = *(entrypoint_t *) argp;
|
|
|
|
sceKernelSleepThread();
|
|
|
|
entrypoint();
|
|
|
|
return 0;
|
|
|
|
}
|
2020-01-05 11:32:28 +01:00
|
|
|
|
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;
|
2020-01-05 11:32:28 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
void co_delete(cothread_t handle)
|
|
|
|
{
|
2020-05-14 09:27:58 +02:00
|
|
|
SceUID id = (SceUID) handle;
|
|
|
|
sceKernelTerminateDeleteThread(id);
|
2020-01-05 11:32:28 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
void co_switch(cothread_t handle)
|
|
|
|
{
|
2020-05-14 09:27:58 +02:00
|
|
|
SceUID id = (SceUID) handle;
|
|
|
|
sceKernelWakeupThread(id);
|
2020-01-05 11:32:28 +01:00
|
|
|
/* Sleep the currently active thread so the new thread can start */
|
|
|
|
sceKernelSleepThread();
|
2020-05-14 09:27:58 +02:00
|
|
|
}
|