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_POLL_H
18251875Speter#define APR_POLL_H
19251875Speter/**
20251875Speter * @file apr_poll.h
21251875Speter * @brief APR Poll interface
22251875Speter */
23251875Speter#include "apr.h"
24251875Speter#include "apr_pools.h"
25251875Speter#include "apr_errno.h"
26251875Speter#include "apr_inherit.h"
27251875Speter#include "apr_file_io.h"
28251875Speter#include "apr_network_io.h"
29251875Speter
30251875Speter#if APR_HAVE_NETINET_IN_H
31251875Speter#include <netinet/in.h>
32251875Speter#endif
33251875Speter
34251875Speter#ifdef __cplusplus
35251875Speterextern "C" {
36251875Speter#endif /* __cplusplus */
37251875Speter
38251875Speter/**
39251875Speter * @defgroup apr_poll Poll Routines
40251875Speter * @ingroup APR
41251875Speter * @{
42251875Speter */
43251875Speter
44251875Speter/**
45266735Speter * @defgroup pollopts Poll options
46266735Speter * @ingroup apr_poll
47266735Speter * @{
48251875Speter */
49251875Speter#define APR_POLLIN    0x001     /**< Can read without blocking */
50251875Speter#define APR_POLLPRI   0x002     /**< Priority data available */
51251875Speter#define APR_POLLOUT   0x004     /**< Can write without blocking */
52251875Speter#define APR_POLLERR   0x010     /**< Pending error */
53251875Speter#define APR_POLLHUP   0x020     /**< Hangup occurred */
54251875Speter#define APR_POLLNVAL  0x040     /**< Descriptor invalid */
55266735Speter/** @} */
56251875Speter
57251875Speter/**
58266735Speter * @defgroup pollflags Pollset Flags
59266735Speter * @ingroup apr_poll
60266735Speter * @{
61251875Speter */
62251875Speter#define APR_POLLSET_THREADSAFE 0x001 /**< Adding or removing a descriptor is
63251875Speter                                      * thread-safe
64251875Speter                                      */
65251875Speter#define APR_POLLSET_NOCOPY     0x002 /**< Descriptors passed to apr_pollset_add()
66251875Speter                                      * are not copied
67251875Speter                                      */
68251875Speter#define APR_POLLSET_WAKEABLE   0x004 /**< Poll operations are interruptable by
69362181Sdim                                      * apr_pollset_wakeup() or apr_pollcb_wakeup()
70251875Speter                                      */
71251875Speter#define APR_POLLSET_NODEFAULT  0x010 /**< Do not try to use the default method if
72251875Speter                                      * the specified non-default method cannot be
73251875Speter                                      * used
74251875Speter                                      */
75266735Speter/** @} */
76251875Speter
77251875Speter/**
78251875Speter * Pollset Methods
79251875Speter */
80251875Spetertypedef enum {
81251875Speter    APR_POLLSET_DEFAULT,        /**< Platform default poll method */
82251875Speter    APR_POLLSET_SELECT,         /**< Poll uses select method */
83251875Speter    APR_POLLSET_KQUEUE,         /**< Poll uses kqueue method */
84251875Speter    APR_POLLSET_PORT,           /**< Poll uses Solaris event port method */
85251875Speter    APR_POLLSET_EPOLL,          /**< Poll uses epoll method */
86266735Speter    APR_POLLSET_POLL,           /**< Poll uses poll method */
87266735Speter    APR_POLLSET_AIO_MSGQ        /**< Poll uses z/OS asio method */
88251875Speter} apr_pollset_method_e;
89251875Speter
90251875Speter/** Used in apr_pollfd_t to determine what the apr_descriptor is */
91251875Spetertypedef enum {
92251875Speter    APR_NO_DESC,                /**< nothing here */
93251875Speter    APR_POLL_SOCKET,            /**< descriptor refers to a socket */
94251875Speter    APR_POLL_FILE,              /**< descriptor refers to a file */
95251875Speter    APR_POLL_LASTDESC           /**< @deprecated descriptor is the last one in the list */
96251875Speter} apr_datatype_e ;
97251875Speter
98251875Speter/** Union of either an APR file or socket. */
99251875Spetertypedef union {
100251875Speter    apr_file_t *f;              /**< file */
101251875Speter    apr_socket_t *s;            /**< socket */
102251875Speter} apr_descriptor;
103251875Speter
104251875Speter/** @see apr_pollfd_t */
105251875Spetertypedef struct apr_pollfd_t apr_pollfd_t;
106251875Speter
107251875Speter/** Poll descriptor set. */
108251875Speterstruct apr_pollfd_t {
109251875Speter    apr_pool_t *p;              /**< associated pool */
110251875Speter    apr_datatype_e desc_type;   /**< descriptor type */
111251875Speter    apr_int16_t reqevents;      /**< requested events */
112251875Speter    apr_int16_t rtnevents;      /**< returned events */
113251875Speter    apr_descriptor desc;        /**< @see apr_descriptor */
114251875Speter    void *client_data;          /**< allows app to associate context */
115251875Speter};
116251875Speter
117251875Speter
118251875Speter/* General-purpose poll API for arbitrarily large numbers of
119251875Speter * file descriptors
120251875Speter */
121251875Speter
122251875Speter/** Opaque structure used for pollset API */
123251875Spetertypedef struct apr_pollset_t apr_pollset_t;
124251875Speter
125251875Speter/**
126251875Speter * Set up a pollset object
127251875Speter * @param pollset  The pointer in which to return the newly created object
128251875Speter * @param size The maximum number of descriptors that this pollset can hold
129251875Speter * @param p The pool from which to allocate the pollset
130251875Speter * @param flags Optional flags to modify the operation of the pollset.
131251875Speter *
132251875Speter * @remark If flags contains APR_POLLSET_THREADSAFE, then a pollset is
133251875Speter *         created on which it is safe to make concurrent calls to
134251875Speter *         apr_pollset_add(), apr_pollset_remove() and apr_pollset_poll()
135251875Speter *         from separate threads.  This feature is only supported on some
136251875Speter *         platforms; the apr_pollset_create() call will fail with
137251875Speter *         APR_ENOTIMPL on platforms where it is not supported.
138251875Speter * @remark If flags contains APR_POLLSET_WAKEABLE, then a pollset is
139251875Speter *         created with an additional internal pipe object used for the
140251875Speter *         apr_pollset_wakeup() call. The actual size of pollset is
141266735Speter *         in that case @a size + 1. This feature is only supported on some
142251875Speter *         platforms; the apr_pollset_create() call will fail with
143251875Speter *         APR_ENOTIMPL on platforms where it is not supported.
144251875Speter * @remark If flags contains APR_POLLSET_NOCOPY, then the apr_pollfd_t
145251875Speter *         structures passed to apr_pollset_add() are not copied and
146251875Speter *         must have a lifetime at least as long as the pollset.
147251875Speter * @remark Some poll methods (including APR_POLLSET_KQUEUE,
148251875Speter *         APR_POLLSET_PORT, and APR_POLLSET_EPOLL) do not have a
149251875Speter *         fixed limit on the size of the pollset. For these methods,
150251875Speter *         the size parameter controls the maximum number of
151251875Speter *         descriptors that will be returned by a single call to
152251875Speter *         apr_pollset_poll().
153251875Speter */
154251875SpeterAPR_DECLARE(apr_status_t) apr_pollset_create(apr_pollset_t **pollset,
155251875Speter                                             apr_uint32_t size,
156251875Speter                                             apr_pool_t *p,
157251875Speter                                             apr_uint32_t flags);
158251875Speter
159251875Speter/**
160251875Speter * Set up a pollset object
161251875Speter * @param pollset  The pointer in which to return the newly created object
162251875Speter * @param size The maximum number of descriptors that this pollset can hold
163251875Speter * @param p The pool from which to allocate the pollset
164251875Speter * @param flags Optional flags to modify the operation of the pollset.
165251875Speter * @param method Poll method to use. See #apr_pollset_method_e.  If this
166251875Speter *         method cannot be used, the default method will be used unless the
167251875Speter *         APR_POLLSET_NODEFAULT flag has been specified.
168251875Speter *
169251875Speter * @remark If flags contains APR_POLLSET_THREADSAFE, then a pollset is
170251875Speter *         created on which it is safe to make concurrent calls to
171251875Speter *         apr_pollset_add(), apr_pollset_remove() and apr_pollset_poll()
172251875Speter *         from separate threads.  This feature is only supported on some
173251875Speter *         platforms; the apr_pollset_create_ex() call will fail with
174251875Speter *         APR_ENOTIMPL on platforms where it is not supported.
175251875Speter * @remark If flags contains APR_POLLSET_WAKEABLE, then a pollset is
176251875Speter *         created with additional internal pipe object used for the
177251875Speter *         apr_pollset_wakeup() call. The actual size of pollset is
178251875Speter *         in that case size + 1. This feature is only supported on some
179251875Speter *         platforms; the apr_pollset_create_ex() call will fail with
180251875Speter *         APR_ENOTIMPL on platforms where it is not supported.
181251875Speter * @remark If flags contains APR_POLLSET_NOCOPY, then the apr_pollfd_t
182251875Speter *         structures passed to apr_pollset_add() are not copied and
183251875Speter *         must have a lifetime at least as long as the pollset.
184251875Speter * @remark Some poll methods (including APR_POLLSET_KQUEUE,
185251875Speter *         APR_POLLSET_PORT, and APR_POLLSET_EPOLL) do not have a
186251875Speter *         fixed limit on the size of the pollset. For these methods,
187251875Speter *         the size parameter controls the maximum number of
188251875Speter *         descriptors that will be returned by a single call to
189251875Speter *         apr_pollset_poll().
190251875Speter */
191251875SpeterAPR_DECLARE(apr_status_t) apr_pollset_create_ex(apr_pollset_t **pollset,
192251875Speter                                                apr_uint32_t size,
193251875Speter                                                apr_pool_t *p,
194251875Speter                                                apr_uint32_t flags,
195251875Speter                                                apr_pollset_method_e method);
196251875Speter
197251875Speter/**
198251875Speter * Destroy a pollset object
199251875Speter * @param pollset The pollset to destroy
200251875Speter */
201251875SpeterAPR_DECLARE(apr_status_t) apr_pollset_destroy(apr_pollset_t *pollset);
202251875Speter
203251875Speter/**
204251875Speter * Add a socket or file descriptor to a pollset
205251875Speter * @param pollset The pollset to which to add the descriptor
206251875Speter * @param descriptor The descriptor to add
207251875Speter * @remark If you set client_data in the descriptor, that value
208251875Speter *         will be returned in the client_data field whenever this
209251875Speter *         descriptor is signalled in apr_pollset_poll().
210251875Speter * @remark If the pollset has been created with APR_POLLSET_THREADSAFE
211251875Speter *         and thread T1 is blocked in a call to apr_pollset_poll() for
212251875Speter *         this same pollset that is being modified via apr_pollset_add()
213251875Speter *         in thread T2, the currently executing apr_pollset_poll() call in
214251875Speter *         T1 will either: (1) automatically include the newly added descriptor
215251875Speter *         in the set of descriptors it is watching or (2) return immediately
216251875Speter *         with APR_EINTR.  Option (1) is recommended, but option (2) is
217251875Speter *         allowed for implementations where option (1) is impossible
218251875Speter *         or impractical.
219251875Speter * @remark If the pollset has been created with APR_POLLSET_NOCOPY, the
220251875Speter *         apr_pollfd_t structure referenced by descriptor will not be copied
221251875Speter *         and must have a lifetime at least as long as the pollset.
222251875Speter * @remark Do not add the same socket or file descriptor to the same pollset
223251875Speter *         multiple times, even if the requested events differ for the
224251875Speter *         different calls to apr_pollset_add().  If the events of interest
225251875Speter *         for a descriptor change, you must first remove the descriptor
226251875Speter *         from the pollset with apr_pollset_remove(), then add it again
227251875Speter *         specifying all requested events.
228251875Speter */
229251875SpeterAPR_DECLARE(apr_status_t) apr_pollset_add(apr_pollset_t *pollset,
230251875Speter                                          const apr_pollfd_t *descriptor);
231251875Speter
232251875Speter/**
233251875Speter * Remove a descriptor from a pollset
234251875Speter * @param pollset The pollset from which to remove the descriptor
235251875Speter * @param descriptor The descriptor to remove
236266735Speter * @remark If the descriptor is not found, APR_NOTFOUND is returned.
237251875Speter * @remark If the pollset has been created with APR_POLLSET_THREADSAFE
238251875Speter *         and thread T1 is blocked in a call to apr_pollset_poll() for
239251875Speter *         this same pollset that is being modified via apr_pollset_remove()
240251875Speter *         in thread T2, the currently executing apr_pollset_poll() call in
241251875Speter *         T1 will either: (1) automatically exclude the newly added descriptor
242251875Speter *         in the set of descriptors it is watching or (2) return immediately
243251875Speter *         with APR_EINTR.  Option (1) is recommended, but option (2) is
244251875Speter *         allowed for implementations where option (1) is impossible
245251875Speter *         or impractical.
246251875Speter * @remark apr_pollset_remove() cannot be used to remove a subset of requested
247251875Speter *         events for a descriptor.  The reqevents field in the apr_pollfd_t
248251875Speter *         parameter must contain the same value when removing as when adding.
249251875Speter */
250251875SpeterAPR_DECLARE(apr_status_t) apr_pollset_remove(apr_pollset_t *pollset,
251251875Speter                                             const apr_pollfd_t *descriptor);
252251875Speter
253251875Speter/**
254251875Speter * Block for activity on the descriptor(s) in a pollset
255251875Speter * @param pollset The pollset to use
256251875Speter * @param timeout The amount of time in microseconds to wait.  This is a
257251875Speter *                maximum, not a minimum.  If a descriptor is signalled, the
258251875Speter *                function will return before this time.  If timeout is
259251875Speter *                negative, the function will block until a descriptor is
260251875Speter *                signalled or until apr_pollset_wakeup() has been called.
261251875Speter * @param num Number of signalled descriptors (output parameter)
262251875Speter * @param descriptors Array of signalled descriptors (output parameter)
263251875Speter * @remark APR_EINTR will be returned if the pollset has been created with
264251875Speter *         APR_POLLSET_WAKEABLE, apr_pollset_wakeup() has been called while
265251875Speter *         waiting for activity, and there were no signalled descriptors at the
266251875Speter *         time of the wakeup call.
267251875Speter * @remark Multiple signalled conditions for the same descriptor may be reported
268251875Speter *         in one or more returned apr_pollfd_t structures, depending on the
269251875Speter *         implementation.
270251875Speter */
271251875SpeterAPR_DECLARE(apr_status_t) apr_pollset_poll(apr_pollset_t *pollset,
272251875Speter                                           apr_interval_time_t timeout,
273251875Speter                                           apr_int32_t *num,
274251875Speter                                           const apr_pollfd_t **descriptors);
275251875Speter
276251875Speter/**
277251875Speter * Interrupt the blocked apr_pollset_poll() call.
278251875Speter * @param pollset The pollset to use
279251875Speter * @remark If the pollset was not created with APR_POLLSET_WAKEABLE the
280251875Speter *         return value is APR_EINIT.
281251875Speter */
282251875SpeterAPR_DECLARE(apr_status_t) apr_pollset_wakeup(apr_pollset_t *pollset);
283251875Speter
284251875Speter/**
285251875Speter * Poll the descriptors in the poll structure
286251875Speter * @param aprset The poll structure we will be using.
287251875Speter * @param numsock The number of descriptors we are polling
288251875Speter * @param nsds The number of descriptors signalled (output parameter)
289251875Speter * @param timeout The amount of time in microseconds to wait.  This is a
290251875Speter *                maximum, not a minimum.  If a descriptor is signalled, the
291251875Speter *                function will return before this time.  If timeout is
292251875Speter *                negative, the function will block until a descriptor is
293251875Speter *                signalled or until apr_pollset_wakeup() has been called.
294251875Speter * @remark The number of descriptors signalled is returned in the third argument.
295251875Speter *         This is a blocking call, and it will not return until either a
296251875Speter *         descriptor has been signalled or the timeout has expired.
297251875Speter * @remark The rtnevents field in the apr_pollfd_t array will only be filled-
298251875Speter *         in if the return value is APR_SUCCESS.
299251875Speter */
300251875SpeterAPR_DECLARE(apr_status_t) apr_poll(apr_pollfd_t *aprset, apr_int32_t numsock,
301251875Speter                                   apr_int32_t *nsds,
302251875Speter                                   apr_interval_time_t timeout);
303251875Speter
304251875Speter/**
305251875Speter * Return a printable representation of the pollset method.
306251875Speter * @param pollset The pollset to use
307251875Speter */
308251875SpeterAPR_DECLARE(const char *) apr_pollset_method_name(apr_pollset_t *pollset);
309251875Speter
310251875Speter/**
311251875Speter * Return a printable representation of the default pollset method
312251875Speter * (APR_POLLSET_DEFAULT).
313251875Speter */
314251875SpeterAPR_DECLARE(const char *) apr_poll_method_defname(void);
315251875Speter
316266735Speter/** Opaque structure used for pollcb API */
317251875Spetertypedef struct apr_pollcb_t apr_pollcb_t;
318251875Speter
319251875Speter/**
320251875Speter * Set up a pollcb object
321251875Speter * @param pollcb  The pointer in which to return the newly created object
322251875Speter * @param size The maximum number of descriptors that a single _poll can return.
323251875Speter * @param p The pool from which to allocate the pollcb
324251875Speter * @param flags Optional flags to modify the operation of the pollcb.
325251875Speter *
326362181Sdim * @remark If flags contains APR_POLLSET_WAKEABLE, then a pollcb is
327362181Sdim *         created with an additional internal pipe object used for the
328362181Sdim *         apr_pollcb_wakeup() call. The actual size of pollcb is
329362181Sdim *         in that case @a size + 1.
330251875Speter * @remark Pollcb is only supported on some platforms; the apr_pollcb_create()
331362181Sdim *         call will fail with APR_ENOTIMPL on platforms where it is not supported.
332251875Speter */
333251875SpeterAPR_DECLARE(apr_status_t) apr_pollcb_create(apr_pollcb_t **pollcb,
334251875Speter                                            apr_uint32_t size,
335251875Speter                                            apr_pool_t *p,
336251875Speter                                            apr_uint32_t flags);
337251875Speter
338251875Speter/**
339251875Speter * Set up a pollcb object
340251875Speter * @param pollcb  The pointer in which to return the newly created object
341251875Speter * @param size The maximum number of descriptors that a single _poll can return.
342251875Speter * @param p The pool from which to allocate the pollcb
343251875Speter * @param flags Optional flags to modify the operation of the pollcb.
344251875Speter * @param method Poll method to use. See #apr_pollset_method_e.  If this
345251875Speter *         method cannot be used, the default method will be used unless the
346251875Speter *         APR_POLLSET_NODEFAULT flag has been specified.
347251875Speter *
348362181Sdim * @remark If flags contains APR_POLLSET_WAKEABLE, then a pollcb is
349362181Sdim *         created with an additional internal pipe object used for the
350362181Sdim *         apr_pollcb_wakeup() call. The actual size of pollcb is
351362181Sdim *         in that case @a size + 1.
352251875Speter * @remark Pollcb is only supported on some platforms; the apr_pollcb_create_ex()
353362181Sdim *         call will fail with APR_ENOTIMPL on platforms where it is not supported.
354251875Speter */
355251875SpeterAPR_DECLARE(apr_status_t) apr_pollcb_create_ex(apr_pollcb_t **pollcb,
356251875Speter                                               apr_uint32_t size,
357251875Speter                                               apr_pool_t *p,
358251875Speter                                               apr_uint32_t flags,
359251875Speter                                               apr_pollset_method_e method);
360251875Speter
361251875Speter/**
362251875Speter * Add a socket or file descriptor to a pollcb
363251875Speter * @param pollcb The pollcb to which to add the descriptor
364251875Speter * @param descriptor The descriptor to add
365251875Speter * @remark If you set client_data in the descriptor, that value will be
366251875Speter *         returned in the client_data field whenever this descriptor is
367251875Speter *         signalled in apr_pollcb_poll().
368251875Speter * @remark Unlike the apr_pollset API, the descriptor is not copied, and users
369251875Speter *         must retain the memory used by descriptor, as the same pointer will
370251875Speter *         be returned to them from apr_pollcb_poll.
371251875Speter * @remark Do not add the same socket or file descriptor to the same pollcb
372251875Speter *         multiple times, even if the requested events differ for the
373251875Speter *         different calls to apr_pollcb_add().  If the events of interest
374251875Speter *         for a descriptor change, you must first remove the descriptor
375251875Speter *         from the pollcb with apr_pollcb_remove(), then add it again
376251875Speter *         specifying all requested events.
377251875Speter */
378251875SpeterAPR_DECLARE(apr_status_t) apr_pollcb_add(apr_pollcb_t *pollcb,
379251875Speter                                         apr_pollfd_t *descriptor);
380251875Speter/**
381251875Speter * Remove a descriptor from a pollcb
382251875Speter * @param pollcb The pollcb from which to remove the descriptor
383251875Speter * @param descriptor The descriptor to remove
384362181Sdim * @remark If the descriptor is not found, APR_NOTFOUND is returned.
385251875Speter * @remark apr_pollcb_remove() cannot be used to remove a subset of requested
386251875Speter *         events for a descriptor.  The reqevents field in the apr_pollfd_t
387251875Speter *         parameter must contain the same value when removing as when adding.
388251875Speter */
389251875SpeterAPR_DECLARE(apr_status_t) apr_pollcb_remove(apr_pollcb_t *pollcb,
390251875Speter                                            apr_pollfd_t *descriptor);
391251875Speter
392362181Sdim/**
393362181Sdim * Function prototype for pollcb handlers
394251875Speter * @param baton Opaque baton passed into apr_pollcb_poll()
395362181Sdim * @param descriptor Contains the notification for an active descriptor.
396362181Sdim *                   The @a rtnevents member describes which events were triggered
397251875Speter *                   for this descriptor.
398362181Sdim * @remark If the pollcb handler does not return APR_SUCCESS, the apr_pollcb_poll()
399362181Sdim *         call returns with the handler's return value.
400251875Speter */
401251875Spetertypedef apr_status_t (*apr_pollcb_cb_t)(void *baton, apr_pollfd_t *descriptor);
402251875Speter
403251875Speter/**
404251875Speter * Block for activity on the descriptor(s) in a pollcb
405251875Speter * @param pollcb The pollcb to use
406251875Speter * @param timeout The amount of time in microseconds to wait.  This is a
407251875Speter *                maximum, not a minimum.  If a descriptor is signalled, the
408251875Speter *                function will return before this time.  If timeout is
409251875Speter *                negative, the function will block until a descriptor is
410362181Sdim *                signalled or until apr_pollcb_wakeup() has been called.
411251875Speter * @param func Callback function to call for each active descriptor.
412251875Speter * @param baton Opaque baton passed to the callback function.
413251875Speter * @remark Multiple signalled conditions for the same descriptor may be reported
414251875Speter *         in one or more calls to the callback function, depending on the
415251875Speter *         implementation.
416362181Sdim * @remark APR_EINTR will be returned if the pollset has been created with
417362181Sdim *         APR_POLLSET_WAKEABLE and apr_pollcb_wakeup() has been called while
418362181Sdim *         waiting for activity.
419251875Speter */
420251875SpeterAPR_DECLARE(apr_status_t) apr_pollcb_poll(apr_pollcb_t *pollcb,
421251875Speter                                          apr_interval_time_t timeout,
422251875Speter                                          apr_pollcb_cb_t func,
423362181Sdim                                          void *baton);
424251875Speter
425362181Sdim/**
426362181Sdim * Interrupt the blocked apr_pollcb_poll() call.
427362181Sdim * @param pollcb The pollcb to use
428362181Sdim * @remark If the pollcb was not created with APR_POLLSET_WAKEABLE the
429362181Sdim *         return value is APR_EINIT.
430362181Sdim */
431362181SdimAPR_DECLARE(apr_status_t) apr_pollcb_wakeup(apr_pollcb_t *pollcb);
432362181Sdim
433362181Sdim/**
434362181Sdim * Return a printable representation of the pollcb method.
435362181Sdim * @param pollcb The pollcb to use
436362181Sdim */
437362181SdimAPR_DECLARE(const char *) apr_pollcb_method_name(apr_pollcb_t *pollcb);
438362181Sdim
439251875Speter/** @} */
440251875Speter
441251875Speter#ifdef __cplusplus
442251875Speter}
443251875Speter#endif
444251875Speter
445251875Speter#endif  /* ! APR_POLL_H */
446251875Speter
447