recherche

Maison  >  Questions et réponses  >  le corps du texte

php - Quel modèle d'événement la fonction event_* dans libevent utilise-t-elle ?

Sachez que Libevent prend en charge le modèle temporel select/poll/epoll. Aujourd'hui, il m'est soudain venu à l'esprit que la série de fonctions event_* qui encapsule les opérations sous-jacentes de libevent utilise quel type de modèle d'événement

世界只因有你世界只因有你2843 Il y a quelques jours527

répondre à tous(1)je répondrai

  • 滿天的星座

    滿天的星座2017-05-16 13:08:51

    <event.c>
    
    #ifdef HAVE_EVENT_PORTS
    extern const struct eventop evportops;
    #endif
    #ifdef HAVE_SELECT
    extern const struct eventop selectops;
    #endif
    #ifdef HAVE_POLL
    extern const struct eventop pollops;
    #endif
    #ifdef HAVE_EPOLL
    extern const struct eventop epollops;
    #endif
    #ifdef HAVE_WORKING_KQUEUE
    extern const struct eventop kqops;
    #endif
    #ifdef HAVE_DEVPOLL
    extern const struct eventop devpollops;
    #endif
    #ifdef WIN32
    extern const struct eventop win32ops;
    #endif
    
    /* In order of preference */
    static const struct eventop *eventops[] = {
    #ifdef HAVE_EVENT_PORTS
        &evportops,
    #endif
    #ifdef HAVE_WORKING_KQUEUE
        &kqops,
    #endif
    #ifdef HAVE_EPOLL
        &epollops,
    #endif
    #ifdef HAVE_DEVPOLL
        &devpollops,
    #endif
    #ifdef HAVE_POLL
        &pollops,
    #endif
    #ifdef HAVE_SELECT
        &selectops,
    #endif
    #ifdef WIN32
        &win32ops,
    #endif
        NULL
    };
    

    Selon l'ordre ci-dessus, prenez la première interface prise en charge par os, et le processus d'initialisation est le suivant :

    <event.c>
    
    struct event_base *
    event_base_new(void)
    {
    ...    
        base->evbase = NULL;
        for (i = 0; eventops[i] && !base->evbase; i++) {
            base->evsel = eventops[i];
    
            base->evbase = base->evsel->init(base);
        }
    
        if (base->evbase == NULL)
            event_errx(1, "%s: no event mechanism available", __func__);
    
        ...
    }

    Ce qui suit est le package eventop d'epoll

    epoll.c
    
    const struct eventop epollops = {
        "epoll",
        epoll_init,
        epoll_add,
        epoll_del,
        epoll_dispatch,
        epoll_dealloc,
        1 /* need reinit */
    };
    

    répondre
    0
  • Annulerrépondre