void   stop_engine(engine_t e)
{
	assert(e);
/*	
	mutex_lock(e->mtx);
	e->status = 0;
	//强制唤醒所有等待在完成队列上的线程 
	struct block_queue *queue = 0;
	/*唤醒所有等待在完成队列的线程* /
	while(queue = LIST_POP(struct block_queue *,e->block_thread_queue))
	{
		BLOCK_QUEUE_FORCE_WAKEUP(queue);
	}	
	mutex_unlock(e->mtx);
*/
	mutex_lock(e->mtx);
	e->status = 0;
	//强制唤醒所有等待在完成队列上的线程 
	MsgQueue_t msgQ = 0;
	/*唤醒所有等待在完成队列的线程*/
	while(msgQ = LIST_POP(MsgQueue_t,e->block_thread_queue))
	{
		//发送一个0消息
		void *tmp = 0;
		PutMsg(msgQ,&tmp,sizeof(tmp));
	}	
	mutex_unlock(e->mtx);
}
int put_event(engine_t e,st_io *io)
{
	assert(e);
	assert(io);
	/*
	mutex_lock(e->mtx);
	struct block_queue *EventQ = LIST_POP(struct block_queue*,e->block_thread_queue);
	if(!EventQ)
	{
		//没有等待的线程,先缓冲事件
		LIST_PUSH_BACK(e->buffering_event_queue,io);
		io = 0;
	}
	mutex_unlock(e->mtx);	
	if(io)
		BLOCK_QUEUE_PUSH(EventQ,io);
	*/
	//printf("putevent\n");
	mutex_lock(e->mtx);
	MsgQueue_t msgQ = LIST_POP(MsgQueue_t,e->block_thread_queue);
	if(!msgQ)
	{
		//没有等待的线程,先缓冲事件
		LIST_PUSH_BACK(e->buffering_event_queue,io);
		io = 0;		
	}
	mutex_unlock(e->mtx);
	if(io)
		PutMsg(msgQ,&io,sizeof(io));
	
	return 0;
}
Beispiel #3
0
wpacket_t wpacket_create_by_rpacket(struct rpacket *r)
{
	wpacket_t w = LIST_POP(wpacket_t,g_wpacket_pool);//calloc(1,sizeof(*w));
	if(!w)
	{
		printf("缓存不够了\n");
		getchar();
		exit(0);
	}
	
	//wpacket_t w = calloc(1,sizeof(*w));
	w->raw = r->raw;
	w->factor = 0;
	w->writebuf = 0;
	w->begin_pos = r->begin_pos;
	w->buf = buffer_acquire(0,r->buf);
	w->len = 0;//触发拷贝之前len没有作用
	w->wpos = 0;
	if(w->raw)
		w->data_size = r->len;
	else
		w->data_size = r->len + sizeof(r->len);
	return w;
}
Beispiel #4
0
wpacket_t wpacket_create(uint32_t size,uint8_t is_raw)
{
	uint8_t k = GetK(size);
	wpacket_t w;
	size = 1 << k;
	w = LIST_POP(wpacket_t,g_wpacket_pool);//calloc(1,sizeof(*w));
	if(!w)
	{
		printf("缓存不够了\n");
		getchar();
		exit(0);
	}
	
	//w = calloc(1,sizeof(*w));
	w->factor = k;
	w->raw = is_raw;
	w->buf = buffer_create_and_acquire(0,size);
	w->writebuf = buffer_acquire(0,w->buf);
	w->begin_pos = 0;
	if(is_raw)
	{
		w->wpos = 0;
		w->len = 0;
		w->buf->size = 0;
		w->data_size = 0;
	}
	else
	{
		w->wpos = sizeof(w->len);
		w->len = (uint32_t*)w->buf->buf;
		*(w->len) = 0;
		w->buf->size = sizeof(w->len);
		w->data_size = sizeof(*(w->len));
	}
	return w;
}