1251875Speter/* Licensed to the Apache Software Foundation (ASF) under one or more 2251875Speter * contributor license agreements. See the NOTICE file distributed with 3251875Speter * this work for additional information regarding copyright ownership. 4251875Speter * The ASF licenses this file to You under the Apache License, Version 2.0 5251875Speter * (the "License"); you may not use this file except in compliance with 6251875Speter * the License. You may obtain a copy of the License at 7251875Speter * 8251875Speter * http://www.apache.org/licenses/LICENSE-2.0 9251875Speter * 10251875Speter * Unless required by applicable law or agreed to in writing, software 11251875Speter * distributed under the License is distributed on an "AS IS" BASIS, 12251875Speter * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13251875Speter * See the License for the specific language governing permissions and 14251875Speter * limitations under the License. 15251875Speter */ 16251875Speter 17251875Speter#ifndef APR_ARCH_POLL_PRIVATE_H 18251875Speter#define APR_ARCH_POLL_PRIVATE_H 19251875Speter 20251875Speter#if HAVE_POLL_H 21251875Speter#include <poll.h> 22251875Speter#endif 23251875Speter 24251875Speter#if HAVE_SYS_POLL_H 25251875Speter#include <sys/poll.h> 26251875Speter#endif 27251875Speter 28251875Speter#ifdef HAVE_PORT_CREATE 29251875Speter#include <port.h> 30251875Speter#include <sys/port_impl.h> 31251875Speter#endif 32251875Speter 33251875Speter#ifdef HAVE_KQUEUE 34251875Speter#include <sys/types.h> 35251875Speter#include <sys/event.h> 36251875Speter#include <sys/time.h> 37251875Speter#endif 38251875Speter 39251875Speter#ifdef HAVE_EPOLL 40251875Speter#include <sys/epoll.h> 41251875Speter#endif 42251875Speter 43251875Speter#ifdef NETWARE 44251875Speter#define HAS_SOCKETS(dt) (dt == APR_POLL_SOCKET) ? 1 : 0 45251875Speter#define HAS_PIPES(dt) (dt == APR_POLL_FILE) ? 1 : 0 46251875Speter#endif 47251875Speter 48251875Speter/* Choose the best method platform specific to use in apr_pollset */ 49251875Speter#ifdef HAVE_KQUEUE 50251875Speter#define POLLSET_USES_KQUEUE 51251875Speter#define POLLSET_DEFAULT_METHOD APR_POLLSET_KQUEUE 52251875Speter#elif defined(HAVE_PORT_CREATE) 53251875Speter#define POLLSET_USES_PORT 54251875Speter#define POLLSET_DEFAULT_METHOD APR_POLLSET_PORT 55251875Speter#elif defined(HAVE_EPOLL) 56251875Speter#define POLLSET_USES_EPOLL 57251875Speter#define POLLSET_DEFAULT_METHOD APR_POLLSET_EPOLL 58251875Speter#elif defined(HAVE_POLL) 59251875Speter#define POLLSET_USES_POLL 60251875Speter#define POLLSET_DEFAULT_METHOD APR_POLLSET_POLL 61251875Speter#else 62251875Speter#define POLLSET_USES_SELECT 63251875Speter#define POLLSET_DEFAULT_METHOD APR_POLLSET_SELECT 64251875Speter#endif 65251875Speter 66251875Speter#ifdef WIN32 67251875Speter#define POLL_USES_SELECT 68251875Speter#undef POLLSET_DEFAULT_METHOD 69251875Speter#define POLLSET_DEFAULT_METHOD APR_POLLSET_SELECT 70251875Speter#else 71251875Speter#ifdef HAVE_POLL 72251875Speter#define POLL_USES_POLL 73251875Speter#else 74251875Speter#define POLL_USES_SELECT 75251875Speter#endif 76251875Speter#endif 77251875Speter 78251875Speter#if defined(POLLSET_USES_KQUEUE) || defined(POLLSET_USES_EPOLL) || defined(POLLSET_USES_PORT) 79251875Speter 80251875Speter#include "apr_ring.h" 81251875Speter 82251875Speter#if APR_HAS_THREADS 83251875Speter#include "apr_thread_mutex.h" 84251875Speter#define pollset_lock_rings() \ 85251875Speter if (pollset->flags & APR_POLLSET_THREADSAFE) \ 86251875Speter apr_thread_mutex_lock(pollset->p->ring_lock); 87251875Speter#define pollset_unlock_rings() \ 88251875Speter if (pollset->flags & APR_POLLSET_THREADSAFE) \ 89251875Speter apr_thread_mutex_unlock(pollset->p->ring_lock); 90251875Speter#else 91251875Speter#define pollset_lock_rings() 92251875Speter#define pollset_unlock_rings() 93251875Speter#endif 94251875Speter 95251875Spetertypedef struct pfd_elem_t pfd_elem_t; 96251875Speter 97251875Speterstruct pfd_elem_t { 98251875Speter APR_RING_ENTRY(pfd_elem_t) link; 99251875Speter apr_pollfd_t pfd; 100251875Speter#ifdef HAVE_PORT_CREATE 101251875Speter int on_query_ring; 102251875Speter#endif 103251875Speter}; 104251875Speter 105251875Speter#endif 106251875Speter 107251875Spetertypedef struct apr_pollset_private_t apr_pollset_private_t; 108251875Spetertypedef struct apr_pollset_provider_t apr_pollset_provider_t; 109251875Spetertypedef struct apr_pollcb_provider_t apr_pollcb_provider_t; 110251875Speterstruct apr_pollset_t 111251875Speter{ 112251875Speter apr_pool_t *pool; 113251875Speter apr_uint32_t nelts; 114251875Speter apr_uint32_t nalloc; 115251875Speter apr_uint32_t flags; 116251875Speter /* Pipe descriptors used for wakeup */ 117251875Speter apr_file_t *wakeup_pipe[2]; 118251875Speter apr_pollfd_t wakeup_pfd; 119251875Speter apr_pollset_private_t *p; 120251875Speter apr_pollset_provider_t *provider; 121251875Speter}; 122251875Speter 123251875Spetertypedef union { 124251875Speter#if defined(HAVE_EPOLL) 125251875Speter struct epoll_event *epoll; 126251875Speter#endif 127251875Speter#if defined(HAVE_PORT_CREATE) 128251875Speter port_event_t *port; 129251875Speter#endif 130251875Speter#if defined(HAVE_KQUEUE) 131251875Speter struct kevent *ke; 132251875Speter#endif 133251875Speter#if defined(HAVE_POLL) 134251875Speter struct pollfd *ps; 135251875Speter#endif 136251875Speter void *undef; 137251875Speter} apr_pollcb_pset; 138251875Speter 139251875Speterstruct apr_pollcb_t { 140251875Speter apr_pool_t *pool; 141251875Speter apr_uint32_t nelts; 142251875Speter apr_uint32_t nalloc; 143251875Speter int fd; 144251875Speter apr_pollcb_pset pollset; 145251875Speter apr_pollfd_t **copyset; 146251875Speter apr_pollcb_provider_t *provider; 147251875Speter}; 148251875Speter 149251875Speterstruct apr_pollset_provider_t { 150251875Speter apr_status_t (*create)(apr_pollset_t *, apr_uint32_t, apr_pool_t *, apr_uint32_t); 151251875Speter apr_status_t (*add)(apr_pollset_t *, const apr_pollfd_t *); 152251875Speter apr_status_t (*remove)(apr_pollset_t *, const apr_pollfd_t *); 153251875Speter apr_status_t (*poll)(apr_pollset_t *, apr_interval_time_t, apr_int32_t *, const apr_pollfd_t **); 154251875Speter apr_status_t (*cleanup)(apr_pollset_t *); 155251875Speter const char *name; 156251875Speter}; 157251875Speter 158251875Speterstruct apr_pollcb_provider_t { 159251875Speter apr_status_t (*create)(apr_pollcb_t *, apr_uint32_t, apr_pool_t *, apr_uint32_t); 160251875Speter apr_status_t (*add)(apr_pollcb_t *, apr_pollfd_t *); 161251875Speter apr_status_t (*remove)(apr_pollcb_t *, apr_pollfd_t *); 162251875Speter apr_status_t (*poll)(apr_pollcb_t *, apr_interval_time_t, apr_pollcb_cb_t, void *); 163251875Speter const char *name; 164251875Speter}; 165251875Speter 166251875Speter/* Private functions */ 167251875Spetervoid apr_pollset_drain_wakeup_pipe(apr_pollset_t *pollset); 168251875Speter 169251875Speter#endif /* APR_ARCH_POLL_PRIVATE_H */ 170