#ifndef COROUTINE_H #define COROUTINE_H #include "context.h" #include #define DEFAULT_C_STACK_SIZE (2 *1024 * 1024) namespace Study { class Coroutine { public: static std::unordered_map coroutines; static void* get_current_task(); static long create(coroutine_func_t fn, void* args = nullptr); void* get_task(); static Coroutine* get_current(); void set_task(void *_task); protected: Coroutine *origin; static Coroutine* current; void *task = nullptr; static size_t stack_size; Context ctx; long cid; static long last_cid; Coroutine(coroutine_func_t fn, void *private_data) : ctx(stack_size, fn, private_data) { cid = ++last_cid; coroutines[cid] = this; } inline long run() { long cid = this->cid; origin = current; current = this; ctx.swap_in(); return cid; } }; } #endif /* COROUTINE_H */