Skip to content

Commit 410d7bf

Browse files
authored
added ToadKing libco support that fixes emscripten build (#90)
1 parent c50fb61 commit 410d7bf

File tree

3 files changed

+89
-2
lines changed

3 files changed

+89
-2
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,85 @@
1+
#define LIBCO_C
2+
#include "libco.h"
3+
4+
#define _BSD_SOURCE
5+
#define _XOPEN_SOURCE 500
6+
#include <stdlib.h>
7+
#include <emscripten/fiber.h>
8+
#include <stdio.h>
9+
10+
#ifdef __cplusplus
11+
extern "C" {
12+
#endif
13+
14+
typedef void (*thread_cb)();
15+
16+
// Todo: dynamic stack size
17+
typedef struct {
18+
emscripten_fiber_t context;
19+
char *asyncify_stack;
20+
char *c_stack;
21+
} Fiber;
22+
23+
static inline void thread_entry(void *entrypoint) {
24+
((thread_cb)entrypoint)();
25+
}
26+
27+
static Fiber main_fiber;
28+
static Fiber* running_fiber = 0;
29+
30+
void init_main_fiber() {
31+
main_fiber.asyncify_stack = (char*)malloc(16385 * sizeof(char));
32+
emscripten_fiber_init_from_current_context(&main_fiber.context, main_fiber.asyncify_stack, 16385);
33+
running_fiber = &main_fiber;
34+
}
35+
36+
cothread_t co_active() {
37+
if(!running_fiber) init_main_fiber();
38+
39+
return (cothread_t)running_fiber;
40+
}
41+
42+
cothread_t co_derive(void* memory, unsigned int heapsize, void (*coentry)(void)) {
43+
if(!running_fiber) init_main_fiber();
44+
45+
Fiber* fiber = malloc(sizeof(Fiber));
46+
fiber->c_stack = (char*) memory;
47+
fiber->asyncify_stack = (char*) malloc(heapsize * sizeof(char));
48+
49+
emscripten_fiber_init(&fiber->context, thread_entry, coentry, fiber->c_stack, heapsize, fiber->asyncify_stack, heapsize);
50+
51+
return (cothread_t)fiber;
52+
}
53+
54+
cothread_t co_create(unsigned int heapsize, void (*coentry)(void)) {
55+
if(!running_fiber) init_main_fiber();
56+
57+
Fiber* fiber = malloc(sizeof(Fiber));
58+
fiber->c_stack = (char*)malloc(heapsize * sizeof(char));
59+
fiber->asyncify_stack = (char*)malloc(heapsize * sizeof(char));
60+
61+
emscripten_fiber_init(&fiber->context, thread_entry, coentry, fiber->c_stack, heapsize, fiber->asyncify_stack, heapsize);
62+
63+
return (cothread_t)fiber;
64+
}
65+
66+
void co_delete(cothread_t cothread) {
67+
if(cothread) {
68+
free(cothread);
69+
}
70+
}
71+
72+
void co_switch(cothread_t cothread) {
73+
Fiber* old_fiber = running_fiber;
74+
running_fiber = (Fiber*)cothread;
75+
76+
emscripten_fiber_swap(&old_fiber->context, &running_fiber->context);
77+
}
78+
79+
int co_serializable() {
80+
return 0;
81+
}
82+
83+
#ifdef __cplusplus
84+
}
85+
#endif

libretro/libretro-common/libco/libco.c

+3-1
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,9 @@ void *genode_alloc_secondary_stack(unsigned long stack_size);
99
void genode_free_secondary_stack(void *stack);
1010
#endif
1111

12-
#if defined _MSC_VER
12+
#if defined(EMSCRIPTEN)
13+
#include "emscripten_fiber.c"
14+
#elif defined _MSC_VER
1315
#include <Windows.h>
1416
#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP)
1517
#include "fiber.c"

libretro/libretro-core.c

+1-1
Original file line numberDiff line numberDiff line change
@@ -1171,7 +1171,7 @@ void retro_audio_cb(short l, short r)
11711171

11721172
/* Forward declarations */
11731173
void retro_sound_update(void);
1174-
void Retro_PollEvent(void);
1174+
int Retro_PollEvent(void);
11751175

11761176
void retro_run(void)
11771177
{

0 commit comments

Comments
 (0)