Line data Source code
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 : #ifndef prcountr_h___
7 : #define prcountr_h___
8 :
9 : /*----------------------------------------------------------------------------
10 : ** prcountr.h -- NSPR Instrumentation counters
11 : **
12 : ** The NSPR Counter Feature provides a means to "count
13 : ** something." Counters can be dynamically defined, incremented,
14 : ** decremented, set, and deleted under application program
15 : ** control.
16 : **
17 : ** The Counter Feature is intended to be used as instrumentation,
18 : ** not as operational data. If you need a counter for operational
19 : ** data, use native integral types.
20 : **
21 : ** Counters are 32bit unsigned intergers. On overflow, a counter
22 : ** will wrap. No exception is recognized or reported.
23 : **
24 : ** A counter can be dynamically created using a two level naming
25 : ** convention. A "handle" is returned when the counter is
26 : ** created. The counter can subsequently be addressed by its
27 : ** handle. An API is provided to get an existing counter's handle
28 : ** given the names with which it was originally created.
29 : ** Similarly, a counter's name can be retrieved given its handle.
30 : **
31 : ** The counter naming convention is a two-level hierarchy. The
32 : ** QName is the higher level of the hierarchy; RName is the
33 : ** lower level. RNames can be thought of as existing within a
34 : ** QName. The same RName can exist within multiple QNames. QNames
35 : ** are unique. The NSPR Counter is not a near-zero overhead
36 : ** feature. Application designers should be aware of
37 : ** serialization issues when using the Counter API. Creating a
38 : ** counter locks a large asset, potentially causing a stall. This
39 : ** suggest that applications should create counters at component
40 : ** initialization, for example, and not create and destroy them
41 : ** willy-nilly. ... You have been warned.
42 : **
43 : ** Incrementing and Adding to counters uses atomic operations.
44 : ** The performance of these operations will vary from platform
45 : ** to platform. On platforms where atomic operations are not
46 : ** supported the overhead may be substantial.
47 : **
48 : ** When traversing the counter database with FindNext functions,
49 : ** the instantaneous values of any given counter is that at the
50 : ** moment of extraction. The state of the entire counter database
51 : ** may not be viewed as atomic.
52 : **
53 : ** The counter interface may be disabled (No-Op'd) at compile
54 : ** time. When DEBUG is defined at compile time, the Counter
55 : ** Feature is compiled into NSPR and applications invoking it.
56 : ** When DEBUG is not defined, the counter macros compile to
57 : ** nothing. To force the Counter Feature to be compiled into an
58 : ** optimized build, define FORCE_NSPR_COUNTERS at compile time
59 : ** for both NSPR and the application intending to use it.
60 : **
61 : ** Application designers should use the macro form of the Counter
62 : ** Feature methods to minimize performance impact in optimized
63 : ** builds. The macros normally compile to nothing on optimized
64 : ** builds.
65 : **
66 : ** Application designers should be aware of the effects of
67 : ** debug and optimized build differences when using result of the
68 : ** Counter Feature macros in expressions.
69 : **
70 : ** The Counter Feature is thread-safe and SMP safe.
71 : **
72 : ** /lth. 09-Jun-1998.
73 : */
74 :
75 : #include "prtypes.h"
76 :
77 : PR_BEGIN_EXTERN_C
78 :
79 : /*
80 : ** Opaque counter handle type.
81 : ** ... don't even think of looking in here.
82 : **
83 : */
84 : typedef void * PRCounterHandle;
85 :
86 : #define PRCOUNTER_NAME_MAX 31
87 : #define PRCOUNTER_DESC_MAX 255
88 :
89 :
90 :
91 : /* -----------------------------------------------------------------------
92 : ** FUNCTION: PR_DEFINE_COUNTER() -- Define a PRCounterHandle
93 : **
94 : ** DESCRIPTION: PR_DEFINE_COUNTER() is used to define a counter
95 : ** handle.
96 : **
97 : */
98 : #define PR_DEFINE_COUNTER(name) PRCounterHandle name
99 :
100 : /* -----------------------------------------------------------------------
101 : ** FUNCTION: PR_INIT_COUNTER_HANDLE() -- Set the value of a PRCounterHandle
102 : **
103 : ** DESCRIPTION:
104 : ** PR_INIT_COUNTER_HANDLE() sets the value of a PRCounterHandle
105 : ** to value.
106 : **
107 : */
108 : #if defined(DEBUG) || defined(FORCE_NSPR_COUNTERS)
109 : #define PR_INIT_COUNTER_HANDLE(handle,value)\
110 : (handle) = (PRCounterHandle)(value)
111 : #else
112 : #define PR_INIT_COUNTER_HANDLE(handle,value)
113 : #endif
114 :
115 : /* -----------------------------------------------------------------------
116 : ** FUNCTION: PR_CreateCounter() -- Create a counter
117 : **
118 : ** DESCRIPTION: PR_CreateCounter() creates a counter object and
119 : ** initializes it to zero.
120 : **
121 : ** The macro form takes as its first argument the name of the
122 : ** PRCounterHandle to receive the handle returned from
123 : ** PR_CreateCounter().
124 : **
125 : ** INPUTS:
126 : ** qName: The QName for the counter object. The maximum length
127 : ** of qName is defined by PRCOUNTER_NAME_MAX
128 : **
129 : ** rName: The RName for the counter object. The maximum length
130 : ** of qName is defined by PRCOUNTER_NAME_MAX
131 : **
132 : ** descrioption: The description of the counter object. The
133 : ** maximum length of description is defined by
134 : ** PRCOUNTER_DESC_MAX.
135 : **
136 : ** OUTPUTS:
137 : **
138 : ** RETURNS:
139 : ** PRCounterHandle.
140 : **
141 : ** RESTRICTIONS:
142 : **
143 : */
144 : #if defined(DEBUG) || defined(FORCE_NSPR_COUNTERS)
145 : #define PR_CREATE_COUNTER(handle,qName,rName,description)\
146 : (handle) = PR_CreateCounter((qName),(rName),(description))
147 : #else
148 : #define PR_CREATE_COUNTER(handle,qName,rName,description)
149 : #endif
150 :
151 : NSPR_API(PRCounterHandle)
152 0 : PR_CreateCounter(
153 : const char *qName,
154 : const char *rName,
155 : const char *description
156 : );
157 :
158 : /* -----------------------------------------------------------------------
159 : ** FUNCTION: PR_DestroyCounter() -- Destroy a counter object.
160 : **
161 : ** DESCRIPTION: PR_DestroyCounter() removes a counter and
162 : ** unregisters its handle from the counter database.
163 : **
164 : ** INPUTS:
165 : ** handle: the PRCounterHandle of the counter to be destroyed.
166 : **
167 : ** OUTPUTS:
168 : ** The counter is destroyed.
169 : **
170 : ** RETURNS: void
171 : **
172 : ** RESTRICTIONS:
173 : **
174 : */
175 : #if defined(DEBUG) || defined(FORCE_NSPR_COUNTERS)
176 : #define PR_DESTROY_COUNTER(handle) PR_DestroyCounter((handle))
177 : #else
178 : #define PR_DESTROY_COUNTER(handle)
179 : #endif
180 :
181 : NSPR_API(void)
182 0 : PR_DestroyCounter(
183 : PRCounterHandle handle
184 : );
185 :
186 :
187 : /* -----------------------------------------------------------------------
188 : ** FUNCTION: PR_GetCounterHandleFromName() -- Retreive a
189 : ** counter's handle give its name.
190 : **
191 : ** DESCRIPTION: PR_GetCounterHandleFromName() retreives a
192 : ** counter's handle from the counter database, given the name
193 : ** the counter was originally created with.
194 : **
195 : ** INPUTS:
196 : ** qName: Counter's original QName.
197 : ** rName: Counter's original RName.
198 : **
199 : ** OUTPUTS:
200 : **
201 : ** RETURNS:
202 : ** PRCounterHandle or PRCounterError.
203 : **
204 : ** RESTRICTIONS:
205 : **
206 : */
207 : #if defined(DEBUG) || defined(FORCE_NSPR_COUNTERS)
208 : #define PR_GET_COUNTER_HANDLE_FROM_NAME(handle,qName,rName)\
209 : (handle) = PR_GetCounterHandleFromName((qName),(rName))
210 : #else
211 : #define PR_GET_COUNTER_HANDLE_FROM_NAME(handle,qName,rName)
212 : #endif
213 :
214 : NSPR_API(PRCounterHandle)
215 0 : PR_GetCounterHandleFromName(
216 : const char *qName,
217 : const char *rName
218 : );
219 :
220 : /* -----------------------------------------------------------------------
221 : ** FUNCTION: PR_GetCounterNameFromHandle() -- Retreive a
222 : ** counter's name, given its handle.
223 : **
224 : ** DESCRIPTION: PR_GetCounterNameFromHandle() retreives a
225 : ** counter's name given its handle.
226 : **
227 : ** INPUTS:
228 : ** qName: Where to store a pointer to qName.
229 : ** rName: Where to store a pointer to rName.
230 : ** description: Where to store a pointer to description.
231 : **
232 : ** OUTPUTS: Pointers to the Counter Feature's copies of the names
233 : ** used when the counters were created.
234 : **
235 : ** RETURNS: void
236 : **
237 : ** RESTRICTIONS:
238 : **
239 : */
240 : #if defined(DEBUG) || defined(FORCE_NSPR_COUNTERS)
241 : #define PR_GET_COUNTER_NAME_FROM_HANDLE(handle,qName,rName,description)\
242 : PR_GetCounterNameFromHandle((handle),(qName),(rName),(description))
243 : #else
244 : #define PR_GET_COUNTER_NAME_FROM_HANDLE(handle,qName,rName,description )
245 : #endif
246 :
247 : NSPR_API(void)
248 0 : PR_GetCounterNameFromHandle(
249 : PRCounterHandle handle,
250 : const char **qName,
251 : const char **rName,
252 : const char **description
253 : );
254 :
255 :
256 : /* -----------------------------------------------------------------------
257 : ** FUNCTION: PR_IncrementCounter() -- Add one to the referenced
258 : ** counter.
259 : **
260 : ** DESCRIPTION: Add one to the referenced counter.
261 : **
262 : ** INPUTS:
263 : ** handle: The PRCounterHandle of the counter to be incremented
264 : **
265 : ** OUTPUTS: The counter is incrementd.
266 : **
267 : ** RETURNS: void
268 : **
269 : ** RESTRICTIONS:
270 : **
271 : */
272 : #if defined(DEBUG) || defined(FORCE_NSPR_COUNTERS)
273 : #define PR_INCREMENT_COUNTER(handle) PR_IncrementCounter(handle)
274 : #else
275 : #define PR_INCREMENT_COUNTER(handle)
276 : #endif
277 :
278 : NSPR_API(void)
279 0 : PR_IncrementCounter(
280 : PRCounterHandle handle
281 : );
282 :
283 :
284 : /* -----------------------------------------------------------------------
285 : ** FUNCTION: PR_DecrementCounter() -- Subtract one from the
286 : ** referenced counter
287 : **
288 : ** DESCRIPTION: Subtract one from the referenced counter.
289 : **
290 : ** INPUTS:
291 : ** handle: The PRCounterHandle of the coutner to be
292 : ** decremented.
293 : **
294 : ** OUTPUTS: the counter is decremented.
295 : **
296 : ** RETURNS: void
297 : **
298 : ** RESTRICTIONS:
299 : **
300 : */
301 : #if defined(DEBUG) || defined(FORCE_NSPR_COUNTERS)
302 : #define PR_DECREMENT_COUNTER(handle) PR_DecrementCounter(handle)
303 : #else
304 : #define PR_DECREMENT_COUNTER(handle)
305 : #endif
306 :
307 : NSPR_API(void)
308 0 : PR_DecrementCounter(
309 : PRCounterHandle handle
310 : );
311 :
312 : /* -----------------------------------------------------------------------
313 : ** FUNCTION: PR_AddToCounter() -- Add a value to a counter.
314 : **
315 : ** DESCRIPTION: Add value to the counter referenced by handle.
316 : **
317 : ** INPUTS:
318 : ** handle: the PRCounterHandle of the counter to be added to.
319 : **
320 : ** value: the value to be added to the counter.
321 : **
322 : ** OUTPUTS: new value for counter.
323 : **
324 : ** RETURNS: void
325 : **
326 : ** RESTRICTIONS:
327 : **
328 : */
329 : #if defined(DEBUG) || defined(FORCE_NSPR_COUNTERS)
330 : #define PR_ADD_TO_COUNTER(handle,value)\
331 : PR_AddToCounter((handle),(value))
332 : #else
333 : #define PR_ADD_TO_COUNTER(handle,value)
334 : #endif
335 :
336 : NSPR_API(void)
337 0 : PR_AddToCounter(
338 : PRCounterHandle handle,
339 : PRUint32 value
340 : );
341 :
342 :
343 : /* -----------------------------------------------------------------------
344 : ** FUNCTION: PR_SubtractFromCounter() -- A value is subtracted
345 : ** from a counter.
346 : **
347 : ** DESCRIPTION:
348 : ** Subtract a value from a counter.
349 : **
350 : ** INPUTS:
351 : ** handle: the PRCounterHandle of the counter to be subtracted
352 : ** from.
353 : **
354 : ** value: the value to be subtracted from the counter.
355 : **
356 : ** OUTPUTS: new value for counter
357 : **
358 : ** RETURNS: void
359 : **
360 : ** RESTRICTIONS:
361 : **
362 : */
363 : #if defined(DEBUG) || defined(FORCE_NSPR_COUNTERS)
364 : #define PR_SUBTRACT_FROM_COUNTER(handle,value)\
365 : PR_SubtractFromCounter((handle),(value))
366 : #else
367 : #define PR_SUBTRACT_FROM_COUNTER(handle,value)
368 : #endif
369 :
370 : NSPR_API(void)
371 0 : PR_SubtractFromCounter(
372 : PRCounterHandle handle,
373 : PRUint32 value
374 : );
375 :
376 :
377 : /* -----------------------------------------------------------------------
378 : ** FUNCTION: PR_GetCounter() -- Retreive the value of a counter
379 : **
380 : ** DESCRIPTION:
381 : ** Retreive the value of a counter.
382 : **
383 : ** INPUTS:
384 : ** handle: the PR_CounterHandle of the counter to be retreived
385 : **
386 : ** OUTPUTS:
387 : **
388 : ** RETURNS: The value of the referenced counter
389 : **
390 : ** RESTRICTIONS:
391 : **
392 : */
393 : #if defined(DEBUG) || defined(FORCE_NSPR_COUNTERS)
394 : #define PR_GET_COUNTER(counter,handle)\
395 : (counter) = PR_GetCounter((handle))
396 : #else
397 : #define PR_GET_COUNTER(counter,handle) 0
398 : #endif
399 :
400 : NSPR_API(PRUint32)
401 0 : PR_GetCounter(
402 : PRCounterHandle handle
403 : );
404 :
405 : /* -----------------------------------------------------------------------
406 : ** FUNCTION: PR_SetCounter() -- Replace the content of counter
407 : ** with value.
408 : **
409 : ** DESCRIPTION: The contents of the referenced counter are
410 : ** replaced by value.
411 : **
412 : ** INPUTS:
413 : ** handle: the PRCounterHandle of the counter whose contents
414 : ** are to be replaced.
415 : **
416 : ** value: the new value of the counter.
417 : **
418 : ** OUTPUTS:
419 : **
420 : ** RETURNS: void
421 : **
422 : ** RESTRICTIONS:
423 : **
424 : */
425 : #if defined(DEBUG) || defined(FORCE_NSPR_COUNTERS)
426 : #define PR_SET_COUNTER(handle,value) PR_SetCounter((handle),(value))
427 : #else
428 : #define PR_SET_COUNTER(handle,value)
429 : #endif
430 :
431 : NSPR_API(void)
432 0 : PR_SetCounter(
433 : PRCounterHandle handle,
434 : PRUint32 value
435 : );
436 :
437 :
438 : /* -----------------------------------------------------------------------
439 : ** FUNCTION: PR_FindNextCounterQname() -- Retreive the next QName counter
440 : ** handle iterator
441 : **
442 : ** DESCRIPTION:
443 : ** PR_FindNextCounterQname() retreives the first or next Qname
444 : ** the counter data base, depending on the value of handle. When
445 : ** handle is NULL, the function attempts to retreive the first
446 : ** QName handle in the database. When handle is a handle previosly
447 : ** retreived QName handle, then the function attempts to retreive
448 : ** the next QName handle.
449 : **
450 : ** INPUTS:
451 : ** handle: PRCounterHandle or NULL.
452 : **
453 : ** OUTPUTS: returned
454 : **
455 : ** RETURNS: PRCounterHandle or NULL when no more QName counter
456 : ** handles are present.
457 : **
458 : ** RESTRICTIONS:
459 : ** A concurrent PR_CreateCounter() or PR_DestroyCounter() may
460 : ** cause unpredictable results.
461 : **
462 : ** A PRCounterHandle returned from this function may only be used
463 : ** in another PR_FindNextCounterQname() function call; other
464 : ** operations may cause unpredictable results.
465 : **
466 : */
467 : #if defined(DEBUG) || defined(FORCE_NSPR_COUNTERS)
468 : #define PR_FIND_NEXT_COUNTER_QNAME(next,handle)\
469 : (next) = PR_FindNextCounterQname((handle))
470 : #else
471 : #define PR_FIND_NEXT_COUNTER_QNAME(next,handle) NULL
472 : #endif
473 :
474 : NSPR_API(PRCounterHandle)
475 0 : PR_FindNextCounterQname(
476 : PRCounterHandle handle
477 : );
478 :
479 : /* -----------------------------------------------------------------------
480 : ** FUNCTION: PR_FindNextCounterRname() -- Retreive the next RName counter
481 : ** handle iterator
482 : **
483 : ** DESCRIPTION:
484 : ** PR_FindNextCounterRname() retreives the first or next RNname
485 : ** handle from the counter data base, depending on the
486 : ** value of handle. When handle is NULL, the function attempts to
487 : ** retreive the first RName handle in the database. When handle is
488 : ** a handle previosly retreived RName handle, then the function
489 : ** attempts to retreive the next RName handle.
490 : **
491 : ** INPUTS:
492 : ** handle: PRCounterHandle or NULL.
493 : ** qhandle: PRCounterHandle of a previously aquired via
494 : ** PR_FIND_NEXT_QNAME_HANDLE()
495 : **
496 : ** OUTPUTS: returned
497 : **
498 : ** RETURNS: PRCounterHandle or NULL when no more RName counter
499 : ** handles are present.
500 : **
501 : ** RESTRICTIONS:
502 : ** A concurrent PR_CreateCounter() or PR_DestroyCounter() may
503 : ** cause unpredictable results.
504 : **
505 : ** A PRCounterHandle returned from this function may only be used
506 : ** in another PR_FindNextCounterRname() function call; other
507 : ** operations may cause unpredictable results.
508 : **
509 : */
510 : #if defined(DEBUG) || defined(FORCE_NSPR_COUNTERS)
511 : #define PR_FIND_NEXT_COUNTER_RNAME(next,rhandle,qhandle)\
512 : (next) = PR_FindNextCounterRname((rhandle),(qhandle))
513 : #else
514 : #define PR_FIND_NEXT_COUNTER_RNAME(next,rhandle,qhandle)
515 : #endif
516 :
517 : NSPR_API(PRCounterHandle)
518 0 : PR_FindNextCounterRname(
519 : PRCounterHandle rhandle,
520 : PRCounterHandle qhandle
521 : );
522 :
523 : PR_END_EXTERN_C
524 :
525 : #endif /* prcountr_h___ */
|