comparison nspr/pr/include/prmwait.h @ 0:1e5118fa0cb1

This is NSS with a Cmake Buildsyste To compile a static NSS library for Windows we've used the Chromium-NSS fork and added a Cmake buildsystem to compile it statically for Windows. See README.chromium for chromium changes and README.trustbridge for our modifications.
author Andre Heinecke <andre.heinecke@intevation.de>
date Mon, 28 Jul 2014 10:47:06 +0200
parents
children
comparison
equal deleted inserted replaced
-1:000000000000 0:1e5118fa0cb1
1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
2 /* This Source Code Form is subject to the terms of the Mozilla Public
3 * License, v. 2.0. If a copy of the MPL was not distributed with this
4 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
5
6 #if defined(_PRMWAIT_H)
7 #else
8 #define _PRMWAIT_H
9
10 #include "prio.h"
11 #include "prtypes.h"
12 #include "prclist.h"
13
14 PR_BEGIN_EXTERN_C
15
16 /********************************************************************************/
17 /********************************************************************************/
18 /********************************************************************************/
19 /****************************** WARNING ****************************/
20 /********************************************************************************/
21 /**************************** This is work in progress. *************************/
22 /************************** Do not make any assumptions *************************/
23 /************************** about the stability of this *************************/
24 /************************** API or the underlying imple- ************************/
25 /************************** mentation. ************************/
26 /********************************************************************************/
27 /********************************************************************************/
28
29 /*
30 ** STRUCTURE: PRWaitGroup
31 ** DESCRIPTION:
32 ** The client may define several wait groups in order to semantically
33 ** tie a collection of file descriptors for a single purpose. This allows
34 ** easier dispatching of threads that returned with active file descriptors
35 ** from the wait function.
36 */
37 typedef struct PRWaitGroup PRWaitGroup;
38
39 /*
40 ** ENUMERATION: PRMWStatus
41 ** DESCRIPTION:
42 ** This enumeration is used to indicate the completion status of
43 ** a receive wait object. Generally stated, a positive value indicates
44 ** that the operation is not yet complete. A zero value indicates
45 ** success (similar to PR_SUCCESS) and any negative value is an
46 ** indication of failure. The reason for the failure can be retrieved
47 ** by calling PR_GetError().
48 **
49 ** PR_MW_PENDING The operation is still pending. None of the other
50 ** fields of the object are currently valid.
51 ** PR_MW_SUCCESS The operation is complete and it was successful.
52 ** PR_MW_FAILURE The operation failed. The reason for the failure
53 ** can be retrieved by calling PR_GetError().
54 ** PR_MW_TIMEOUT The amount of time allowed for by the object's
55 ** 'timeout' field has expired w/o the operation
56 ** otherwise coming to closure.
57 ** PR_MW_INTERRUPT The operation was cancelled, either by the client
58 ** calling PR_CancelWaitFileDesc() or destroying the
59 ** entire wait group (PR_DestroyWaitGroup()).
60 */
61 typedef enum PRMWStatus
62 {
63 PR_MW_PENDING = 1,
64 PR_MW_SUCCESS = 0,
65 PR_MW_FAILURE = -1,
66 PR_MW_TIMEOUT = -2,
67 PR_MW_INTERRUPT = -3
68 } PRMWStatus;
69
70 /*
71 ** STRUCTURE: PRMemoryDescriptor
72 ** DESCRIPTION:
73 ** THis is a descriptor for an interval of memory. It contains a
74 ** pointer to the first byte of that memory and the length (in
75 ** bytes) of the interval.
76 */
77 typedef struct PRMemoryDescriptor
78 {
79 void *start; /* pointer to first byte of memory */
80 PRSize length; /* length (in bytes) of memory interval */
81 } PRMemoryDescriptor;
82
83 /*
84 ** STRUCTURE: PRMWaitClientData
85 ** DESCRIPTION:
86 ** An opague stucture for which a client MAY give provide a concrete
87 ** definition and associate with a receive descriptor. The NSPR runtime
88 ** does not manage this field. It is completely up to the client.
89 */
90 typedef struct PRMWaitClientData PRMWaitClientData;
91
92 /*
93 ** STRUCTURE: PRRecvWait
94 ** DESCRIPTION:
95 ** A receive wait object contains the file descriptor that is subject
96 ** to the wait and the amount of time (beginning epoch established
97 ** when the object is presented to the runtime) the the channel should
98 ** block before abandoning the process.
99 **
100 ** The success of the wait operation will be noted in the object's
101 ** 'outcome' field. The fields are not valid when the NSPR runtime
102 ** is in possession of the object.
103 **
104 ** The memory descriptor describes an interval of writable memory
105 ** in the caller's address space where data from an initial read
106 ** can be placed. The description may indicate a null interval.
107 */
108 typedef struct PRRecvWait
109 {
110 PRCList internal; /* internal runtime linkages */
111
112 PRFileDesc *fd; /* file descriptor associated w/ object */
113 PRMWStatus outcome; /* outcome of the current/last operation */
114 PRIntervalTime timeout; /* time allowed for entire operation */
115
116 PRInt32 bytesRecv; /* number of bytes transferred into buffer */
117 PRMemoryDescriptor buffer; /* where to store first segment of input data */
118 PRMWaitClientData *client; /* pointer to arbitrary client defined data */
119 } PRRecvWait;
120
121 /*
122 ** STRUCTURE: PRMWaitEnumerator
123 ** DESCRIPTION:
124 ** An enumeration object is used to store the state of an existing
125 ** enumeration over a wait group. The opaque object must be allocated
126 ** by the client and the reference presented on each call to the
127 ** pseudo-stateless enumerator. The enumeration objects are sharable
128 ** only in serial fashion.
129 */
130 typedef struct PRMWaitEnumerator PRMWaitEnumerator;
131
132
133 /*
134 ** FUNCTION: PR_AddWaitFileDesc
135 ** DESCRIPTION:
136 ** This function will effectively add a file descriptor to the
137 ** list of those waiting for network receive. The new descriptor
138 ** will be semantically tied to the wait group specified.
139 **
140 ** The ownership for the storage pointed to by 'desc' is temporarily
141 ** passed over the the NSPR runtime. It will be handed back by the
142 ** function PR_WaitRecvReady().
143 **
144 ** INPUTS
145 ** group A reference to a PRWaitGroup or NULL. Wait groups are
146 ** created by calling PR_CreateWaitGroup() and are used
147 ** to semantically group various file descriptors by the
148 ** client's application.
149 ** desc A reference to a valid PRRecvWait. The object of the
150 ** reference must be preserved and not be modified
151 ** until its ownership is returned to the client.
152 ** RETURN
153 ** PRStatus An indication of success. If equal to PR_FAILUE details
154 ** of the failure are avaiable via PR_GetError().
155 **
156 ** ERRORS
157 ** PR_INVALID_ARGUMENT_ERROR
158 ** Invalid 'group' identifier or duplicate 'desc' object.
159 ** PR_OUT_OF_MEMORY_ERROR
160 ** Insuffient memory for internal data structures.
161 ** PR_INVALID_STATE_ERROR
162 ** The group is being destroyed.
163 */
164 NSPR_API(PRStatus) PR_AddWaitFileDesc(PRWaitGroup *group, PRRecvWait *desc);
165
166 /*
167 ** FUNCTION: PR_WaitRecvReady
168 ** DESCRIPTION:
169 ** PR_WaitRecvReady will block the calling thread until one of the
170 ** file descriptors that have been added via PR_AddWaitFileDesc is
171 ** available for input I/O.
172 ** INPUT
173 ** group A pointer to a valid PRWaitGroup or NULL (the null
174 ** group. The function will block the caller until a
175 ** channel from the wait group becomes ready for receive
176 ** or there is some sort of error.
177 ** RETURN
178 ** PRReciveWait
179 ** When the caller is resumed it is either returned a
180 ** valid pointer to a previously added receive wait or
181 ** a NULL. If the latter, the function has terminated
182 ** for a reason that can be determined by calling
183 ** PR_GetError().
184 ** If a valid pointer is returned, the reference is to the
185 ** file descriptor contained in the receive wait object.
186 ** The outcome of the wait operation may still fail, and
187 ** if it has, that fact will be noted in the object's
188 ** outcome field. Details can be retrieved from PR_GetError().
189 **
190 ** ERRORS
191 ** PR_INVALID_ARGUMENT_ERROR
192 ** The 'group' is not known by the runtime.
193 ** PR_PENDING_INTERRUPT_ERROR
194 The thread was interrupted.
195 ** PR_INVALID_STATE_ERROR
196 ** The group is being destroyed.
197 */
198 NSPR_API(PRRecvWait*) PR_WaitRecvReady(PRWaitGroup *group);
199
200 /*
201 ** FUNCTION: PR_CancelWaitFileDesc
202 ** DESCRIPTION:
203 ** PR_CancelWaitFileDesc is provided as a means for cancelling operations
204 ** on objects previously submitted by use of PR_AddWaitFileDesc(). If
205 ** the runtime knows of the object, it will be marked as having failed
206 ** because it was interrupted (similar to PR_Interrupt()). The first
207 ** available thread waiting on the group will be made to return the
208 ** PRRecvWait object with the outcome noted.
209 **
210 ** INPUTS
211 ** group The wait group under which the wait receive object was
212 ** added.
213 ** desc A pointer to the wait receive object that is to be
214 ** cancelled.
215 ** RETURN
216 ** PRStatus If the wait receive object was located and associated
217 ** with the specified wait group, the status returned will
218 ** be PR_SUCCESS. There is still a race condition that would
219 ** permit the offected object to complete normally, but it
220 ** is assured that it will complete in the near future.
221 ** If the receive object or wait group are invalid, the
222 ** function will return with a status of PR_FAILURE.
223 **
224 ** ERRORS
225 ** PR_INVALID_ARGUMENT_ERROR
226 ** The 'group' argument is not recognized as a valid group.
227 ** PR_COLLECTION_EMPTY_ERROR
228 ** There are no more receive wait objects in the group's
229 ** collection.
230 ** PR_INVALID_STATE_ERROR
231 ** The group is being destroyed.
232 */
233 NSPR_API(PRStatus) PR_CancelWaitFileDesc(PRWaitGroup *group, PRRecvWait *desc);
234
235 /*
236 ** FUNCTION: PR_CancelWaitGroup
237 ** DESCRIPTION:
238 ** PR_CancelWaitGroup is provided as a means for cancelling operations
239 ** on objects previously submitted by use of PR_AddWaitFileDesc(). Each
240 ** successive call will return a pointer to a PRRecvWait object that
241 ** was previously registered via PR_AddWaitFileDesc(). If no wait
242 ** objects are associated with the wait group, a NULL will be returned.
243 ** This function should be called in a loop until a NULL is returned
244 ** to reclaim all the wait objects prior to calling PR_DestroyWaitGroup().
245 **
246 ** INPUTS
247 ** group The wait group under which the wait receive object was
248 ** added.
249 ** RETURN
250 ** PRRecvWait* If the wait group is valid and at least one receive wait
251 ** object is present in the group, that object will be
252 ** marked as PR_MW_INTERRUPT'd and removed from the group's
253 ** queues. Otherwise a NULL will be returned and the reason
254 ** for the NULL may be retrieved by calling PR_GetError().
255 **
256 ** ERRORS
257 ** PR_INVALID_ARGUMENT_ERROR
258 ** PR_GROUP_EMPTY_ERROR
259 */
260 NSPR_API(PRRecvWait*) PR_CancelWaitGroup(PRWaitGroup *group);
261
262 /*
263 ** FUNCTION: PR_CreateWaitGroup
264 ** DESCRIPTION:
265 ** A wait group is an opaque object that a client may create in order
266 ** to semantically group various wait requests. Each wait group is
267 ** unique, including the default wait group (NULL). A wait request
268 ** that was added under a wait group will only be serviced by a caller
269 ** that specified the same wait group.
270 **
271 ** INPUT
272 ** size The size of the hash table to be used to contain the
273 ** receive wait objects. This is just the initial size.
274 ** It will grow as it needs to, but to avoid that hassle
275 ** one can suggest a suitable size initially. It should
276 ** be ~30% larger than the maximum number of receive wait
277 ** objects expected.
278 ** RETURN
279 ** PRWaitGroup If successful, the function will return a pointer to an
280 ** object that was allocated by and owned by the runtime.
281 ** The reference remains valid until it is explicitly destroyed
282 ** by calling PR_DestroyWaitGroup().
283 **
284 ** ERRORS
285 ** PR_OUT_OF_MEMORY_ERROR
286 */
287 NSPR_API(PRWaitGroup*) PR_CreateWaitGroup(PRInt32 size);
288
289 /*
290 ** FUNCTION: PR_DestroyWaitGroup
291 ** DESCRIPTION:
292 ** Undo the effects of PR_CreateWaitGroup(). Any receive wait operations
293 ** on the group will be treated as if the each had been the target of a
294 ** PR_CancelWaitFileDesc().
295 **
296 ** INPUT
297 ** group Reference to a wait group previously allocated using
298 ** PR_CreateWaitGroup().
299 ** RETURN
300 ** PRStatus Will be PR_SUCCESS if the wait group was valid and there
301 ** are no receive wait objects in that group. Otherwise
302 ** will indicate PR_FAILURE.
303 **
304 ** ERRORS
305 ** PR_INVALID_ARGUMENT_ERROR
306 ** The 'group' argument does not reference a known object.
307 ** PR_INVALID_STATE_ERROR
308 ** The group still contains receive wait objects.
309 */
310 NSPR_API(PRStatus) PR_DestroyWaitGroup(PRWaitGroup *group);
311
312 /*
313 ** FUNCTION: PR_CreateMWaitEnumerator
314 ** DESCRIPTION:
315 ** The PR_CreateMWaitEnumerator() function returns a reference to an
316 ** opaque PRMWaitEnumerator object. The enumerator object is required
317 ** as an argument for each successive call in the stateless enumeration
318 ** of the indicated wait group.
319 **
320 ** group The wait group that the enumeration is intended to
321 ** process. It may be be the default wait group (NULL).
322 ** RETURN
323 ** PRMWaitEnumerator* group
324 ** A reference to an object that will be used to store
325 ** intermediate state of enumerations.
326 ** ERRORS
327 ** Errors are indicated by the function returning a NULL.
328 ** PR_INVALID_ARGUMENT_ERROR
329 ** The 'group' argument does not reference a known object.
330 ** PR_OUT_OF_MEMORY_ERROR
331 */
332 NSPR_API(PRMWaitEnumerator*) PR_CreateMWaitEnumerator(PRWaitGroup *group);
333
334 /*
335 ** FUNCTION: PR_DestroyMWaitEnumerator
336 ** DESCRIPTION:
337 ** Destroys the object created by PR_CreateMWaitEnumerator(). The reference
338 ** used as an argument becomes invalid.
339 **
340 ** INPUT
341 ** PRMWaitEnumerator* enumerator
342 ** The PRMWaitEnumerator object to destroy.
343 ** RETURN
344 ** PRStatus
345 ** PR_SUCCESS if successful, PR_FAILURE otherwise.
346 ** ERRORS
347 ** PR_INVALID_ARGUMENT_ERROR
348 ** The enumerator is invalid.
349 */
350 NSPR_API(PRStatus) PR_DestroyMWaitEnumerator(PRMWaitEnumerator* enumerator);
351
352 /*
353 ** FUNCTION: PR_EnumerateWaitGroup
354 ** DESCRIPTION:
355 ** PR_EnumerateWaitGroup is a thread safe enumerator over a wait group.
356 ** Each call to the enumerator must present a valid PRMWaitEnumerator
357 ** rererence and a pointer to the "previous" element returned from the
358 ** enumeration process or a NULL.
359 **
360 ** An enumeration is started by passing a NULL as the "previous" value.
361 ** Subsequent calls to the enumerator must pass in the result of the
362 ** previous call. The enumeration end is signaled by the runtime returning
363 ** a NULL as the result.
364 **
365 ** Modifications to the content of the wait group are allowed during
366 ** an enumeration. The effect is that the enumeration may have to be
367 ** "reset" and that may result in duplicates being returned from the
368 ** enumeration.
369 **
370 ** An enumeration may be abandoned at any time. The runtime is not
371 ** keeping any state, so there are no issues in that regard.
372 */
373 NSPR_API(PRRecvWait*) PR_EnumerateWaitGroup(
374 PRMWaitEnumerator *enumerator, const PRRecvWait *previous);
375
376 PR_END_EXTERN_C
377
378 #endif /* defined(_PRMWAIT_H) */
379
380 /* prmwait.h */
This site is hosted by Intevation GmbH (Datenschutzerklärung und Impressum | Privacy Policy and Imprint)