| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557 | /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- *//* ***** BEGIN LICENSE BLOCK ***** * Version: MPL 1.1/GPL 2.0/LGPL 2.1 * * The contents of this file are subject to the Mozilla Public License Version * 1.1 (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.mozilla.org/MPL/ * * Software distributed under the License is distributed on an "AS IS" basis, * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License * for the specific language governing rights and limitations under the * License. * * The Original Code is the Netscape Portable Runtime (NSPR). * * The Initial Developer of the Original Code is * Netscape Communications Corporation. * Portions created by the Initial Developer are Copyright (C) 1998-2000 * the Initial Developer. All Rights Reserved. * * Contributor(s): * * Alternatively, the contents of this file may be used under the terms of * either the GNU General Public License Version 2 or later (the "GPL"), or * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), * in which case the provisions of the GPL or the LGPL are applicable instead * of those above. If you wish to allow use of your version of this file only * under the terms of either the GPL or the LGPL, and not to allow others to * use your version of this file under the terms of the MPL, indicate your * decision by deleting the provisions above and replace them with the notice * and other provisions required by the GPL or the LGPL. If you do not delete * the provisions above, a recipient may use your version of this file under * the terms of any one of the MPL, the GPL or the LGPL. * * ***** END LICENSE BLOCK ***** */#ifndef prcountr_h___#define prcountr_h___/*----------------------------------------------------------------------------** prcountr.h -- NSPR Instrumentation counters**** The NSPR Counter Feature provides a means to "count** something." Counters can be dynamically defined, incremented,** decremented, set, and deleted under application program** control.** 																                   ** The Counter Feature is intended to be used as instrumentation,                  ** not as operational data. If you need a counter for operational                  ** data, use native integral types.                                                ** 																                   ** Counters are 32bit unsigned intergers. On overflow, a counter                   ** will wrap. No exception is recognized or reported.                              **                                                                                 ** A counter can be dynamically created using a two level naming** convention. A "handle" is returned when the counter is** created. The counter can subsequently be addressed by its** handle. An API is provided to get an existing counter's handle** given the names with  which it was originally created. ** Similarly, a counter's name can be retrieved given its handle.** ** The counter naming convention is a two-level hierarchy. The** QName is the higher level of the hierarchy; RName is the** lower level. RNames can be thought of as existing within a** QName. The same RName can exist within multiple QNames. QNames** are unique. The NSPR Counter is not a near-zero overhead** feature. Application designers should be aware of ** serialization issues when using the Counter API. Creating a** counter locks a large asset, potentially causing a stall. This** suggest that applications should create counters at component** initialization, for example, and not create and destroy them** willy-nilly. ... You have been warned.** ** Incrementing and Adding to counters uses atomic operations.** The performance of these operations will vary from platform** to platform. On platforms where atomic operations are not** supported the overhead may be substantial.** ** When traversing the counter database with FindNext functions,** the instantaneous values of any given counter is that at the** moment of extraction. The state of the entire counter database** may not be viewed as atomic.** ** The counter interface may be disabled (No-Op'd) at compile** time. When DEBUG is defined at compile time, the Counter** Feature is compiled into NSPR and applications invoking it.** When DEBUG is not defined, the counter macros compile to** nothing. To force the Counter Feature to be compiled into an** optimized build, define FORCE_NSPR_COUNTERS at compile time** for both NSPR and the application intending to use it.** ** Application designers should use the macro form of the Counter** Feature methods to minimize performance impact in optimized** builds. The macros normally compile to nothing on optimized** builds.** ** Application designers should be aware of the effects of** debug and optimized build differences when using result of the** Counter Feature macros in expressions.** ** The Counter Feature is thread-safe and SMP safe.** ** /lth. 09-Jun-1998.*/#include "prtypes.h"PR_BEGIN_EXTERN_C/*** Opaque counter handle type.** ... don't even think of looking in here.***/typedef void *  PRCounterHandle;#define PRCOUNTER_NAME_MAX 31#define PRCOUNTER_DESC_MAX 255/* -----------------------------------------------------------------------** FUNCTION: PR_DEFINE_COUNTER() -- Define a PRCounterHandle** ** DESCRIPTION: PR_DEFINE_COUNTER() is used to define a counter** handle.** */#define PR_DEFINE_COUNTER(name) PRCounterHandle name/* -----------------------------------------------------------------------** FUNCTION: PR_INIT_COUNTER_HANDLE() -- Set the value of a PRCounterHandle** ** DESCRIPTION: ** PR_INIT_COUNTER_HANDLE() sets the value of a PRCounterHandle** to value.** */#if defined(DEBUG) || defined(FORCE_NSPR_COUNTERS)#define PR_INIT_COUNTER_HANDLE(handle,value)\    (handle) = (PRCounterHandle)(value)#else#define PR_INIT_COUNTER_HANDLE(handle,value)#endif/* -----------------------------------------------------------------------** FUNCTION: PR_CreateCounter() -- Create a counter** ** DESCRIPTION: PR_CreateCounter() creates a counter object and** initializes it to zero.** ** The macro form takes as its first argument the name of the** PRCounterHandle to receive the handle returned from** PR_CreateCounter().** ** INPUTS:**  qName: The QName for the counter object. The maximum length** of qName is defined by PRCOUNTER_NAME_MAX** **  rName: The RName for the counter object. The maximum length** of qName is defined by PRCOUNTER_NAME_MAX** **  descrioption: The description of the counter object. The** maximum length of description is defined by** PRCOUNTER_DESC_MAX.** ** OUTPUTS:** ** RETURNS:**  PRCounterHandle.** ** RESTRICTIONS:** */#if defined(DEBUG) || defined(FORCE_NSPR_COUNTERS)#define PR_CREATE_COUNTER(handle,qName,rName,description)\   (handle) = PR_CreateCounter((qName),(rName),(description))#else#define PR_CREATE_COUNTER(handle,qName,rName,description)#endifNSPR_API(PRCounterHandle) 	PR_CreateCounter( 		const char *qName,     	const char *rName,         const char *description );/* -----------------------------------------------------------------------** FUNCTION: PR_DestroyCounter() -- Destroy a counter object.** ** DESCRIPTION: PR_DestroyCounter() removes a counter and** unregisters its handle from the counter database.** ** INPUTS:**  handle: the PRCounterHandle of the counter to be destroyed.** ** OUTPUTS: **  The counter is destroyed.** ** RETURNS: void** ** RESTRICTIONS:** */#if defined(DEBUG) || defined(FORCE_NSPR_COUNTERS)#define PR_DESTROY_COUNTER(handle) PR_DestroyCounter((handle))#else#define PR_DESTROY_COUNTER(handle)#endifNSPR_API(void) 	PR_DestroyCounter( 		PRCounterHandle handle );/* -----------------------------------------------------------------------** FUNCTION: PR_GetCounterHandleFromName() -- Retreive a** counter's handle give its name.** ** DESCRIPTION: PR_GetCounterHandleFromName() retreives a** counter's handle from the counter database, given the name** the counter was originally created with.** ** INPUTS:**  qName: Counter's original QName.**  rName: Counter's original RName.** ** OUTPUTS:** ** RETURNS: **  PRCounterHandle or PRCounterError.** ** RESTRICTIONS:** */#if defined(DEBUG) || defined(FORCE_NSPR_COUNTERS)#define PR_GET_COUNTER_HANDLE_FROM_NAME(handle,qName,rName)\    (handle) = PR_GetCounterHandleFromName((qName),(rName))#else#define PR_GET_COUNTER_HANDLE_FROM_NAME(handle,qName,rName)#endifNSPR_API(PRCounterHandle) 	PR_GetCounterHandleFromName(     	const char *qName,     	const char *rName );/* -----------------------------------------------------------------------** FUNCTION: PR_GetCounterNameFromHandle() -- Retreive a** counter's name, given its handle.** ** DESCRIPTION: PR_GetCounterNameFromHandle() retreives a** counter's name given its handle.** ** INPUTS:**  qName: Where to store a pointer to qName.**  rName: Where to store a pointer to rName.**  description: Where to store a pointer to description.** ** OUTPUTS: Pointers to the Counter Feature's copies of the names** used when the counters were created.** ** RETURNS: void** ** RESTRICTIONS:** */#if defined(DEBUG) || defined(FORCE_NSPR_COUNTERS)#define PR_GET_COUNTER_NAME_FROM_HANDLE(handle,qName,rName,description)\    PR_GetCounterNameFromHandle((handle),(qName),(rName),(description))#else#define PR_GET_COUNTER_NAME_FROM_HANDLE(handle,qName,rName,description )#endifNSPR_API(void) 	PR_GetCounterNameFromHandle(     	PRCounterHandle handle,  	    const char **qName, 	    const char **rName, 		const char **description );/* -----------------------------------------------------------------------** FUNCTION: PR_IncrementCounter() -- Add one to the referenced** counter.** ** DESCRIPTION: Add one to the referenced counter.** ** INPUTS:**  handle: The PRCounterHandle of the counter to be incremented** ** OUTPUTS: The counter is incrementd.** ** RETURNS: void** ** RESTRICTIONS:** */#if defined(DEBUG) || defined(FORCE_NSPR_COUNTERS)#define PR_INCREMENT_COUNTER(handle) PR_IncrementCounter(handle)#else#define PR_INCREMENT_COUNTER(handle)#endifNSPR_API(void) 	PR_IncrementCounter( 		PRCounterHandle handle);/* -----------------------------------------------------------------------** FUNCTION: PR_DecrementCounter() -- Subtract one from the** referenced counter** ** DESCRIPTION: Subtract one from the referenced counter.** ** INPUTS: **  handle: The PRCounterHandle of the coutner to be** decremented.** ** OUTPUTS: the counter is decremented.** ** RETURNS: void** ** RESTRICTIONS:** */#if defined(DEBUG) || defined(FORCE_NSPR_COUNTERS)#define PR_DECREMENT_COUNTER(handle) PR_DecrementCounter(handle)#else#define PR_DECREMENT_COUNTER(handle)#endifNSPR_API(void) 	PR_DecrementCounter( 		PRCounterHandle handle);/* -----------------------------------------------------------------------** FUNCTION: PR_AddToCounter() -- Add a value to a counter.** ** DESCRIPTION: Add value to the counter referenced by handle.** ** INPUTS:**  handle: the PRCounterHandle of the counter to be added to.** **  value: the value to be added to the counter.** ** OUTPUTS: new value for counter.** ** RETURNS: void** ** RESTRICTIONS:** */#if defined(DEBUG) || defined(FORCE_NSPR_COUNTERS)#define PR_ADD_TO_COUNTER(handle,value)\    PR_AddToCounter((handle),(value))#else#define PR_ADD_TO_COUNTER(handle,value)#endifNSPR_API(void) 	PR_AddToCounter(     	PRCounterHandle handle, 	    PRUint32 value );/* -----------------------------------------------------------------------** FUNCTION: PR_SubtractFromCounter() -- A value is subtracted** from a counter.** ** DESCRIPTION:** Subtract a value from a counter.** ** INPUTS:**  handle: the PRCounterHandle of the counter to be subtracted** from.** **  value: the value to be subtracted from the counter.** ** OUTPUTS: new value for counter** ** RETURNS: void** ** RESTRICTIONS:** */#if defined(DEBUG) || defined(FORCE_NSPR_COUNTERS)#define PR_SUBTRACT_FROM_COUNTER(handle,value)\    PR_SubtractFromCounter((handle),(value))#else#define PR_SUBTRACT_FROM_COUNTER(handle,value)#endifNSPR_API(void) 	PR_SubtractFromCounter(     	PRCounterHandle handle, 	    PRUint32 value );/* -----------------------------------------------------------------------** FUNCTION: PR_GetCounter() -- Retreive the value of a counter** ** DESCRIPTION:** Retreive the value of a counter.** ** INPUTS:**  handle: the PR_CounterHandle of the counter to be retreived** ** OUTPUTS:** ** RETURNS: The value of the referenced counter** ** RESTRICTIONS:** */#if defined(DEBUG) || defined(FORCE_NSPR_COUNTERS)#define PR_GET_COUNTER(counter,handle)\    (counter) = PR_GetCounter((handle))#else#define PR_GET_COUNTER(counter,handle) 0#endifNSPR_API(PRUint32) 	PR_GetCounter( 		PRCounterHandle handle );/* -----------------------------------------------------------------------** FUNCTION: PR_SetCounter() -- Replace the content of counter** with value.** ** DESCRIPTION: The contents of the referenced counter are** replaced by value.** ** INPUTS:**  handle: the PRCounterHandle of the counter whose contents** are to be replaced.** **  value: the new value of the counter.** ** OUTPUTS:** ** RETURNS: void** ** RESTRICTIONS:** */#if defined(DEBUG) || defined(FORCE_NSPR_COUNTERS)#define PR_SET_COUNTER(handle,value) PR_SetCounter((handle),(value))#else#define PR_SET_COUNTER(handle,value)#endifNSPR_API(void) 	PR_SetCounter( 		PRCounterHandle handle, 		PRUint32 value );/* -----------------------------------------------------------------------** FUNCTION: PR_FindNextCounterQname() -- Retreive the next QName counter** handle iterator** ** DESCRIPTION:** PR_FindNextCounterQname() retreives the first or next Qname** the counter data base, depending on the value of handle. When** handle is NULL, the function attempts to retreive the first** QName handle in the database. When handle is a handle previosly** retreived QName handle, then the function attempts to retreive** the next QName handle.** ** INPUTS: **  handle: PRCounterHandle or NULL.** ** OUTPUTS: returned** ** RETURNS: PRCounterHandle or NULL when no more QName counter** handles are present.** ** RESTRICTIONS:**  A concurrent PR_CreateCounter() or PR_DestroyCounter() may** cause unpredictable results.** ** A PRCounterHandle returned from this function may only be used** in another PR_FindNextCounterQname() function call; other** operations may cause unpredictable results.** */#if defined(DEBUG) || defined(FORCE_NSPR_COUNTERS)#define PR_FIND_NEXT_COUNTER_QNAME(next,handle)\    (next) = PR_FindNextCounterQname((handle))#else#define PR_FIND_NEXT_COUNTER_QNAME(next,handle) NULL#endifNSPR_API(PRCounterHandle) 	PR_FindNextCounterQname(         PRCounterHandle handle);/* -----------------------------------------------------------------------** FUNCTION: PR_FindNextCounterRname() -- Retreive the next RName counter** handle iterator** ** DESCRIPTION:** PR_FindNextCounterRname() retreives the first or next RNname** handle from the counter data base, depending on the** value of handle. When handle is NULL, the function attempts to** retreive the first RName handle in the database. When handle is** a handle previosly retreived RName handle, then the function** attempts to retreive the next RName handle.** ** INPUTS:**  handle: PRCounterHandle or NULL.**  qhandle: PRCounterHandle of a previously aquired via** PR_FIND_NEXT_QNAME_HANDLE()** ** OUTPUTS: returned** ** RETURNS: PRCounterHandle or NULL when no more RName counter** handles are present.** ** RESTRICTIONS:**  A concurrent PR_CreateCounter() or PR_DestroyCounter() may** cause unpredictable results.** ** A PRCounterHandle returned from this function may only be used** in another PR_FindNextCounterRname() function call; other** operations may cause unpredictable results.** */#if defined(DEBUG) || defined(FORCE_NSPR_COUNTERS)#define PR_FIND_NEXT_COUNTER_RNAME(next,rhandle,qhandle)\    (next) = PR_FindNextCounterRname((rhandle),(qhandle))#else#define PR_FIND_NEXT_COUNTER_RNAME(next,rhandle,qhandle)#endifNSPR_API(PRCounterHandle) 	PR_FindNextCounterRname(         PRCounterHandle rhandle,        PRCounterHandle qhandle);PR_END_EXTERN_C#endif /* prcountr_h___ */
 |