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 48269847Speter#if defined(HAVE_AIO_H) && defined(HAVE_AIO_MSGQ) 49269847Speter#define _AIO_OS390 /* enable a bunch of z/OS aio.h definitions */ 50269847Speter#include <aio.h> /* aiocb */ 51269847Speter#endif 52269847Speter 53251875Speter/* Choose the best method platform specific to use in apr_pollset */ 54251875Speter#ifdef HAVE_KQUEUE 55251875Speter#define POLLSET_USES_KQUEUE 56251875Speter#define POLLSET_DEFAULT_METHOD APR_POLLSET_KQUEUE 57251875Speter#elif defined(HAVE_PORT_CREATE) 58251875Speter#define POLLSET_USES_PORT 59251875Speter#define POLLSET_DEFAULT_METHOD APR_POLLSET_PORT 60251875Speter#elif defined(HAVE_EPOLL) 61251875Speter#define POLLSET_USES_EPOLL 62251875Speter#define POLLSET_DEFAULT_METHOD APR_POLLSET_EPOLL 63269847Speter#elif defined(HAVE_AIO_MSGQ) 64269847Speter#define POLLSET_USES_AIO_MSGQ 65269847Speter#define POLLSET_DEFAULT_METHOD APR_POLLSET_AIO_MSGQ 66251875Speter#elif defined(HAVE_POLL) 67251875Speter#define POLLSET_USES_POLL 68251875Speter#define POLLSET_DEFAULT_METHOD APR_POLLSET_POLL 69251875Speter#else 70251875Speter#define POLLSET_USES_SELECT 71251875Speter#define POLLSET_DEFAULT_METHOD APR_POLLSET_SELECT 72251875Speter#endif 73251875Speter 74251875Speter#ifdef WIN32 75251875Speter#define POLL_USES_SELECT 76251875Speter#undef POLLSET_DEFAULT_METHOD 77251875Speter#define POLLSET_DEFAULT_METHOD APR_POLLSET_SELECT 78251875Speter#else 79251875Speter#ifdef HAVE_POLL 80251875Speter#define POLL_USES_POLL 81251875Speter#else 82251875Speter#define POLL_USES_SELECT 83251875Speter#endif 84251875Speter#endif 85251875Speter 86269847Speter#if defined(POLLSET_USES_KQUEUE) || defined(POLLSET_USES_EPOLL) || defined(POLLSET_USES_PORT) || defined(POLLSET_USES_AIO_MSGQ) 87251875Speter 88251875Speter#include "apr_ring.h" 89251875Speter 90251875Speter#if APR_HAS_THREADS 91251875Speter#include "apr_thread_mutex.h" 92251875Speter#define pollset_lock_rings() \ 93251875Speter if (pollset->flags & APR_POLLSET_THREADSAFE) \ 94251875Speter apr_thread_mutex_lock(pollset->p->ring_lock); 95251875Speter#define pollset_unlock_rings() \ 96251875Speter if (pollset->flags & APR_POLLSET_THREADSAFE) \ 97251875Speter apr_thread_mutex_unlock(pollset->p->ring_lock); 98251875Speter#else 99251875Speter#define pollset_lock_rings() 100251875Speter#define pollset_unlock_rings() 101251875Speter#endif 102251875Speter 103251875Spetertypedef struct pfd_elem_t pfd_elem_t; 104251875Speter 105251875Speterstruct pfd_elem_t { 106251875Speter APR_RING_ENTRY(pfd_elem_t) link; 107251875Speter apr_pollfd_t pfd; 108251875Speter#ifdef HAVE_PORT_CREATE 109251875Speter int on_query_ring; 110251875Speter#endif 111251875Speter}; 112251875Speter 113251875Speter#endif 114251875Speter 115251875Spetertypedef struct apr_pollset_private_t apr_pollset_private_t; 116251875Spetertypedef struct apr_pollset_provider_t apr_pollset_provider_t; 117251875Spetertypedef struct apr_pollcb_provider_t apr_pollcb_provider_t; 118269847Speter 119251875Speterstruct apr_pollset_t 120251875Speter{ 121251875Speter apr_pool_t *pool; 122251875Speter apr_uint32_t nelts; 123251875Speter apr_uint32_t nalloc; 124251875Speter apr_uint32_t flags; 125251875Speter /* Pipe descriptors used for wakeup */ 126251875Speter apr_file_t *wakeup_pipe[2]; 127251875Speter apr_pollfd_t wakeup_pfd; 128251875Speter apr_pollset_private_t *p; 129251875Speter apr_pollset_provider_t *provider; 130251875Speter}; 131251875Speter 132251875Spetertypedef union { 133251875Speter#if defined(HAVE_EPOLL) 134251875Speter struct epoll_event *epoll; 135251875Speter#endif 136251875Speter#if defined(HAVE_PORT_CREATE) 137251875Speter port_event_t *port; 138251875Speter#endif 139251875Speter#if defined(HAVE_KQUEUE) 140251875Speter struct kevent *ke; 141251875Speter#endif 142251875Speter#if defined(HAVE_POLL) 143251875Speter struct pollfd *ps; 144251875Speter#endif 145251875Speter void *undef; 146251875Speter} apr_pollcb_pset; 147251875Speter 148251875Speterstruct apr_pollcb_t { 149251875Speter apr_pool_t *pool; 150251875Speter apr_uint32_t nelts; 151251875Speter apr_uint32_t nalloc; 152251875Speter int fd; 153251875Speter apr_pollcb_pset pollset; 154251875Speter apr_pollfd_t **copyset; 155251875Speter apr_pollcb_provider_t *provider; 156251875Speter}; 157251875Speter 158251875Speterstruct apr_pollset_provider_t { 159251875Speter apr_status_t (*create)(apr_pollset_t *, apr_uint32_t, apr_pool_t *, apr_uint32_t); 160251875Speter apr_status_t (*add)(apr_pollset_t *, const apr_pollfd_t *); 161251875Speter apr_status_t (*remove)(apr_pollset_t *, const apr_pollfd_t *); 162251875Speter apr_status_t (*poll)(apr_pollset_t *, apr_interval_time_t, apr_int32_t *, const apr_pollfd_t **); 163251875Speter apr_status_t (*cleanup)(apr_pollset_t *); 164251875Speter const char *name; 165251875Speter}; 166251875Speter 167251875Speterstruct apr_pollcb_provider_t { 168251875Speter apr_status_t (*create)(apr_pollcb_t *, apr_uint32_t, apr_pool_t *, apr_uint32_t); 169251875Speter apr_status_t (*add)(apr_pollcb_t *, apr_pollfd_t *); 170251875Speter apr_status_t (*remove)(apr_pollcb_t *, apr_pollfd_t *); 171251875Speter apr_status_t (*poll)(apr_pollcb_t *, apr_interval_time_t, apr_pollcb_cb_t, void *); 172251875Speter const char *name; 173251875Speter}; 174251875Speter 175251875Speter/* Private functions */ 176251875Spetervoid apr_pollset_drain_wakeup_pipe(apr_pollset_t *pollset); 177251875Speter 178251875Speter#endif /* APR_ARCH_POLL_PRIVATE_H */ 179