ret_t fdpoll_kqueue_new (cherokee_fdpoll_t **fdp, int sys_fd_limit, int fd_limit) { int re; cherokee_fdpoll_t *nfd; CHEROKEE_CNEW_STRUCT (1, n, fdpoll_kqueue); nfd = FDPOLL(n); /* Init base class properties */ nfd->type = cherokee_poll_kqueue; nfd->nfiles = fd_limit; nfd->system_nfiles = sys_fd_limit; nfd->npollfds = 0; /* Init base class virtual methods */ nfd->free = (fdpoll_func_free_t) _free; nfd->add = (fdpoll_func_add_t) _add; nfd->del = (fdpoll_func_del_t) _del; nfd->reset = (fdpoll_func_reset_t) _reset; nfd->set_mode = (fdpoll_func_set_mode_t) _set_mode; nfd->check = (fdpoll_func_check_t) _check; nfd->watch = (fdpoll_func_watch_t) _watch; /* Init kqueue specific variables */ n->kqueue = -1; n->nchanges = 0; n->changelist = (struct kevent *) calloc (nfd->nfiles * 2, sizeof(struct kevent)); n->fdevents = (int *) calloc (nfd->system_nfiles, sizeof(int)); n->fdinterest = (int *) calloc (nfd->system_nfiles, sizeof(int)); if (n->fdevents == NULL || n->changelist == NULL || n->fdinterest == NULL) { _free (n); return ret_nomem; } n->kqueue = kqueue(); if (n->kqueue == -1) { _free (n); return ret_error; } re = fcntl (n->kqueue, F_SETFD, FD_CLOEXEC); if (re < 0) { LOG_ERRNO (errno, cherokee_err_error, CHEROKEE_ERROR_FDPOLL_EPOLL_CLOEXEC); _free (n); return ret_error; } /* Return the object */ *fdp = nfd; return ret_ok; }
ret_t fdpoll_win32_new (cherokee_fdpoll_t **fdp, int system_fd_limit, int fd_limit) { int i; cherokee_fdpoll_t *nfd; CHEROKEE_CNEW_STRUCT (1, n, fdpoll_select); /* Verify that the max. number of selectable fds * is below the max. acceptable limit per select set. */ if (fd_limit > FD_SETSIZE) { _free(n); return ret_error; } nfd = FDPOLL(n); /* Init base class properties */ nfd->type = cherokee_poll_win32; nfd->nfiles = fd_limit; nfd->system_nfiles = system_fd_limit; nfd->npollfds = 0; /* Init base class virtual methods */ nfd->free = (fdpoll_func_free_t) _free; nfd->add = (fdpoll_func_add_t) _add; nfd->del = (fdpoll_func_del_t) _del; nfd->reset = (fdpoll_func_reset_t) _reset; nfd->set_mode = (fdpoll_func_set_mode_t) _set_mode; nfd->check = (fdpoll_func_check_t) _check; nfd->watch = (fdpoll_func_watch_t) _watch; /* Init properties */ FD_ZERO (&n->master_rfdset); FD_ZERO (&n->master_wfdset); n->select_fds = (int*) calloc(nfd->nfiles, sizeof(int)); n->maxfd = -1; n->maxfd_recompute = 0; if (n->select_fds == NULL) { _free (n); return ret_nomem; } for (i = 0; i < nfd->nfiles; ++i) { n->select_fds[i] = -1; } *fdp = nfd; return ret_ok; }
ret_t fdpoll_port_new (cherokee_fdpoll_t **fdp, int sys_limit, int limit) { cuint_t i; cherokee_fdpoll_t *nfd; CHEROKEE_CNEW_STRUCT (1, n, fdpoll_port); nfd = FDPOLL(n); /* Init base class properties */ nfd->type = cherokee_poll_port; nfd->nfiles = limit; nfd->system_nfiles = sys_limit; nfd->npollfds = 0; /* Init base class virtual methods */ nfd->free = (fdpoll_func_free_t) _free; nfd->add = (fdpoll_func_add_t) _add; nfd->del = (fdpoll_func_del_t) _del; nfd->reset = (fdpoll_func_reset_t) _reset; nfd->set_mode = (fdpoll_func_set_mode_t) _set_mode; nfd->check = (fdpoll_func_check_t) _check; nfd->watch = (fdpoll_func_watch_t) _watch; /* Allocate data */ n->port = -1; n->port_readyfds = 0; n->port_events = (port_event_t *) calloc(nfd->nfiles, sizeof(port_event_t)); n->port_activefd = (int *) calloc(nfd->system_nfiles, sizeof(int)); if ( n->port_events == NULL || n->port_activefd == NULL ) { _free( n ); return ret_nomem; } for (i=0; i < nfd->system_nfiles; i++) { n->port_activefd[i] = -1; } if ( (n->port = port_create()) == -1 ) { _free( n ); return ret_error; } /* Return the object */ *fdp = nfd; return ret_ok; }
ret_t fdpoll_epoll_new (cherokee_fdpoll_t **fdp, int sys_fd_limit, int fd_limit) { int re; cherokee_fdpoll_t *nfd; CHEROKEE_CNEW_STRUCT (1, n, fdpoll_epoll); nfd = FDPOLL(n); /* Init base class properties */ nfd->type = cherokee_poll_epoll; nfd->nfiles = fd_limit; nfd->system_nfiles = sys_fd_limit; nfd->npollfds = 0; /* Init base class virtual methods */ nfd->free = (fdpoll_func_free_t) _free; nfd->add = (fdpoll_func_add_t) _add; nfd->del = (fdpoll_func_del_t) _del; nfd->reset = (fdpoll_func_reset_t) _reset; nfd->set_mode = (fdpoll_func_set_mode_t) _set_mode; nfd->check = (fdpoll_func_check_t) _check; nfd->watch = (fdpoll_func_watch_t) _watch; /* Look for max fd limit */ n->ep_fd = -1; n->ep_nrevents = 0; n->ep_events = (struct epoll_event *) calloc (nfd->nfiles, sizeof(struct epoll_event)); n->epoll_fd2idx = (int *) calloc (nfd->system_nfiles, sizeof(int)); /* If anyone fails free all and return ret_nomem */ if (n->ep_events == NULL || n->epoll_fd2idx == NULL) { _free(n); return ret_nomem; } for (re = 0; re < nfd->system_nfiles; re++) { n->epoll_fd2idx[re] = -1; } n->ep_fd = epoll_create (nfd->nfiles); if (n->ep_fd < 0) { /* It may fail here if the glibc library supports epoll, * but the kernel doesn't. */ #if 0 LOG_ERRNO (errno, cherokee_err_error, CHEROKEE_ERROR_FDPOLL_EPOLL_CREATE, nfd->nfiles+1); #endif _free (n); return ret_error; } re = fcntl (n->ep_fd, F_SETFD, FD_CLOEXEC); if (re < 0) { LOG_ERRNO (errno, cherokee_err_error, CHEROKEE_ERROR_FDPOLL_EPOLL_CLOEXEC); _free (n); return ret_error; } /* Return the object */ *fdp = nfd; return ret_ok; }