summaryrefslogtreecommitdiff
path: root/fpcsrc/packages/httpd20/src/apr/apr_poll.inc
blob: 3af63c30021385779778f1b4700f4bdd845a772a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
{ Copyright 2000-2005 The Apache Software Foundation or its licensors, as
 * applicable.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 }

{
 * @file apr_poll.h
 * @brief APR Poll interface
 }
{#include "apr.h"
#include "apr_pools.h"
#include "apr_errno.h"
#include "apr_inherit.h" 
#include "apr_file_io.h" 
#include "apr_network_io.h" 

#if APR_HAVE_NETINET_IN_H
#include <netinet/in.h>
#endif}

{
 * @defgroup apr_poll Poll Routines
 * @ingroup APR 
 }

{
 * @defgroup apr_poll_opt Poll options
 }
const
  APR_POLLIN   = $001;     {< Can read without blocking }
  APR_POLLPRI  = $002;     {< Priority data available }
  APR_POLLOUT  = $004;     {< Can write without blocking }
  APR_POLLERR  = $010;     {< Pending error }
  APR_POLLHUP  = $020;     {< Hangup occurred }
  APR_POLLNVAL = $040;     {< Descriptior invalid }

{ Used in apr_pollfd_t to determine what the apr_descriptor is }
type
  apr_datatype_e = (
    APR_NO_DESC,                {< nothing here }
    APR_POLL_SOCKET,            {< descriptor refers to a socket }
    APR_POLL_FILE,              {< descriptor refers to a file }
    APR_POLL_LASTDESC           {< descriptor is the last one in the list }
  );

{ Union of either an APR file or socket. }
  apr_descriptor = record
    case Integer of
     1: (f: Papr_file_t);        {< file }
     2: (s: Papr_socket_t);      {< socket }
  end;

{ @see apr_pollfd_t }
  Papr_pollfd_t = ^apr_pollfd_t;

  PPapr_pollfd_t = ^Papr_pollfd_t;

{ Poll descriptor set. }
  apr_pollfd_t = record
    p: Papr_pool_t;              {< associated pool }
    desc_type: apr_datatype_e;   {< descriptor type }
    reqevents: apr_int16_t;      {< requested events }
    rtnevents: apr_int16_t;      {< returned events }
    desc: apr_descriptor;        {< @see apr_descriptor }
    client_data: Pointer;        {< allows app to associate context }
  end;

{
 * Setup the memory required for poll to operate properly
 * @param new_poll The poll structure to be used. 
 * @param num The number of socket descriptors to be polled.
 * @param cont The pool to operate on.
 * @deprecated This function is deprecated, APR applications should control the pollset memory themselves.
 }
function apr_poll_setup(new_poll: PPapr_pollfd_t; num: apr_int32_t;
 cont: Papr_pool_t): apr_status_t;
 {$IFDEF WINDOWS} stdcall; {$ELSE} cdecl; {$ENDIF}
 external LibAPR name LibNamePrefix + 'apr_poll_setup' + LibSuff12;

{
 * Poll the sockets in the poll structure
 * @param aprset The poll structure we will be using. 
 * @param numsock The number of sockets we are polling
 * @param nsds The number of sockets signalled.
 * @param timeout The amount of time in microseconds to wait.  This is 
 *                a maximum, not a minimum.  If a socket is signalled, we 
 *                will wake up before this time.  A negative number means 
 *                wait until a socket is signalled.
 * @remark
 * <PRE>
 * The number of sockets signalled is returned in the second argument. 
 *
 *        This is a blocking call, and it will not return until either a 
 *        socket has been signalled, or the timeout has expired. 
 * </PRE>
 }
function apr_poll(aprset: Papr_pollfd_t; numsock: apr_int32_t;
 nsds: Papr_int32_t; timeout: apr_interval_time_t): apr_status_t;
 {$IFDEF WINDOWS} stdcall; {$ELSE} cdecl; {$ENDIF}
 external LibAPR name LibNamePrefix + 'apr_poll' + LibSuff20;

{
 * Add a socket to the poll structure.
 * @param aprset The poll structure we will be using. 
 * @param sock The socket to add to the current poll structure. 
 * @param event The events to look for when we do the poll.  One of:
 * <PRE>
 *            APR_POLLIN       signal if read will not block
 *            APR_POLLPRI      signal if prioirty data is availble to be read
 *            APR_POLLOUT      signal if write will not block
 * </PRE>
 * @deprecated This function is deprecated, APR applications should control the pollset memory themselves.
 }
function apr_poll_socket_add(aprset: Papr_pollfd_t; sock: Papr_socket_t;
 event: apr_int16_t): apr_status_t;
 {$IFDEF WINDOWS} stdcall; {$ELSE} cdecl; {$ENDIF}
 external LibAPR name LibNamePrefix + 'apr_poll_socket_add' + LibSuff12;

{
 * Modify a socket in the poll structure with mask.
 * @param aprset The poll structure we will be using. 
 * @param sock The socket to modify in poll structure. 
 * @param events The events to stop looking for during the poll.  One of:
 * <PRE>
 *            APR_POLLIN       signal if read will not block
 *            APR_POLLPRI      signal if priority data is available to be read
 *            APR_POLLOUT      signal if write will not block
 * </PRE>
 * @deprecated This function is deprecated, APR applications should control the pollset memory themselves.
 }
function apr_poll_socket_mask(aprset: Papr_pollfd_t; sock: Papr_socket_t;
 events: apr_int16_t): apr_status_t;
 {$IFDEF WINDOWS} stdcall; {$ELSE} cdecl; {$ENDIF}
 external LibAPR name LibNamePrefix + 'apr_poll_socket_mask' + LibSuff12;

{
 * Remove a socket from the poll structure.
 * @param aprset The poll structure we will be using. 
 * @param sock The socket to remove from the current poll structure. 
 * @deprecated This function is deprecated, APR applications should control the pollset memory themselves.
 }
function apr_poll_socket_remove(aprset: Papr_pollfd_t; sock: Papr_socket_t): apr_status_t;
 {$IFDEF WINDOWS} stdcall; {$ELSE} cdecl; {$ENDIF}
 external LibAPR name LibNamePrefix + 'apr_poll_socket_remove' + LibSuff8;

{
 * Clear all events in the poll structure.
 * @param aprset The poll structure we will be using. 
 * @param events The events to clear from all sockets.  One of:
 * <PRE>
 *            APR_POLLIN       signal if read will not block
 *            APR_POLLPRI      signal if priority data is available to be read
 *            APR_POLLOUT      signal if write will not block
 * </PRE>
 * @deprecated This function is deprecated, APR applications should control the pollset memory themselves.
 }
function apr_poll_socket_clear(aprset: Papr_pollfd_t;
 events: apr_int16_t): apr_status_t;
 {$IFDEF WINDOWS} stdcall; {$ELSE} cdecl; {$ENDIF}
 external LibAPR name LibNamePrefix + 'apr_poll_socket_clear' + LibSuff8;

{
 * Get the return events for the specified socket.
 * @param event The returned events for the socket.  One of:
 * <PRE>
 *            APR_POLLIN       Data is available to be read 
 *            APR_POLLPRI      Priority data is availble to be read
 *            APR_POLLOUT      Write will succeed
 *            APR_POLLERR      An error occurred on the socket
 *            APR_POLLHUP      The connection has been terminated
 *            APR_POLLNVAL     This is an invalid socket to poll on.
 *                             Socket not open.
 * </PRE>
 * @param sock The socket we wish to get information about. 
 * @param aprset The poll structure we will be using. 
 * @deprecated This function is deprecated, APR applications should control the pollset memory themselves.
 }
function apr_poll_revents_get(event: Papr_int16_t; sock: Papr_socket_t;
 aprset: Papr_pollfd_t): apr_status_t;
 {$IFDEF WINDOWS} stdcall; {$ELSE} cdecl; {$ENDIF}
 external LibAPR name LibNamePrefix + 'apr_poll_revents_get' + LibSuff12;

{ General-purpose poll API for arbitrarily large numbers of
 * file descriptors
 }

{ Opaque structure used for pollset API }
type
  apr_pollset_t = record end;
  Papr_pollset_t = ^apr_pollset_t;
  PPapr_pollset_t = ^Papr_pollset_t;

{
 * Setup a pollset object
 * @param pollset  The pointer in which to return the newly created object 
 * @param size The maximum number of descriptors that this pollset can hold
 * @param p The pool from which to allocate the pollset
 * @param flags Optional flags to modify the operation of the pollset
 *              (reserved for future expansion)
 }
function apr_pollset_create(pollset: PPapr_pollset_t; size: apr_uint32_tso_handle_t;
 p: Papr_pool_t; flags: apr_uint32_t): apr_status_t;
 {$IFDEF WINDOWS} stdcall; {$ELSE} cdecl; {$ENDIF}
 external LibAPR name LibNamePrefix + 'apr_pollset_create' + LibSuff16;

{
 * Destroy a pollset object
 * @param pollset The pollset to destroy
 }
function apr_pollset_destroy(pollset: Papr_pollset_t): apr_status_t;
 {$IFDEF WINDOWS} stdcall; {$ELSE} cdecl; {$ENDIF}
 external LibAPR name LibNamePrefix + 'apr_pollset_destroy' + LibSuff4;

{
 * Add a socket or file descriptor to a pollset
 * @param pollset The pollset to which to add the descriptor
 * @param descriptor The descriptor to add
 * @remark If you set client_data in the descriptor, that value
 *         will be returned in the client_data field whenever this
 *         descriptor is signalled in apr_pollset_poll().
 }
function apr_pollset_add(pollset: Papr_pollset_t;
 const descriptor: Papr_pollfd_t): apr_status_t;
 {$IFDEF WINDOWS} stdcall; {$ELSE} cdecl; {$ENDIF}
 external LibAPR name LibNamePrefix + 'apr_pollset_add' + LibSuff8;

{
 * Remove a descriptor from a pollset
 * @param pollset The pollset from which to remove the descriptor
 * @param descriptor The descriptor to remove
 }
function apr_pollset_remove(pollset: Papr_pollset_t;
 const descriptor: Papr_pollfd_t): apr_status_t;
 {$IFDEF WINDOWS} stdcall; {$ELSE} cdecl; {$ENDIF}
 external LibAPR name LibNamePrefix + 'apr_pollset_remove' + LibSuff8;

{
 * Block for activity on the descriptor(s) in a pollset
 * @param pollset The pollset to use
 * @param timeout Timeout in microseconds
 * @param num Number of signalled descriptors (output parameter)
 * @param descriptors Array of signalled descriptors (output parameter)
 }
function apr_pollset_poll(pollset: Papr_pollset_t; timeout: apr_interval_time_t;
 num: Papr_int32_t; const descriptors: PPapr_pollfd_t): apr_status_t;
 {$IFDEF WINDOWS} stdcall; {$ELSE} cdecl; {$ENDIF}
 external LibAPR name LibNamePrefix + 'apr_pollset_poll' + LibSuff20;