struct nr_mgr*
ox_create_nrmgr(
    int thread_num,
    int rbsize,
    pfn_nrmgr_check_packet check)
{
    struct nr_mgr* mgr = (struct nr_mgr*)malloc(sizeof(*mgr));

    if(mgr != NULL)
    {
        int i = 0;

        mgr->reactors = (struct net_reactor*)malloc(sizeof(struct net_reactor) * thread_num);
        mgr->reactor_num = thread_num;

        for(; i < thread_num; ++i)
        {
            struct net_reactor* reactor = mgr->reactors+i;

            reactor->mgr = mgr;
            reactor->active_num = 0;
#ifdef PLATFORM_LINUX
            reactor->server = epollserver_create(rbsize, 0, &mgr->reactors[i]);
#else
            reactor->server = iocp_create(rbsize, 0, &mgr->reactors[i]);
#endif

            reactor->free_sendmsg_list = ox_rwlist_new(DF_LIST_SIZE, sizeof(struct nrmgr_send_msg_data*), DF_RWLIST_PENDING_NUM*10);
            reactor->logic_msglist = ox_rwlist_new(DF_LIST_SIZE, sizeof(struct nrmgr_net_msg*), DF_RWLIST_PENDING_NUM);

            reactor->enter_list = ox_rwlist_new(DF_LIST_SIZE, sizeof(struct rwlist_entermsg_data), DF_RWLIST_PENDING_NUM*10);
            reactor->fromlogic_rwlist = ox_rwlist_new(1024, sizeof(struct rwlist_msg_data) , DF_RWLIST_PENDING_NUM);
            reactor->check_packet = check;

            server_start(reactor->server, reactor_logic_on_enter_callback, reactor_logic_on_disconnection_callback, reactor_logic_on_recved_callback, NULL, session_sendfinish_callback, reactor_logic_on_close_completed);
            reactor->waitsend_list = ox_stack_new(1024, sizeof(struct net_session_s*));
            reactor->waitclose_list = ox_stack_new(1024, sizeof(struct net_session_s*));
            reactor->thread = NULL;
            reactor->thread = ox_thread_new(reactor_thread, reactor);
        }
    }

    return mgr;
}
Example #2
0
struct connection_s*
ox_connection_new(int rdsize, int sdsize, pfn_check_packet check, pfn_packet_handle handle, void* ext)
{
    struct connection_s* ret = (struct connection_s*)malloc(sizeof(*ret));
    if(ret != NULL)
    {
        ret->fd = SOCKET_ERROR;
        ret->status = connection_none;
        ret->fdset = ox_fdset_new();

        ret->send_buffer = ox_buffer_new(sdsize);

        ret->sendmsg_list = ox_rwlist_new(DF_LIST_SIZE, sizeof(struct msg_data_s*), DF_RWLIST_PENDING_NUM);
        ret->free_sendmsg_list = ox_rwlist_new(DF_LIST_SIZE, sizeof(struct msg_data_s*), DF_RWLIST_PENDING_NUM);

        ret->recv_buffer = ox_buffer_new(rdsize);

        ret->netmsg_list = ox_rwlist_new(DF_LIST_SIZE, sizeof(struct msg_data_s*), DF_RWLIST_PENDING_NUM);
        ret->free_netmsg_list = ox_rwlist_new(DF_LIST_SIZE, sizeof(struct msg_data_s*), DF_RWLIST_PENDING_NUM);

        ret->proc_list = ox_rwlist_new(PROC_LIST_SIZE, sizeof(struct msg_data_s*), DF_RWLIST_PENDING_NUM);

        ret->check = check;
        ret->handle = handle;

        ret->ext = ext;
        ret->writable = true;

        #ifdef CONNECTION_SEND_CHECK
        ret->current_msg_id = 0;
        ret->last_send_msg_id = 0;
        #endif
    }

    return ret;
}