//创建一个coroutine,并返回其id int coroutine_new(struct schedule *S, coroutine_func func, void *ud) { printf("%s:%s\n", __FILE__, __FUNCTION__); //调用内部函数创建coroutine struct coroutine *co = _co_new(S, func , ud); //将创建的coroutine加入到schedule中管理 if (S->nco >= S->cap) { int id = S->cap; S->co = realloc(S->co, S->cap * 2 * sizeof(struct coroutine *)); memset(S->co + S->cap , 0 , sizeof(struct coroutine *) * S->cap); S->co[S->cap] = co; S->cap *= 2; ++S->nco; printf("%s:%s:%d gen coroutine id:%d\n", __FILE__, __FUNCTION__,__LINE__, id); return id; } else { int i; //这里从前向后查找空闲的位置并使用,看来此id会很快被复用的 for (i=0;i<S->cap;i++) { int id = (i+S->nco) % S->cap; if (S->co[id] == NULL) { S->co[id] = co; ++S->nco; printf("%s:%s:%d gen coroutine id:%d co:%p\n", __FILE__, __FUNCTION__,__LINE__, id, co); return id; } } } assert(0); return -1; }
int coroutine_new(struct schedule *S, coroutine_func func, void *ud) { // 用于新建一个一个coroutine struct coroutine *co = _co_new(S, func, ud); // ud你可以认为是参数 if (S->nco >= S->cap) { // nco表示协程的数目大于容量了。 int id = S->cap; S->co = realloc(S->co, S->cap * 2 * sizeof(struct coroutine *)); // 用于重新分配 memset(S->co + S->cap, 0, sizeof(struct coroutine *) * S->cap); S->co[S->cap] = co; // 好吧,终于开始装入coroutine了! S->cap *= 2; // 因为容量翻倍了嘛 ++S->nco; return id; } else { int i; for (i = 0; i < S->cap; i++) { // 总之就是不断寻找,找到一个空的位置为止 int id = (i + S->nco) % S->cap; if (S->co[id] == NULL) { S->co[id] = co; ++S->nco; return id; } } } assert(0); return -1; }
int coroutine_new(struct schedule *S, coroutine_func func, void *ud) { struct coroutine *co = _co_new(S, func , ud); /*超过协程允许个数,2倍增加*/ if (S->nco >= S->cap) { int id = S->cap; S->cap *= 2; S->co = (struct coroutine**)realloc(S->co, S->cap * 2 * sizeof(struct coroutine *)); memset(S->co + S->cap , 0 , sizeof(struct coroutine *) * S->cap); S->co[S->cap] = co; S->cap *= 2; ++S->nco; return id; } else { int i; for (i=0;i<S->cap;i++) { int id = (i+S->nco) % S->cap; if (S->co[id] == NULL) { S->co[id] = co; ++S->nco; return id; } } } assert(0); return -1; }
int coroutine_new(struct schedule *sched, struct coroutine_callbacks_t callbacks) { if (sched->nco >= sched->cap && sched->cap >= MAX_COROUTINE) { // full return -1; } struct coroutine *co = _co_new(sched, callbacks); if (sched->nco >= sched->cap) { int id = sched->cap; sched->co = realloc(sched->co, sched->cap * 2 * sizeof(struct coroutine *)); memset(sched->co + sched->cap , 0 , sizeof(struct coroutine *) * sched->cap); sched->co[sched->cap] = co; sched->cap *= 2; ++sched->nco; sched->last_co_id = id; return id; } else { int i; for (i=0;i<sched->cap;i++) { int id = (i + 1 + sched->last_co_id) % sched->cap; if (sched->co[id] == NULL) { sched->co[id] = co; ++sched->nco; sched->last_co_id = id; return id; } } } assert(0); return -1; }