Beispiel #1
0
void sche_destroy(sche_t *s)
{
	struct double_link_node *dlnode = NULL;
	while(dlnode = double_link_pop(&(*s)->coros))
	{
		coro_t co = (coro_t)dlnode+sizeof(struct list_node);
		coro_destroy(&co);
	}
	
	LINK_LIST_DESTROY(&((*s)->active_list_1));
	LINK_LIST_DESTROY(&((*s)->active_list_2));
	minheap_destroy(&((*s)->_minheap));
	coro_destroy(&(*s)->co);
	free(*s);
	*s = NULL;
}
Beispiel #2
0
static inline mq_sync_push(mq_t m,struct per_thread_struct *pts)
{
	mutex_lock(m->mtx);
	uint8_t empty = link_list_is_empty(m->share_list);
	link_list_swap(m->share_list,pts->local_push_q);
	if(empty)
	{
		struct double_link_node *l = double_link_pop(&m->blocks);
		if(l)
		{
			//if there is block per_thread_struct wake it up
			struct per_thread_struct *block_pts = (struct per_thread_struct *)((uint8_t*)l - sizeof(struct list_node));
			mutex_unlock(m->mtx);
			condition_signal(block_pts->cond);
			return;
		}
	}
	mutex_unlock(m->mtx);
}
Beispiel #3
0
int32_t epoll_loop(engine_t n,int32_t ms)
{
	assert(n);	
	uint32_t sleep_ms;
	uint32_t timeout = GetSystemMs() + ms;
	uint32_t current_tick;
	do{		
		while(!double_link_empty(n->actived))
		{
			socket_t s = (socket_t)double_link_pop(n->actived);
			s->isactived = 0;
			if(Process(s))
			{
				s->isactived = 1;
				double_link_push(n->actived,(struct double_link_node*)s);
			}
			//if(GetCurrentMs() >= timeout)
			//	break;
		}
		
		current_tick = GetSystemMs();
		sleep_ms = timeout > current_tick ? timeout - current_tick:0;	
		int32_t nfds = TEMP_FAILURE_RETRY(epoll_wait(n->poller_fd,n->events,MAX_SOCKET,sleep_ms));
		if(nfds < 0)
			return -1;
		int32_t i;
		for(i = 0 ; i < nfds ; ++i)
		{	
			socket_t sock = (socket_t)n->events[i].data.ptr;
			if(sock)
			{
				if(n->events[i].events & EPOLLIN)
					on_read_active(sock);
				if(n->events[i].events & EPOLLOUT)
					on_write_active(sock);	
				if(n->events[i].events & EPOLLERR)
					on_read_active(sock);
			}
		}	
		current_tick = GetSystemMs();
	}while(timeout > current_tick);
	return 0;
}
Beispiel #4
0
void *cavan_data_pool_alloc(struct cavan_data_pool *pool)
{
	void *data;
	struct double_link_node *node;
	struct cavan_data_pool_node *pool_node;

	node = double_link_pop(&pool->link);
	if (node) {
		return double_link_get_container(&pool->link, node);
	}

	data = malloc(pool->node_size);
	if (data == NULL) {
		pr_error_info("malloc");
		return NULL;
	}

	pool_node = cavan_data_pool_to_node(pool, data);
	pool_node->destroy = cavan_data_pool_node_destroy2;
	double_link_node_init(&pool_node->node);

	return data;
}