From 365077772d3d8d5d479febd0388d7e74ef08d508 Mon Sep 17 00:00:00 2001 From: aliaspider Date: Mon, 8 Dec 2014 22:56:33 +0100 Subject: start implementing the libretro interface. (not working yet) --- libco/fiber.c | 58 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 58 insertions(+) create mode 100644 libco/fiber.c (limited to 'libco/fiber.c') diff --git a/libco/fiber.c b/libco/fiber.c new file mode 100644 index 0000000..90ba115 --- /dev/null +++ b/libco/fiber.c @@ -0,0 +1,58 @@ +/* + libco.win (2008-01-28) + authors: Nach, byuu + license: public domain +*/ + +#define LIBCO_C +#include +#define WINVER 0x0400 +#define _WIN32_WINNT 0x0400 +#define WIN32_LEAN_AND_MEAN +#include + +#ifdef __cplusplus +extern "C" { +#endif + +static thread_local cothread_t co_active_ = 0; + +static void __stdcall co_thunk(void *coentry) +{ + ((void (*)(void))coentry)(); +} + +cothread_t co_active(void) +{ + if(!co_active_) + { + ConvertThreadToFiber(0); + co_active_ = GetCurrentFiber(); + } + return co_active_; +} + +cothread_t co_create(unsigned int heapsize, void (*coentry)(void)) +{ + if(!co_active_) + { + ConvertThreadToFiber(0); + co_active_ = GetCurrentFiber(); + } + return (cothread_t)CreateFiber(heapsize, co_thunk, (void*)coentry); +} + +void co_delete(cothread_t cothread) +{ + DeleteFiber(cothread); +} + +void co_switch(cothread_t cothread) +{ + co_active_ = cothread; + SwitchToFiber(cothread); +} + +#ifdef __cplusplus +} +#endif -- cgit v1.2.3