Beispiel #1
0
static inline int32_t prepare_write(log_t l)
{
	int32_t i = 0;
	wpacket_t w = (wpacket_t)link_list_head(l->pending_log);
	buffer_t b;
	uint32_t pos;
	uint32_t buffer_size = 0;
	uint32_t size = 0;
	while(w && i < max_write_buf)
	{
		pos = w->begin_pos;
		b = w->buf;
		buffer_size = w->data_size;
		while(i < max_write_buf && b && buffer_size)
		{
			l->wbuf[i].iov_base = b->buf + pos;
			size = b->size - pos;
			size = size > buffer_size ? buffer_size:size;
			buffer_size -= size;
			l->wbuf[i].iov_len = size;
			++i;
			b = b->next;
			pos = 0;
		}
		w = (wpacket_t)w->next.next;
	}
	return i;
}
Beispiel #2
0
static inline void write_all_log_file(int32_t is_close)
{
	log_t l = (log_t)link_list_head(g_log_system->log_files);
	while(l)
	{
		write_to_file(l,is_close);
		l = (log_t)(((struct list_node*)l)->next);
	}
}
Beispiel #3
0
//冲刷当前线程使用的所有消息队列,将其中遗留的消息同步到share队列中
void mq_flush()
{
	struct thread_associate_mqs *tmq = (struct thread_associate_mqs*)pthread_getspecific(g_mq_system->t_key);
	if(tmq)
	{
		list_node *n = link_list_head(tmq->mqs);
		while(n)
		{
			mq_t _mq = ((struct thread_mq_element*)n)->_mq;
			mq_force_sync(_mq);
			n = n->next;
		}
	}
}
Beispiel #4
0
void destroy_acceptor(acceptor_t *a)
{
	close((*a)->poller_fd);
	list_node *_st = link_list_head((*a)->st_listens);
	while(_st)
	{
		struct st_listen *tmp = (struct st_listen *)_st;
		_st = _st->next;
		ReleaseSocket(tmp->sock);
		free(tmp);
	}
	LINK_LIST_DESTROY(&((*a)->st_listens));		
	free(*a);
	*a = NULL;
}
Beispiel #5
0
void destroy_mq(mq_t *m)
{
	mutex_destroy(&(*m)->mtx);
	destroy_q_item((*m)->share_list,(*m)->_item_destroyer);//销毁share_list中所有元素
	LINK_LIST_DESTROY(&(*m)->share_list);
	list_node *l = link_list_head((*m)->local_lists);
	while(l)
	{
		struct per_thread_struct *pts = (struct per_thread_struct*)l;
		destroy_q_item(pts->local_push_q,(*m)->_item_destroyer);
		destroy_q_item(pts->local_pop_q,(*m)->_item_destroyer);
		l = l->next;
		per_thread_destroy(&pts);
	}	
	LINK_LIST_DESTROY(&(*m)->local_lists);
	free(*m);
	*m = NULL;		
}
Beispiel #6
0
//发送相关函数
static inline st_io *prepare_send(struct connection *c)
{
	int32_t i = 0;
	wpacket_t w = (wpacket_t)link_list_head(c->send_list);
	buffer_t b;
	uint32_t pos;
	st_io *O = NULL;
	uint32_t buffer_size = 0;
	uint32_t size = 0;
	uint32_t send_size_remain = MAX_SEND_SIZE;
	while(w && i < MAX_WBAF && send_size_remain > 0)
	{
		pos = w->begin_pos;
		b = w->buf;
		buffer_size = w->data_size;
		while(i < MAX_WBAF && b && buffer_size && send_size_remain > 0)
		{
			c->wsendbuf[i].iov_base = b->buf + pos;
			size = b->size - pos;
			size = size > buffer_size ? buffer_size:size;
			size = size > send_size_remain ? send_size_remain:size;
			buffer_size -= size;
			send_size_remain -= size;
			c->wsendbuf[i].iov_len = size;
			++i;
			b = b->next;
			pos = 0;
		}
		if(send_size_remain > 0)
			w = (wpacket_t)w->next.next;
	}
	if(i)
	{
		c->send_overlap.m_super.iovec_count = i;
		c->send_overlap.m_super.iovec = c->wsendbuf;
		O = (st_io*)&c->send_overlap;
	}
	return O;

}