Example #1
0
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    */
        }
    }
}
Example #4
0
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);
}