#include #include "fiber.h" #define STACK_SIZE (1024*1024) void init_fiber(fiber_t *fiber) { assert(fiber); DWORD ret = 0; void *p_fiber = 0; p_fiber = GetCurrentFiber(); if (p_fiber != NULL && p_fiber != (void*)0x1E00) { fiber->f_pointer = p_fiber; fiber->init = 1; return; } p_fiber = ConvertThreadToFiber(NULL); if(p_fiber) { fiber->f_pointer = p_fiber; fiber->init = 1; } else { ret = GetLastError(); } } void prepare_fiber(size_t stack_size, fiber_t *fiber, void *code, void* arg) { assert(fiber); assert(code); fiber->f_pointer = CreateFiber(stack_size, (LPFIBER_START_ROUTINE)code, (LPVOID)arg); assert(fiber->f_pointer); } void release_fiber(fiber_t *fiber) { if (fiber->f_pointer) { DeleteFiber(fiber->f_pointer); } fiber->f_pointer = NULL; } void switch_fiber(fiber_t *to, fiber_t *from) { assert(from->f_pointer); BOOL isFiber = IsThreadAFiber(); if (!isFiber) ConvertThreadToFiber(0); to->f_pointer = GetCurrentFiber(); SwitchToFiber(from->f_pointer); if(!isFiber) ConvertFiberToThread(); } void fiber_code(void* arg) { void *p = malloc(1); } int main(void) { fiber_t from; fiber_t to; init_fiber(&from); prepare_fiber(0, &from, fiber_code, 0); switch_fiber(&to, &from); }