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