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