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; }
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); } }
//冲刷当前线程使用的所有消息队列,将其中遗留的消息同步到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; } } }
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; }
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; }
//发送相关函数 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; }