Почему нет блокировки метода select_add в 2.0.22 версии libevent?

Я изучаю код Libvent и нахожу использование блокировки в методе select_dispatch в файле select.c. Код, как следует:

EVBASE_RELEASE_LOCK(base, th_base_lock);

res = select(nfds, sop->event_readset_out, sop->event_writeset_out, NULL, tv);

EVBASE_ACQUIRE_LOCK(base, th_base_lock);

Но в методе select_addпочему нет EVBASE_RELEASE_LOCK(base, th_base_lock); а также EVBASE_ACQUIRE_LOCK(base, th_base_lock); и код как следует:

static int
select_add(struct event_base *base, int fd, short old, short events, void *p)
{
    struct selectop *sop = base->evbase;
    (void) p;

    EVUTIL_ASSERT((events & EV_SIGNAL) == 0);
    check_selectop(sop);
    /*
     * Keep track of the highest fd, so that we can calculate the size
     * of the fd_sets for select(2)
     */
    if (sop->event_fds < fd) {
        int fdsz = sop->event_fdsz;

        if (fdsz < (int)sizeof(fd_mask))
            fdsz = (int)sizeof(fd_mask);

        /* In theory we should worry about overflow here.  In
         * reality, though, the highest fd on a unixy system will
         * not overflow here. XXXX */
        while (fdsz < (int) SELECT_ALLOC_SIZE(fd + 1))
            fdsz *= 2;

        if (fdsz != sop->event_fdsz) {
            if (select_resize(sop, fdsz)) {
                check_selectop(sop);
                return (-1);
            }
        }

        sop->event_fds = fd;
    }

    if (events & EV_READ)
        FD_SET(fd, sop->event_readset_in);
    if (events & EV_WRITE)
        FD_SET(fd, sop->event_writeset_in);
    check_selectop(sop);

    return (0);
}

Я хочу знать причину, спасибо

0 ответов

Другие вопросы по тегам