⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ngx_kqueue_module.c

📁 Nginx ("engine x") 是一个高性能的 HTTP 和 反向代理 服务器
💻 C
📖 第 1 页 / 共 2 页
字号:
    }    if (flags & NGX_DISABLE_EVENT) {        ev->disabled = 1;    }    rc = ngx_kqueue_set_event(ev, event,                           flags & NGX_DISABLE_EVENT ? EV_DISABLE : EV_DELETE);    ngx_mutex_unlock(list_mutex);    return rc;}static ngx_int_tngx_kqueue_set_event(ngx_event_t *ev, ngx_int_t filter, ngx_uint_t flags){    struct kevent     *kev;    struct timespec    ts;    ngx_connection_t  *c;    c = ev->data;    ngx_log_debug3(NGX_LOG_DEBUG_EVENT, ev->log, 0,                   "kevent set event: %d: ft:%i fl:%04Xi",                   c->fd, filter, flags);    if (nchanges >= max_changes) {        ngx_log_error(NGX_LOG_WARN, ev->log, 0,                      "kqueue change list is filled up");        ts.tv_sec = 0;        ts.tv_nsec = 0;        if (kevent(ngx_kqueue, change_list, (int) nchanges, NULL, 0, &ts)            == -1)        {            ngx_log_error(NGX_LOG_ALERT, ev->log, ngx_errno, "kevent() failed");            return NGX_ERROR;        }        nchanges = 0;    }    kev = &change_list[nchanges];    kev->ident = c->fd;    kev->filter = (short) filter;    kev->flags = (u_short) flags;    kev->udata = NGX_KQUEUE_UDATA_T ((uintptr_t) ev | ev->instance);    if (filter == EVFILT_VNODE) {        kev->fflags = NOTE_DELETE|NOTE_WRITE|NOTE_EXTEND                                 |NOTE_ATTRIB|NOTE_RENAME#if (__FreeBSD__ == 4 && __FreeBSD_version >= 430000) \    || __FreeBSD_version >= 500018                                 |NOTE_REVOKE#endif                                       ;        kev->data = 0;    } else {#if (NGX_HAVE_LOWAT_EVENT)        if (flags & NGX_LOWAT_EVENT) {            kev->fflags = NOTE_LOWAT;            kev->data = ev->available;        } else {            kev->fflags = 0;            kev->data = 0;        }#else        kev->fflags = 0;        kev->data = 0;#endif    }    ev->index = nchanges;    nchanges++;    return NGX_OK;}static ngx_int_tngx_kqueue_process_events(ngx_cycle_t *cycle, ngx_msec_t timer,    ngx_uint_t flags){    int               events, n;    ngx_int_t         i, instance;    ngx_uint_t        level;    ngx_err_t         err;    ngx_event_t      *ev, **queue;    struct timespec   ts, *tp;    if (ngx_threaded) {        if (ngx_kqueue_process_changes(cycle, 0) == NGX_ERROR) {            return NGX_ERROR;        }        n = 0;    } else {        n = (int) nchanges;        nchanges = 0;    }    if (timer == NGX_TIMER_INFINITE) {        tp = NULL;    } else {        ts.tv_sec = timer / 1000;        ts.tv_nsec = (timer % 1000) * 1000000;        /*         * 64-bit Darwin kernel has the bug: kernel level ts.tv_nsec is         * the int32_t while user level ts.tv_nsec is the long (64-bit),         * so on the big endian PowerPC all nanoseconds are lost.         */#if (NGX_DARWIN_KEVENT_BUG)        ts.tv_nsec <<= 32;#endif        tp = &ts;    }    ngx_log_debug2(NGX_LOG_DEBUG_EVENT, cycle->log, 0,                   "kevent timer: %M, changes: %d", timer, n);    events = kevent(ngx_kqueue, change_list, n, event_list, (int) nevents, tp);    if (events == -1) {        err = ngx_errno;    } else {        err = 0;    }    if (flags & NGX_UPDATE_TIME) {        ngx_time_update(0, 0);    }    ngx_log_debug1(NGX_LOG_DEBUG_EVENT, cycle->log, 0,                   "kevent events: %d", events);    if (err) {        if (err == NGX_EINTR) {            if (ngx_event_timer_alarm) {                ngx_event_timer_alarm = 0;                return NGX_OK;            }            level = NGX_LOG_INFO;        } else {            level = NGX_LOG_ALERT;        }        ngx_log_error(level, cycle->log, err, "kevent() failed");        return NGX_ERROR;    }    if (events == 0) {        if (timer != NGX_TIMER_INFINITE) {            return NGX_OK;        }        ngx_log_error(NGX_LOG_ALERT, cycle->log, 0,                      "kevent() returned no events without timeout");        return NGX_ERROR;    }    ngx_mutex_lock(ngx_posted_events_mutex);    for (i = 0; i < events; i++) {        ngx_kqueue_dump_event(cycle->log, &event_list[i]);        if (event_list[i].flags & EV_ERROR) {            ngx_log_error(NGX_LOG_ALERT, cycle->log, event_list[i].data,                          "kevent() error on %d filter:%d flags:%04Xd",                          event_list[i].ident, event_list[i].filter,                          event_list[i].flags);            continue;        }#if (NGX_HAVE_TIMER_EVENT)        if (event_list[i].filter == EVFILT_TIMER) {            ngx_time_update(0, 0);            continue;        }#endif        ev = (ngx_event_t *) event_list[i].udata;        switch (event_list[i].filter) {        case EVFILT_READ:        case EVFILT_WRITE:            instance = (uintptr_t) ev & 1;            ev = (ngx_event_t *) ((uintptr_t) ev & (uintptr_t) ~1);            if (ev->closed || ev->instance != instance) {                /*                 * the stale event from a file descriptor                 * that was just closed in this iteration                 */                ngx_log_debug1(NGX_LOG_DEBUG_EVENT, cycle->log, 0,                               "kevent: stale event %p", ev);                continue;            }            if (ev->log && (ev->log->log_level & NGX_LOG_DEBUG_CONNECTION)) {                ngx_kqueue_dump_event(ev->log, &event_list[i]);            }            if (ev->oneshot) {                ev->active = 0;            }#if (NGX_THREADS)            if ((flags & NGX_POST_THREAD_EVENTS) && !ev->accept) {                ev->posted_ready = 1;                ev->posted_available = event_list[i].data;                if (event_list[i].flags & EV_EOF) {                    ev->posted_eof = 1;                    ev->posted_errno = event_list[i].fflags;                }                ngx_locked_post_event(ev, &ngx_posted_events);                continue;            }#endif            ev->available = event_list[i].data;            if (event_list[i].flags & EV_EOF) {                ev->pending_eof = 1;                ev->kq_errno = event_list[i].fflags;            }            ev->ready = 1;            break;        case EVFILT_VNODE:            ev->kq_vnode = 1;            break;        case EVFILT_AIO:            ev->complete = 1;            ev->ready = 1;            break;        default:            ngx_log_error(NGX_LOG_ALERT, cycle->log, 0,                          "unexpected kevent() filter %d",                          event_list[i].filter);            continue;        }        if (flags & NGX_POST_EVENTS) {            queue = (ngx_event_t **) (ev->accept ? &ngx_posted_accept_events:                                                   &ngx_posted_events);            ngx_locked_post_event(ev, queue);            continue;        }        ev->handler(ev);    }    ngx_mutex_unlock(ngx_posted_events_mutex);    return NGX_OK;}static ngx_int_tngx_kqueue_process_changes(ngx_cycle_t *cycle, ngx_uint_t try){    int               n;    ngx_int_t         rc;    ngx_err_t         err;    struct timespec   ts;    struct kevent    *changes;    ngx_mutex_lock(kevent_mutex);    ngx_mutex_lock(list_mutex);    if (nchanges == 0) {        ngx_mutex_unlock(list_mutex);        ngx_mutex_unlock(kevent_mutex);        return NGX_OK;    }    changes = change_list;    if (change_list == change_list0) {        change_list = change_list1;    } else {        change_list = change_list0;    }    n = (int) nchanges;    nchanges = 0;    ngx_mutex_unlock(list_mutex);    ts.tv_sec = 0;    ts.tv_nsec = 0;    ngx_log_debug1(NGX_LOG_DEBUG_EVENT, cycle->log, 0,                   "kevent changes: %d", n);    if (kevent(ngx_kqueue, changes, n, NULL, 0, &ts) == -1) {        err = ngx_errno;        ngx_log_error((err == NGX_EINTR) ? NGX_LOG_INFO : NGX_LOG_ALERT,                      cycle->log, err, "kevent() failed");        rc = NGX_ERROR;    } else {        rc = NGX_OK;    }    ngx_mutex_unlock(kevent_mutex);    return rc;}static ngx_inline voidngx_kqueue_dump_event(ngx_log_t *log, struct kevent *kev){    ngx_log_debug6(NGX_LOG_DEBUG_EVENT, log, 0,                   (kev->ident > 0x8000000 && kev->ident != (unsigned) -1) ?                    "kevent: %p: ft:%d fl:%04Xd ff:%08Xd d:%d ud:%p":                    "kevent: %d: ft:%d fl:%04Xd ff:%08Xd d:%d ud:%p",                    kev->ident, kev->filter,                    kev->flags, kev->fflags,                    kev->data, kev->udata);}static void *ngx_kqueue_create_conf(ngx_cycle_t *cycle){    ngx_kqueue_conf_t  *kcf;    kcf = ngx_palloc(cycle->pool, sizeof(ngx_kqueue_conf_t));    if (kcf == NULL) {        return NGX_CONF_ERROR;    }    kcf->changes = NGX_CONF_UNSET;    kcf->events = NGX_CONF_UNSET;    return kcf;}static char *ngx_kqueue_init_conf(ngx_cycle_t *cycle, void *conf){    ngx_kqueue_conf_t *kcf = conf;    ngx_conf_init_uint_value(kcf->changes, 512);    ngx_conf_init_uint_value(kcf->events, 512);    return NGX_CONF_OK;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -