// 使用函数 fn 创建一个新的协程, 并添加到协程队列 int taskcreate(void (*fn)(void*), void *arg, uint stack) { int id; Task *t; // 申请协程结构的空间以及初始化 t = taskalloc(fn, arg, stack); // 当前协程数目 +1 taskcount++; id = t->id; // 存储所有协程的数组是否需要扩容 // 为什么是 nalltask % 64 == 0 是扩容的条件? // 因为每次增加64,所以每当能整除的时候说明,空间用完 if(nalltask%64 == 0){ alltask = realloc(alltask, (nalltask+64)*sizeof(alltask[0])); if(alltask == nil){ fprint(2, "out of memory\n"); abort(); } } // 放到数组尾部 t->alltaskslot = nalltask; alltask[nalltask++] = t; // 协程状态设置为就绪, 可以进行调度 taskready(t); return id; }
int taskcreate(void (*fn)(void*), void *arg, uint stack) { int id; Task *t; //fprintf(stderr,"taskcreate 1\n"); t = taskalloc(fn, arg, stack); //fprintf(stderr,"taskcreate 2\n"); taskcount++; id = t->id; //fprintf(stderr,"taskcreate 3\n"); if(nalltask%64 == 0){ alltask = (Task**) realloc(alltask, (nalltask+64)*sizeof(alltask[0])); //fprintf(stderr,"taskcreate 4\n"); if(alltask == nil){ fprint(2, "out of memory\n"); abort(); } } //fprintf(stderr,"taskcreate 5\n"); t->alltaskslot = nalltask; alltask[nalltask++] = t; //fprintf(stderr,"taskcreate 6\n"); taskready(t); //fprintf(stderr,"taskcreate 7\n"); return id; }
int taskcreate(void (*fn)(void*), void *arg, uint stack) { int id; Task *t; t = taskalloc(fn, arg, stack);//初始化申请Task数据结构,设置堆栈内容等 taskcount++;//当前OK的协程数目,不包括系统级别的协程 id = t->id; if(nalltask%64 == 0){//一次申请64个槽位,只能往后放 alltask = realloc(alltask, (nalltask+64)*sizeof(alltask[0])); if(alltask == nil){ fprint(2, "out of memory\n"); abort(); } } t->alltaskslot = nalltask; alltask[nalltask++] = t; taskready(t);//加入taskrunqueue的运行队列 return id; }