Example #1
0
//创建一个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;
}
Example #2
0
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;
}
Example #3
0
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;
}
Example #4
0
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;
}