Exemple #1
0
// 使用函数 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;
}
Exemple #2
0
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;
}
Exemple #3
0
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;
}