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