1 #define LIBCO_C
2 #include "libco.h"
3 
4 #include <stdlib.h>
5 #include <pspthreadman.h>
6 
7 typedef void (*entrypoint_t)(void);
8 
co_active()9 cothread_t co_active()
10 {
11   return (void *) sceKernelGetThreadId();
12 }
13 
thread_wrap(unsigned int argc,void * argp)14 static int thread_wrap(unsigned int argc, void *argp)
15 {
16   entrypoint_t entrypoint = *(entrypoint_t *) argp;
17   sceKernelSleepThread();
18   entrypoint();
19   return 0;
20 }
21 
co_create(unsigned int size,void (* entrypoint)(void))22 cothread_t co_create(unsigned int size, void (*entrypoint)(void))
23 {
24   SceUID new_thread_id = sceKernelCreateThread("cothread", thread_wrap, 0x12, size, 0, NULL);
25   sceKernelStartThread(new_thread_id, sizeof (entrypoint), &entrypoint);
26   return (void *) new_thread_id;
27 }
28 
co_delete(cothread_t handle)29 void co_delete(cothread_t handle)
30 {
31   SceUID id = (SceUID) handle;
32   sceKernelTerminateDeleteThread(id);
33 }
34 
co_switch(cothread_t handle)35 void co_switch(cothread_t handle)
36 {
37   SceUID id = (SceUID) handle;
38   sceKernelWakeupThread(id);
39   /* Sleep the currently active thread so the new thread can start */
40   sceKernelSleepThread();
41 }
42