void ox_connection_netpoll(struct connection_s* self, int64_t millisecond) { if(millisecond < 0) { millisecond = 0; } /* 网络层调度函数:如果当前状态是未链接则尝试取出消息并链接服务器,否则处理来自逻辑层的消息队列 */ if(self->status == connection_none) { ox_thread_sleep(millisecond); connection_proclist_handle(self); } else { int64_t current_time = ox_getnowtime(); const int64_t end_time = current_time + millisecond; do { if(ox_fdset_poll(self->fdset, end_time-current_time) > 0) { if(ox_fdset_check(self->fdset, self->fd, ReadCheck)) { connection_read_handle(self); } if(self->fd != SOCKET_ERROR && ox_fdset_check(self->fdset, self->fd, WriteCheck)) { self->writable = true; ox_fdset_del(self->fdset, self->fd, WriteCheck); } } if(self->writable) { connection_sendmsg_handle(self); } current_time = ox_getnowtime(); }while(end_time > current_time); connection_proclist_handle(self); } ox_rwlist_flush(self->netmsg_list); connection_free_netmsglist(self); }
void ox_nrmgr_logic_poll(struct nr_mgr* mgr, pfn_nrmgr_logicmsg msghandle, int64_t timeout) { int i = 0; if(timeout <= 0) { timeout = 0; } else { timeout /= mgr->reactor_num; } for(; i < mgr->reactor_num; ++i) { reactor_logicmsg_handle(mgr->reactors+i, msghandle, timeout); ox_rwlist_flush(mgr->reactors[i].fromlogic_rwlist); reactor_freesendmsg_handle(mgr->reactors+i); } }
static void reactor_thread(void* arg) { struct net_reactor* reactor = (struct net_reactor*)arg; while(reactor->thread == NULL || ox_thread_isrun(reactor->thread)) { /* 由用户给定网络库每次循环的超时时间 */ server_pool(reactor->server, SOCKET_POLL_TIME); ox_rwlist_flush(reactor->logic_msglist); reactor_proc_rwlist(reactor); reactor_proc_enterlist(reactor); { struct stack_s* waitsend_list = reactor->waitsend_list; char* data = NULL; while((data = ox_stack_popfront(waitsend_list)) != NULL) { struct net_session_s* session = *(struct net_session_s**)data; session->wait_flush = false; session_packet_flush(reactor, session); } } { struct stack_s* waitclose_list = reactor->waitclose_list; char* data = NULL; while((data = ox_stack_popfront(waitclose_list)) != NULL) { struct net_session_s* session = *(struct net_session_s**)data; /* 请求底层释放资源,并会触发释放完成 */ server_close(reactor->server, session->handle); } /* 在处理了waitsend_list之后,使用专门的list来储存待关闭的session,以防reactor_proc_rwlist将session放入sendlist之后,然后free了session */ } } }
void ox_connection_logicpoll(struct connection_s* self, int64_t millisecond) { /* 逻辑层调度函数:处理来自网络层投递的网络消息,以及释放逻辑层投递出的消息 */ struct rwlist_s* logicmsg_list = self->netmsg_list; struct msg_data_s** msg_p = NULL; struct msg_data_s* msg = NULL; pfn_packet_handle handle = self->handle; void* ext = self->ext; struct rwlist_s* free_netmsg_list = self->free_netmsg_list; int64_t current_time = ox_getnowtime(); int64_t end_time = current_time; if(millisecond < 0) { millisecond = 0; } end_time += millisecond; do { msg_p = (struct msg_data_s**)ox_rwlist_pop(logicmsg_list, end_time-current_time); if(msg_p != NULL) { msg = *msg_p; (handle)(self, msg, ext); ox_rwlist_push(free_netmsg_list, msg_p); current_time = ox_getnowtime(); } else { break; } }while(end_time > current_time); ox_rwlist_flush(self->sendmsg_list); connection_free_sendmsglist(self); }