File: psp1.c

package info (click to toggle)
retroarch 1.20.0%2Bdfsg-2
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 75,736 kB
  • sloc: ansic: 1,207,646; cpp: 104,166; objc: 8,567; asm: 6,624; python: 3,776; makefile: 2,838; sh: 2,786; xml: 1,408; perl: 393; javascript: 10
file content (41 lines) | stat: -rw-r--r-- 931 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#define LIBCO_C
#include "libco.h"

#include <stdlib.h>
#include <pspthreadman.h>

typedef void (*entrypoint_t)(void);

cothread_t co_active(void)
{
  return (void *)sceKernelGetThreadId();
}

static int thread_wrap(unsigned int argc, void *argp)
{
  entrypoint_t entrypoint = *(entrypoint_t *) argp;
  sceKernelSleepThread();
  entrypoint();
  return 0;
}

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)
{
  SceUID id = (SceUID) handle;
  sceKernelTerminateDeleteThread(id);
}

void co_switch(cothread_t handle)
{
  SceUID id = (SceUID) handle;
  sceKernelWakeupThread(id);
  /* Sleep the currently active thread so the new thread can start */
  sceKernelSleepThread();
}