1 /* Licensed to the Apache Software Foundation (ASF) under one or more 2 * contributor license agreements. See the NOTICE file distributed with 3 * this work for additional information regarding copyright ownership. 4 * The ASF licenses this file to You under the Apache License, Version 2.0 5 * (the "License"); you may not use this file except in compliance with 6 * the License. You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 #ifndef APR_ARCH_POLL_PRIVATE_H 18 #define APR_ARCH_POLL_PRIVATE_H 19 20 #if HAVE_POLL_H 21 #include <poll.h> 22 #endif 23 24 #if HAVE_SYS_POLL_H 25 #include <sys/poll.h> 26 #endif 27 28 #ifdef HAVE_PORT_CREATE 29 #include <port.h> 30 #include <sys/port_impl.h> 31 #endif 32 33 #ifdef HAVE_KQUEUE 34 #include <sys/types.h> 35 #include <sys/event.h> 36 #include <sys/time.h> 37 #endif 38 39 #ifdef HAVE_EPOLL 40 #include <sys/epoll.h> 41 #endif 42 43 #ifdef NETWARE 44 #define HAS_SOCKETS(dt) (dt == APR_POLL_SOCKET) ? 1 : 0 45 #define HAS_PIPES(dt) (dt == APR_POLL_FILE) ? 1 : 0 46 #endif 47 48 #if defined(HAVE_AIO_H) && defined(HAVE_AIO_MSGQ) 49 #define _AIO_OS390 /* enable a bunch of z/OS aio.h definitions */ 50 #include <aio.h> /* aiocb */ 51 #endif 52 53 /* Choose the best method platform specific to use in apr_pollset */ 54 #ifdef HAVE_KQUEUE 55 #define POLLSET_USES_KQUEUE 56 #define POLLSET_DEFAULT_METHOD APR_POLLSET_KQUEUE 57 #elif defined(HAVE_PORT_CREATE) 58 #define POLLSET_USES_PORT 59 #define POLLSET_DEFAULT_METHOD APR_POLLSET_PORT 60 #elif defined(HAVE_EPOLL) 61 #define POLLSET_USES_EPOLL 62 #define POLLSET_DEFAULT_METHOD APR_POLLSET_EPOLL 63 #elif defined(HAVE_AIO_MSGQ) 64 #define POLLSET_USES_AIO_MSGQ 65 #define POLLSET_DEFAULT_METHOD APR_POLLSET_AIO_MSGQ 66 #elif defined(HAVE_POLL) 67 #define POLLSET_USES_POLL 68 #define POLLSET_DEFAULT_METHOD APR_POLLSET_POLL 69 #else 70 #define POLLSET_USES_SELECT 71 #define POLLSET_DEFAULT_METHOD APR_POLLSET_SELECT 72 #endif 73 74 #ifdef WIN32 75 #define POLL_USES_SELECT 76 #undef POLLSET_DEFAULT_METHOD 77 #define POLLSET_DEFAULT_METHOD APR_POLLSET_SELECT 78 #else 79 #ifdef HAVE_POLL 80 #define POLL_USES_POLL 81 #else 82 #define POLL_USES_SELECT 83 #endif 84 #endif 85 86 #if defined(POLLSET_USES_KQUEUE) || defined(POLLSET_USES_EPOLL) || defined(POLLSET_USES_PORT) || defined(POLLSET_USES_AIO_MSGQ) 87 88 #include "apr_ring.h" 89 90 #if APR_HAS_THREADS 91 #include "apr_thread_mutex.h" 92 #define pollset_lock_rings() \ 93 if (pollset->flags & APR_POLLSET_THREADSAFE) \ 94 apr_thread_mutex_lock(pollset->p->ring_lock); 95 #define pollset_unlock_rings() \ 96 if (pollset->flags & APR_POLLSET_THREADSAFE) \ 97 apr_thread_mutex_unlock(pollset->p->ring_lock); 98 #else 99 #define pollset_lock_rings() 100 #define pollset_unlock_rings() 101 #endif 102 103 typedef struct pfd_elem_t pfd_elem_t; 104 105 struct pfd_elem_t { 106 APR_RING_ENTRY(pfd_elem_t) link; 107 apr_pollfd_t pfd; 108 #ifdef HAVE_PORT_CREATE 109 int on_query_ring; 110 #endif 111 }; 112 113 #endif 114 115 typedef struct apr_pollset_private_t apr_pollset_private_t; 116 typedef struct apr_pollset_provider_t apr_pollset_provider_t; 117 typedef struct apr_pollcb_provider_t apr_pollcb_provider_t; 118 119 struct apr_pollset_t 120 { 121 apr_pool_t *pool; 122 apr_uint32_t nelts; 123 apr_uint32_t nalloc; 124 apr_uint32_t flags; 125 /* Pipe descriptors used for wakeup */ 126 apr_file_t *wakeup_pipe[2]; 127 apr_pollfd_t wakeup_pfd; 128 apr_pollset_private_t *p; 129 apr_pollset_provider_t *provider; 130 }; 131 132 typedef union { 133 #if defined(HAVE_EPOLL) 134 struct epoll_event *epoll; 135 #endif 136 #if defined(HAVE_PORT_CREATE) 137 port_event_t *port; 138 #endif 139 #if defined(HAVE_KQUEUE) 140 struct kevent *ke; 141 #endif 142 #if defined(HAVE_POLL) 143 struct pollfd *ps; 144 #endif 145 void *undef; 146 } apr_pollcb_pset; 147 148 struct apr_pollcb_t { 149 apr_pool_t *pool; 150 apr_uint32_t nelts; 151 apr_uint32_t nalloc; 152 int fd; 153 apr_pollcb_pset pollset; 154 apr_pollfd_t **copyset; 155 apr_pollcb_provider_t *provider; 156 }; 157 158 struct apr_pollset_provider_t { 159 apr_status_t (*create)(apr_pollset_t *, apr_uint32_t, apr_pool_t *, apr_uint32_t); 160 apr_status_t (*add)(apr_pollset_t *, const apr_pollfd_t *); 161 apr_status_t (*remove)(apr_pollset_t *, const apr_pollfd_t *); 162 apr_status_t (*poll)(apr_pollset_t *, apr_interval_time_t, apr_int32_t *, const apr_pollfd_t **); 163 apr_status_t (*cleanup)(apr_pollset_t *); 164 const char *name; 165 }; 166 167 struct apr_pollcb_provider_t { 168 apr_status_t (*create)(apr_pollcb_t *, apr_uint32_t, apr_pool_t *, apr_uint32_t); 169 apr_status_t (*add)(apr_pollcb_t *, apr_pollfd_t *); 170 apr_status_t (*remove)(apr_pollcb_t *, apr_pollfd_t *); 171 apr_status_t (*poll)(apr_pollcb_t *, apr_interval_time_t, apr_pollcb_cb_t, void *); 172 const char *name; 173 }; 174 175 /* Private functions */ 176 void apr_pollset_drain_wakeup_pipe(apr_pollset_t *pollset); 177 178 #endif /* APR_ARCH_POLL_PRIVATE_H */ 179