#define APR_POLLERR 0x010 |
Pending error
#define APR_POLLHUP 0x020 |
Hangup occurred
#define APR_POLLIN 0x001 |
Poll options Can read without blocking
#define APR_POLLNVAL 0x040 |
Descriptor invalid
#define APR_POLLOUT 0x004 |
Can write without blocking
#define APR_POLLPRI 0x002 |
Priority data available
#define APR_POLLSET_NOCOPY 0x002 |
Descriptors passed to apr_pollset_add() are not copied
#define APR_POLLSET_NODEFAULT 0x010 |
Do not try to use the default method if the specified non-default method cannot be used
#define APR_POLLSET_THREADSAFE 0x001 |
Pollset Flags Adding or removing a descriptor is thread-safe
#define APR_POLLSET_WAKEABLE 0x004 |
Poll operations are interruptable by apr_pollset_wakeup()
typedef apr_status_t(* apr_pollcb_cb_t)(void *baton, apr_pollfd_t *descriptor) |
Function prototype for pollcb handlers
baton | Opaque baton passed into apr_pollcb_poll() | |
descriptor | Contains the notification for an active descriptor, the rtnevents member contains what events were triggered for this descriptor. |
typedef struct apr_pollcb_t apr_pollcb_t |
Opaque structure used for pollset API
typedef struct apr_pollfd_t apr_pollfd_t |
typedef struct apr_pollset_t apr_pollset_t |
Opaque structure used for pollset API
enum apr_datatype_e |
Used in apr_pollfd_t to determine what the apr_descriptor is
APR_NO_DESC | nothing here |
APR_POLL_SOCKET | descriptor refers to a socket |
APR_POLL_FILE | descriptor refers to a file |
APR_POLL_LASTDESC |
|
enum apr_pollset_method_e |
apr_status_t apr_poll | ( | apr_pollfd_t * | aprset, | |
apr_int32_t | numsock, | |||
apr_int32_t * | nsds, | |||
apr_interval_time_t | timeout | |||
) |
Poll the descriptors in the poll structure
aprset | The poll structure we will be using. | |
numsock | The number of descriptors we are polling | |
nsds | The number of descriptors signalled (output parameter) | |
timeout | The amount of time in microseconds to wait. This is a maximum, not a minimum. If a descriptor is signalled, the function will return before this time. If timeout is negative, the function will block until a descriptor is signalled or until apr_pollset_wakeup() has been called. |
The rtnevents field in the apr_pollfd_t array will only be filled- in if the return value is APR_SUCCESS.
const char* apr_poll_method_defname | ( | void | ) |
Return a printable representation of the default pollset method (APR_POLLSET_DEFAULT).
apr_status_t apr_pollcb_add | ( | apr_pollcb_t * | pollcb, | |
apr_pollfd_t * | descriptor | |||
) |
Add a socket or file descriptor to a pollcb
pollcb | The pollcb to which to add the descriptor | |
descriptor | The descriptor to add |
Unlike the apr_pollset API, the descriptor is not copied, and users must retain the memory used by descriptor, as the same pointer will be returned to them from apr_pollcb_poll.
Do not add the same socket or file descriptor to the same pollcb multiple times, even if the requested events differ for the different calls to apr_pollcb_add(). If the events of interest for a descriptor change, you must first remove the descriptor from the pollcb with apr_pollcb_remove(), then add it again specifying all requested events.
apr_status_t apr_pollcb_create | ( | apr_pollcb_t ** | pollcb, | |
apr_uint32_t | size, | |||
apr_pool_t * | p, | |||
apr_uint32_t | flags | |||
) |
Set up a pollcb object
pollcb | The pointer in which to return the newly created object | |
size | The maximum number of descriptors that a single _poll can return. | |
p | The pool from which to allocate the pollcb | |
flags | Optional flags to modify the operation of the pollcb. |
apr_status_t apr_pollcb_create_ex | ( | apr_pollcb_t ** | pollcb, | |
apr_uint32_t | size, | |||
apr_pool_t * | p, | |||
apr_uint32_t | flags, | |||
apr_pollset_method_e | method | |||
) |
Set up a pollcb object
pollcb | The pointer in which to return the newly created object | |
size | The maximum number of descriptors that a single _poll can return. | |
p | The pool from which to allocate the pollcb | |
flags | Optional flags to modify the operation of the pollcb. | |
method | Poll method to use. See apr_pollset_method_e. If this method cannot be used, the default method will be used unless the APR_POLLSET_NODEFAULT flag has been specified. |
apr_status_t apr_pollcb_poll | ( | apr_pollcb_t * | pollcb, | |
apr_interval_time_t | timeout, | |||
apr_pollcb_cb_t | func, | |||
void * | baton | |||
) |
Block for activity on the descriptor(s) in a pollcb
pollcb | The pollcb to use | |
timeout | The amount of time in microseconds to wait. This is a maximum, not a minimum. If a descriptor is signalled, the function will return before this time. If timeout is negative, the function will block until a descriptor is signalled. | |
func | Callback function to call for each active descriptor. | |
baton | Opaque baton passed to the callback function. |
apr_status_t apr_pollcb_remove | ( | apr_pollcb_t * | pollcb, | |
apr_pollfd_t * | descriptor | |||
) |
Remove a descriptor from a pollcb
pollcb | The pollcb from which to remove the descriptor | |
descriptor | The descriptor to remove |
apr_status_t apr_pollset_add | ( | apr_pollset_t * | pollset, | |
const apr_pollfd_t * | descriptor | |||
) |
Add a socket or file descriptor to a pollset
pollset | The pollset to which to add the descriptor | |
descriptor | The descriptor to add |
If the pollset has been created with APR_POLLSET_THREADSAFE and thread T1 is blocked in a call to apr_pollset_poll() for this same pollset that is being modified via apr_pollset_add() in thread T2, the currently executing apr_pollset_poll() call in T1 will either: (1) automatically include the newly added descriptor in the set of descriptors it is watching or (2) return immediately with APR_EINTR. Option (1) is recommended, but option (2) is allowed for implementations where option (1) is impossible or impractical.
If the pollset has been created with APR_POLLSET_NOCOPY, the apr_pollfd_t structure referenced by descriptor will not be copied and must have a lifetime at least as long as the pollset.
Do not add the same socket or file descriptor to the same pollset multiple times, even if the requested events differ for the different calls to apr_pollset_add(). If the events of interest for a descriptor change, you must first remove the descriptor from the pollset with apr_pollset_remove(), then add it again specifying all requested events.
apr_status_t apr_pollset_create | ( | apr_pollset_t ** | pollset, | |
apr_uint32_t | size, | |||
apr_pool_t * | p, | |||
apr_uint32_t | flags | |||
) |
Set up a pollset object
pollset | The pointer in which to return the newly created object | |
size | The maximum number of descriptors that this pollset can hold | |
p | The pool from which to allocate the pollset | |
flags | Optional flags to modify the operation of the pollset. |
If flags contains APR_POLLSET_WAKEABLE, then a pollset is created with an additional internal pipe object used for the apr_pollset_wakeup() call. The actual size of pollset is in that case size + 1. This feature is only supported on some platforms; the apr_pollset_create() call will fail with APR_ENOTIMPL on platforms where it is not supported.
If flags contains APR_POLLSET_NOCOPY, then the apr_pollfd_t structures passed to apr_pollset_add() are not copied and must have a lifetime at least as long as the pollset.
Some poll methods (including APR_POLLSET_KQUEUE, APR_POLLSET_PORT, and APR_POLLSET_EPOLL) do not have a fixed limit on the size of the pollset. For these methods, the size parameter controls the maximum number of descriptors that will be returned by a single call to apr_pollset_poll().
apr_status_t apr_pollset_create_ex | ( | apr_pollset_t ** | pollset, | |
apr_uint32_t | size, | |||
apr_pool_t * | p, | |||
apr_uint32_t | flags, | |||
apr_pollset_method_e | method | |||
) |
Set up a pollset object
pollset | The pointer in which to return the newly created object | |
size | The maximum number of descriptors that this pollset can hold | |
p | The pool from which to allocate the pollset | |
flags | Optional flags to modify the operation of the pollset. | |
method | Poll method to use. See apr_pollset_method_e. If this method cannot be used, the default method will be used unless the APR_POLLSET_NODEFAULT flag has been specified. |
If flags contains APR_POLLSET_WAKEABLE, then a pollset is created with additional internal pipe object used for the apr_pollset_wakeup() call. The actual size of pollset is in that case size + 1. This feature is only supported on some platforms; the apr_pollset_create_ex() call will fail with APR_ENOTIMPL on platforms where it is not supported.
If flags contains APR_POLLSET_NOCOPY, then the apr_pollfd_t structures passed to apr_pollset_add() are not copied and must have a lifetime at least as long as the pollset.
Some poll methods (including APR_POLLSET_KQUEUE, APR_POLLSET_PORT, and APR_POLLSET_EPOLL) do not have a fixed limit on the size of the pollset. For these methods, the size parameter controls the maximum number of descriptors that will be returned by a single call to apr_pollset_poll().
apr_status_t apr_pollset_destroy | ( | apr_pollset_t * | pollset | ) |
Destroy a pollset object
pollset | The pollset to destroy |
const char* apr_pollset_method_name | ( | apr_pollset_t * | pollset | ) |
Return a printable representation of the pollset method.
pollset | The pollset to use |
apr_status_t apr_pollset_poll | ( | apr_pollset_t * | pollset, | |
apr_interval_time_t | timeout, | |||
apr_int32_t * | num, | |||
const apr_pollfd_t ** | descriptors | |||
) |
Block for activity on the descriptor(s) in a pollset
pollset | The pollset to use | |
timeout | The amount of time in microseconds to wait. This is a maximum, not a minimum. If a descriptor is signalled, the function will return before this time. If timeout is negative, the function will block until a descriptor is signalled or until apr_pollset_wakeup() has been called. | |
num | Number of signalled descriptors (output parameter) | |
descriptors | Array of signalled descriptors (output parameter) |
Multiple signalled conditions for the same descriptor may be reported in one or more returned apr_pollfd_t structures, depending on the implementation.
apr_status_t apr_pollset_remove | ( | apr_pollset_t * | pollset, | |
const apr_pollfd_t * | descriptor | |||
) |
Remove a descriptor from a pollset
pollset | The pollset from which to remove the descriptor | |
descriptor | The descriptor to remove |
apr_pollset_remove() cannot be used to remove a subset of requested events for a descriptor. The reqevents field in the apr_pollfd_t parameter must contain the same value when removing as when adding.
apr_status_t apr_pollset_wakeup | ( | apr_pollset_t * | pollset | ) |
Interrupt the blocked apr_pollset_poll() call.
pollset | The pollset to use |