Annotation of win32/apache22/srclib/apr/include/apr_poll.h, revision 1.1

1.1     ! moko        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_POLL_H
        !            18: #define APR_POLL_H
        !            19: /**
        !            20:  * @file apr_poll.h
        !            21:  * @brief APR Poll interface
        !            22:  */
        !            23: #include "apr.h"
        !            24: #include "apr_pools.h"
        !            25: #include "apr_errno.h"
        !            26: #include "apr_inherit.h" 
        !            27: #include "apr_file_io.h" 
        !            28: #include "apr_network_io.h" 
        !            29: 
        !            30: #if APR_HAVE_NETINET_IN_H
        !            31: #include <netinet/in.h>
        !            32: #endif
        !            33: 
        !            34: #ifdef __cplusplus
        !            35: extern "C" {
        !            36: #endif /* __cplusplus */
        !            37: 
        !            38: /**
        !            39:  * @defgroup apr_poll Poll Routines
        !            40:  * @ingroup APR 
        !            41:  * @{
        !            42:  */
        !            43: 
        !            44: /**
        !            45:  * Poll options
        !            46:  */
        !            47: #define APR_POLLIN    0x001     /**< Can read without blocking */
        !            48: #define APR_POLLPRI   0x002     /**< Priority data available */
        !            49: #define APR_POLLOUT   0x004     /**< Can write without blocking */
        !            50: #define APR_POLLERR   0x010     /**< Pending error */
        !            51: #define APR_POLLHUP   0x020     /**< Hangup occurred */
        !            52: #define APR_POLLNVAL  0x040     /**< Descriptor invalid */
        !            53: 
        !            54: /**
        !            55:  * Pollset Flags
        !            56:  */
        !            57: #define APR_POLLSET_THREADSAFE 0x001 /**< Adding or removing a descriptor is
        !            58:                                       * thread-safe
        !            59:                                       */
        !            60: #define APR_POLLSET_NOCOPY     0x002 /**< Descriptors passed to apr_pollset_add()
        !            61:                                       * are not copied
        !            62:                                       */
        !            63: #define APR_POLLSET_WAKEABLE   0x004 /**< Poll operations are interruptable by
        !            64:                                       * apr_pollset_wakeup()
        !            65:                                       */
        !            66: #define APR_POLLSET_NODEFAULT  0x010 /**< Do not try to use the default method if
        !            67:                                       * the specified non-default method cannot be
        !            68:                                       * used
        !            69:                                       */
        !            70: 
        !            71: /**
        !            72:  * Pollset Methods
        !            73:  */
        !            74: typedef enum {
        !            75:     APR_POLLSET_DEFAULT,        /**< Platform default poll method */
        !            76:     APR_POLLSET_SELECT,         /**< Poll uses select method */
        !            77:     APR_POLLSET_KQUEUE,         /**< Poll uses kqueue method */
        !            78:     APR_POLLSET_PORT,           /**< Poll uses Solaris event port method */
        !            79:     APR_POLLSET_EPOLL,          /**< Poll uses epoll method */
        !            80:     APR_POLLSET_POLL            /**< Poll uses poll method */
        !            81: } apr_pollset_method_e;
        !            82: 
        !            83: /** Used in apr_pollfd_t to determine what the apr_descriptor is */
        !            84: typedef enum { 
        !            85:     APR_NO_DESC,                /**< nothing here */
        !            86:     APR_POLL_SOCKET,            /**< descriptor refers to a socket */
        !            87:     APR_POLL_FILE,              /**< descriptor refers to a file */
        !            88:     APR_POLL_LASTDESC           /**< @deprecated descriptor is the last one in the list */
        !            89: } apr_datatype_e ;
        !            90: 
        !            91: /** Union of either an APR file or socket. */
        !            92: typedef union {
        !            93:     apr_file_t *f;              /**< file */
        !            94:     apr_socket_t *s;            /**< socket */
        !            95: } apr_descriptor;
        !            96: 
        !            97: /** @see apr_pollfd_t */
        !            98: typedef struct apr_pollfd_t apr_pollfd_t;
        !            99: 
        !           100: /** Poll descriptor set. */
        !           101: struct apr_pollfd_t {
        !           102:     apr_pool_t *p;              /**< associated pool */
        !           103:     apr_datatype_e desc_type;   /**< descriptor type */
        !           104:     apr_int16_t reqevents;      /**< requested events */
        !           105:     apr_int16_t rtnevents;      /**< returned events */
        !           106:     apr_descriptor desc;        /**< @see apr_descriptor */
        !           107:     void *client_data;          /**< allows app to associate context */
        !           108: };
        !           109: 
        !           110: 
        !           111: /* General-purpose poll API for arbitrarily large numbers of
        !           112:  * file descriptors
        !           113:  */
        !           114: 
        !           115: /** Opaque structure used for pollset API */
        !           116: typedef struct apr_pollset_t apr_pollset_t;
        !           117: 
        !           118: /**
        !           119:  * Set up a pollset object
        !           120:  * @param pollset  The pointer in which to return the newly created object 
        !           121:  * @param size The maximum number of descriptors that this pollset can hold
        !           122:  * @param p The pool from which to allocate the pollset
        !           123:  * @param flags Optional flags to modify the operation of the pollset.
        !           124:  *
        !           125:  * @remark If flags contains APR_POLLSET_THREADSAFE, then a pollset is
        !           126:  *         created on which it is safe to make concurrent calls to
        !           127:  *         apr_pollset_add(), apr_pollset_remove() and apr_pollset_poll()
        !           128:  *         from separate threads.  This feature is only supported on some
        !           129:  *         platforms; the apr_pollset_create() call will fail with
        !           130:  *         APR_ENOTIMPL on platforms where it is not supported.
        !           131:  * @remark If flags contains APR_POLLSET_WAKEABLE, then a pollset is
        !           132:  *         created with an additional internal pipe object used for the
        !           133:  *         apr_pollset_wakeup() call. The actual size of pollset is
        !           134:  *         in that case size + 1. This feature is only supported on some
        !           135:  *         platforms; the apr_pollset_create() call will fail with
        !           136:  *         APR_ENOTIMPL on platforms where it is not supported.
        !           137:  * @remark If flags contains APR_POLLSET_NOCOPY, then the apr_pollfd_t
        !           138:  *         structures passed to apr_pollset_add() are not copied and
        !           139:  *         must have a lifetime at least as long as the pollset.
        !           140:  * @remark Some poll methods (including APR_POLLSET_KQUEUE,
        !           141:  *         APR_POLLSET_PORT, and APR_POLLSET_EPOLL) do not have a
        !           142:  *         fixed limit on the size of the pollset. For these methods,
        !           143:  *         the size parameter controls the maximum number of
        !           144:  *         descriptors that will be returned by a single call to
        !           145:  *         apr_pollset_poll().
        !           146:  */
        !           147: APR_DECLARE(apr_status_t) apr_pollset_create(apr_pollset_t **pollset,
        !           148:                                              apr_uint32_t size,
        !           149:                                              apr_pool_t *p,
        !           150:                                              apr_uint32_t flags);
        !           151: 
        !           152: /**
        !           153:  * Set up a pollset object
        !           154:  * @param pollset  The pointer in which to return the newly created object 
        !           155:  * @param size The maximum number of descriptors that this pollset can hold
        !           156:  * @param p The pool from which to allocate the pollset
        !           157:  * @param flags Optional flags to modify the operation of the pollset.
        !           158:  * @param method Poll method to use. See #apr_pollset_method_e.  If this
        !           159:  *         method cannot be used, the default method will be used unless the
        !           160:  *         APR_POLLSET_NODEFAULT flag has been specified.
        !           161:  *
        !           162:  * @remark If flags contains APR_POLLSET_THREADSAFE, then a pollset is
        !           163:  *         created on which it is safe to make concurrent calls to
        !           164:  *         apr_pollset_add(), apr_pollset_remove() and apr_pollset_poll()
        !           165:  *         from separate threads.  This feature is only supported on some
        !           166:  *         platforms; the apr_pollset_create_ex() call will fail with
        !           167:  *         APR_ENOTIMPL on platforms where it is not supported.
        !           168:  * @remark If flags contains APR_POLLSET_WAKEABLE, then a pollset is
        !           169:  *         created with additional internal pipe object used for the
        !           170:  *         apr_pollset_wakeup() call. The actual size of pollset is
        !           171:  *         in that case size + 1. This feature is only supported on some
        !           172:  *         platforms; the apr_pollset_create_ex() call will fail with
        !           173:  *         APR_ENOTIMPL on platforms where it is not supported.
        !           174:  * @remark If flags contains APR_POLLSET_NOCOPY, then the apr_pollfd_t
        !           175:  *         structures passed to apr_pollset_add() are not copied and
        !           176:  *         must have a lifetime at least as long as the pollset.
        !           177:  * @remark Some poll methods (including APR_POLLSET_KQUEUE,
        !           178:  *         APR_POLLSET_PORT, and APR_POLLSET_EPOLL) do not have a
        !           179:  *         fixed limit on the size of the pollset. For these methods,
        !           180:  *         the size parameter controls the maximum number of
        !           181:  *         descriptors that will be returned by a single call to
        !           182:  *         apr_pollset_poll().
        !           183:  */
        !           184: APR_DECLARE(apr_status_t) apr_pollset_create_ex(apr_pollset_t **pollset,
        !           185:                                                 apr_uint32_t size,
        !           186:                                                 apr_pool_t *p,
        !           187:                                                 apr_uint32_t flags,
        !           188:                                                 apr_pollset_method_e method);
        !           189: 
        !           190: /**
        !           191:  * Destroy a pollset object
        !           192:  * @param pollset The pollset to destroy
        !           193:  */
        !           194: APR_DECLARE(apr_status_t) apr_pollset_destroy(apr_pollset_t *pollset);
        !           195: 
        !           196: /**
        !           197:  * Add a socket or file descriptor to a pollset
        !           198:  * @param pollset The pollset to which to add the descriptor
        !           199:  * @param descriptor The descriptor to add
        !           200:  * @remark If you set client_data in the descriptor, that value
        !           201:  *         will be returned in the client_data field whenever this
        !           202:  *         descriptor is signalled in apr_pollset_poll().
        !           203:  * @remark If the pollset has been created with APR_POLLSET_THREADSAFE
        !           204:  *         and thread T1 is blocked in a call to apr_pollset_poll() for
        !           205:  *         this same pollset that is being modified via apr_pollset_add()
        !           206:  *         in thread T2, the currently executing apr_pollset_poll() call in
        !           207:  *         T1 will either: (1) automatically include the newly added descriptor
        !           208:  *         in the set of descriptors it is watching or (2) return immediately
        !           209:  *         with APR_EINTR.  Option (1) is recommended, but option (2) is
        !           210:  *         allowed for implementations where option (1) is impossible
        !           211:  *         or impractical.
        !           212:  * @remark If the pollset has been created with APR_POLLSET_NOCOPY, the 
        !           213:  *         apr_pollfd_t structure referenced by descriptor will not be copied
        !           214:  *         and must have a lifetime at least as long as the pollset.
        !           215:  * @remark Do not add the same socket or file descriptor to the same pollset
        !           216:  *         multiple times, even if the requested events differ for the 
        !           217:  *         different calls to apr_pollset_add().  If the events of interest
        !           218:  *         for a descriptor change, you must first remove the descriptor 
        !           219:  *         from the pollset with apr_pollset_remove(), then add it again 
        !           220:  *         specifying all requested events.
        !           221:  */
        !           222: APR_DECLARE(apr_status_t) apr_pollset_add(apr_pollset_t *pollset,
        !           223:                                           const apr_pollfd_t *descriptor);
        !           224: 
        !           225: /**
        !           226:  * Remove a descriptor from a pollset
        !           227:  * @param pollset The pollset from which to remove the descriptor
        !           228:  * @param descriptor The descriptor to remove
        !           229:  * @remark If the pollset has been created with APR_POLLSET_THREADSAFE
        !           230:  *         and thread T1 is blocked in a call to apr_pollset_poll() for
        !           231:  *         this same pollset that is being modified via apr_pollset_remove()
        !           232:  *         in thread T2, the currently executing apr_pollset_poll() call in
        !           233:  *         T1 will either: (1) automatically exclude the newly added descriptor
        !           234:  *         in the set of descriptors it is watching or (2) return immediately
        !           235:  *         with APR_EINTR.  Option (1) is recommended, but option (2) is
        !           236:  *         allowed for implementations where option (1) is impossible
        !           237:  *         or impractical.
        !           238:  * @remark apr_pollset_remove() cannot be used to remove a subset of requested
        !           239:  *         events for a descriptor.  The reqevents field in the apr_pollfd_t
        !           240:  *         parameter must contain the same value when removing as when adding.
        !           241:  */
        !           242: APR_DECLARE(apr_status_t) apr_pollset_remove(apr_pollset_t *pollset,
        !           243:                                              const apr_pollfd_t *descriptor);
        !           244: 
        !           245: /**
        !           246:  * Block for activity on the descriptor(s) in a pollset
        !           247:  * @param pollset The pollset to use
        !           248:  * @param timeout The amount of time in microseconds to wait.  This is a
        !           249:  *                maximum, not a minimum.  If a descriptor is signalled, the
        !           250:  *                function will return before this time.  If timeout is
        !           251:  *                negative, the function will block until a descriptor is
        !           252:  *                signalled or until apr_pollset_wakeup() has been called.
        !           253:  * @param num Number of signalled descriptors (output parameter)
        !           254:  * @param descriptors Array of signalled descriptors (output parameter)
        !           255:  * @remark APR_EINTR will be returned if the pollset has been created with
        !           256:  *         APR_POLLSET_WAKEABLE, apr_pollset_wakeup() has been called while
        !           257:  *         waiting for activity, and there were no signalled descriptors at the
        !           258:  *         time of the wakeup call.
        !           259:  * @remark Multiple signalled conditions for the same descriptor may be reported
        !           260:  *         in one or more returned apr_pollfd_t structures, depending on the
        !           261:  *         implementation.
        !           262:  * @bug With versions 1.4.2 and prior on Windows, a call with no descriptors
        !           263:  *      and timeout will return immediately with the wrong error code.
        !           264:  */
        !           265: APR_DECLARE(apr_status_t) apr_pollset_poll(apr_pollset_t *pollset,
        !           266:                                            apr_interval_time_t timeout,
        !           267:                                            apr_int32_t *num,
        !           268:                                            const apr_pollfd_t **descriptors);
        !           269: 
        !           270: /**
        !           271:  * Interrupt the blocked apr_pollset_poll() call.
        !           272:  * @param pollset The pollset to use
        !           273:  * @remark If the pollset was not created with APR_POLLSET_WAKEABLE the
        !           274:  *         return value is APR_EINIT.
        !           275:  */
        !           276: APR_DECLARE(apr_status_t) apr_pollset_wakeup(apr_pollset_t *pollset);
        !           277: 
        !           278: /**
        !           279:  * Poll the descriptors in the poll structure
        !           280:  * @param aprset The poll structure we will be using. 
        !           281:  * @param numsock The number of descriptors we are polling
        !           282:  * @param nsds The number of descriptors signalled (output parameter)
        !           283:  * @param timeout The amount of time in microseconds to wait.  This is a
        !           284:  *                maximum, not a minimum.  If a descriptor is signalled, the
        !           285:  *                function will return before this time.  If timeout is
        !           286:  *                negative, the function will block until a descriptor is
        !           287:  *                signalled or until apr_pollset_wakeup() has been called.
        !           288:  * @remark The number of descriptors signalled is returned in the third argument. 
        !           289:  *         This is a blocking call, and it will not return until either a 
        !           290:  *         descriptor has been signalled or the timeout has expired. 
        !           291:  * @remark The rtnevents field in the apr_pollfd_t array will only be filled-
        !           292:  *         in if the return value is APR_SUCCESS.
        !           293:  * @bug With versions 1.4.2 and prior on Windows, a call with no descriptors
        !           294:  *      and timeout will return immediately with the wrong error code.
        !           295:  */
        !           296: APR_DECLARE(apr_status_t) apr_poll(apr_pollfd_t *aprset, apr_int32_t numsock,
        !           297:                                    apr_int32_t *nsds, 
        !           298:                                    apr_interval_time_t timeout);
        !           299: 
        !           300: /**
        !           301:  * Return a printable representation of the pollset method.
        !           302:  * @param pollset The pollset to use
        !           303:  */
        !           304: APR_DECLARE(const char *) apr_pollset_method_name(apr_pollset_t *pollset);
        !           305: 
        !           306: /**
        !           307:  * Return a printable representation of the default pollset method
        !           308:  * (APR_POLLSET_DEFAULT).
        !           309:  */
        !           310: APR_DECLARE(const char *) apr_poll_method_defname(void);
        !           311: 
        !           312: /** Opaque structure used for pollset API */
        !           313: typedef struct apr_pollcb_t apr_pollcb_t;
        !           314: 
        !           315: /**
        !           316:  * Set up a pollcb object
        !           317:  * @param pollcb  The pointer in which to return the newly created object 
        !           318:  * @param size The maximum number of descriptors that a single _poll can return.
        !           319:  * @param p The pool from which to allocate the pollcb
        !           320:  * @param flags Optional flags to modify the operation of the pollcb.
        !           321:  *
        !           322:  * @remark Pollcb is only supported on some platforms; the apr_pollcb_create()
        !           323:  * call will fail with APR_ENOTIMPL on platforms where it is not supported.
        !           324:  */
        !           325: APR_DECLARE(apr_status_t) apr_pollcb_create(apr_pollcb_t **pollcb,
        !           326:                                             apr_uint32_t size,
        !           327:                                             apr_pool_t *p,
        !           328:                                             apr_uint32_t flags);
        !           329: 
        !           330: /**
        !           331:  * Set up a pollcb object
        !           332:  * @param pollcb  The pointer in which to return the newly created object 
        !           333:  * @param size The maximum number of descriptors that a single _poll can return.
        !           334:  * @param p The pool from which to allocate the pollcb
        !           335:  * @param flags Optional flags to modify the operation of the pollcb.
        !           336:  * @param method Poll method to use. See #apr_pollset_method_e.  If this
        !           337:  *         method cannot be used, the default method will be used unless the
        !           338:  *         APR_POLLSET_NODEFAULT flag has been specified.
        !           339:  *
        !           340:  * @remark Pollcb is only supported on some platforms; the apr_pollcb_create_ex()
        !           341:  * call will fail with APR_ENOTIMPL on platforms where it is not supported.
        !           342:  */
        !           343: APR_DECLARE(apr_status_t) apr_pollcb_create_ex(apr_pollcb_t **pollcb,
        !           344:                                                apr_uint32_t size,
        !           345:                                                apr_pool_t *p,
        !           346:                                                apr_uint32_t flags,
        !           347:                                                apr_pollset_method_e method);
        !           348: 
        !           349: /**
        !           350:  * Add a socket or file descriptor to a pollcb
        !           351:  * @param pollcb The pollcb to which to add the descriptor
        !           352:  * @param descriptor The descriptor to add
        !           353:  * @remark If you set client_data in the descriptor, that value will be
        !           354:  *         returned in the client_data field whenever this descriptor is
        !           355:  *         signalled in apr_pollcb_poll().
        !           356:  * @remark Unlike the apr_pollset API, the descriptor is not copied, and users 
        !           357:  *         must retain the memory used by descriptor, as the same pointer will
        !           358:  *         be returned to them from apr_pollcb_poll.
        !           359:  * @remark Do not add the same socket or file descriptor to the same pollcb
        !           360:  *         multiple times, even if the requested events differ for the 
        !           361:  *         different calls to apr_pollcb_add().  If the events of interest
        !           362:  *         for a descriptor change, you must first remove the descriptor 
        !           363:  *         from the pollcb with apr_pollcb_remove(), then add it again 
        !           364:  *         specifying all requested events.
        !           365:  */
        !           366: APR_DECLARE(apr_status_t) apr_pollcb_add(apr_pollcb_t *pollcb,
        !           367:                                          apr_pollfd_t *descriptor);
        !           368: /**
        !           369:  * Remove a descriptor from a pollcb
        !           370:  * @param pollcb The pollcb from which to remove the descriptor
        !           371:  * @param descriptor The descriptor to remove
        !           372:  * @remark apr_pollcb_remove() cannot be used to remove a subset of requested
        !           373:  *         events for a descriptor.  The reqevents field in the apr_pollfd_t
        !           374:  *         parameter must contain the same value when removing as when adding.
        !           375:  */
        !           376: APR_DECLARE(apr_status_t) apr_pollcb_remove(apr_pollcb_t *pollcb,
        !           377:                                             apr_pollfd_t *descriptor);
        !           378: 
        !           379: /** Function prototype for pollcb handlers 
        !           380:  * @param baton Opaque baton passed into apr_pollcb_poll()
        !           381:  * @param descriptor Contains the notification for an active descriptor, 
        !           382:  *                   the rtnevents member contains what events were triggered
        !           383:  *                   for this descriptor.
        !           384:  */
        !           385: typedef apr_status_t (*apr_pollcb_cb_t)(void *baton, apr_pollfd_t *descriptor);
        !           386: 
        !           387: /**
        !           388:  * Block for activity on the descriptor(s) in a pollcb
        !           389:  * @param pollcb The pollcb to use
        !           390:  * @param timeout The amount of time in microseconds to wait.  This is a
        !           391:  *                maximum, not a minimum.  If a descriptor is signalled, the
        !           392:  *                function will return before this time.  If timeout is
        !           393:  *                negative, the function will block until a descriptor is
        !           394:  *                signalled.
        !           395:  * @param func Callback function to call for each active descriptor.
        !           396:  * @param baton Opaque baton passed to the callback function.
        !           397:  * @remark Multiple signalled conditions for the same descriptor may be reported
        !           398:  *         in one or more calls to the callback function, depending on the
        !           399:  *         implementation.
        !           400:  * @bug With versions 1.4.2 and prior on Windows, a call with no descriptors
        !           401:  *      and timeout will return immediately with the wrong error code.
        !           402:  */
        !           403: APR_DECLARE(apr_status_t) apr_pollcb_poll(apr_pollcb_t *pollcb,
        !           404:                                           apr_interval_time_t timeout,
        !           405:                                           apr_pollcb_cb_t func,
        !           406:                                           void *baton); 
        !           407: 
        !           408: /** @} */
        !           409: 
        !           410: #ifdef __cplusplus
        !           411: }
        !           412: #endif
        !           413: 
        !           414: #endif  /* ! APR_POLL_H */
        !           415: 

E-mail: