make
./app
// create a coroutine scheduler
// cap: how many coroutines the scheduler can hold
// return: the new scheduler
scheduler *new_scheduler(int cap);
// create a coroutine
// sch: the coroutine scheduler
// co_body: it's a typedef
// typedef void (*co_body)(scheduler *sch, void *args);
// represent coroutine body
// args: the co_body's parameters
// return: coroutine id
int new_coroutine(scheduler *sch, co_body body, void *args);
// resume coroutine
// sch: the scheduler
// co_id: coroutine id
void resume_coroutine(scheduler *sch, int co_id);
// yield current running coroutine
// sch: the coroutine scheduler
void yield_coroutine(scheduler *sch);
// free the coroutine
// sch: the scheduler
void close_coroutine(scheduler *sch, int co_id);
// free the scheduler
// sch: the scheduler
void close_scheduler(scheduler *sch);
#include "coroutine.h"
#include <stdio.h>
void test(scheduler *sch, void *args) {
char *str = (char *) args;
printf("co start, args: %s, co id: %d\n", str, sch->running_co->id);
printf("co before yield, co id: %d\n", sch->running_co->id);
yield_coroutine(sch);
printf("co resume after yield, co id: %d\n", sch->running_co->id);
printf("co end, co id: %d\n", sch->running_co->id);
}
int main() {
scheduler *sch = new_scheduler(1);
char arg1[] = "test1";
char arg2[] = "test2";
int co_id1 = new_coroutine(sch, test, (void *) arg1);
int co_id2 = new_coroutine(sch, test, (void *) arg2);
printf("==== resume start ====\n");
resume_coroutine(sch, co_id1);
resume_coroutine(sch, co_id2);
printf("=====\n");
resume_coroutine(sch, co_id2);
resume_coroutine(sch, co_id1);
printf("==== resume end ====\n");
close_scheduler(sch);
return 0;
}
result:
==== resume start ====
co start, args: test1, co id: 0
co before yield, co id: 0
co start, args: test2, co id: 1
co before yield, co id: 1
=====
co resume after yield, co id: 1
co end, co id: 1
co resume after yield, co id: 0
co end, co id: 0
==== resume end ====