Home | History | Annotate | Download | only in nspr
      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 prtrace_h___
     36 #define prtrace_h___
     37 /*
     38 ** prtrace.h -- NSPR's Trace Facility.
     39 **
     40 ** The Trace Facility provides a means to trace application
     41 ** program events within a process. When implementing an
     42 ** application program an engineer may insert a "Trace" function
     43 ** call, passing arguments to be traced. The "Trace" function
     44 ** combines the user trace data with identifying data and
     45 ** writes this data in time ordered sequence into a circular
     46 ** in-memory buffer; when the buffer fills, it wraps.
     47 **
     48 ** Functions are provided to set and/or re-configure the size of
     49 ** the trace buffer, control what events are recorded in the
     50 ** buffer, enable and disable tracing based on specific user
     51 ** supplied data and other control functions. Methods are provided
     52 ** to record the trace entries in the in-memory trace buffer to
     53 ** a file.
     54 **
     55 ** Tracing may cause a performance degredation to the application
     56 ** depending on the number and placement of calls to the tracing
     57 ** facility. When tracing is compiled in and all tracing is
     58 ** disabled via the runtime controls, the overhead should be
     59 ** minimal. ... Famous last words, eh?
     60 **
     61 ** When DEBUG is defined at compile time, the Trace Facility is
     62 ** compiled as part of NSPR and any application using NSPR's
     63 ** header files will have tracing compiled in. When DEBUG is not
     64 ** defined, the Trace Facility is not compiled into NSPR nor
     65 ** exported in its header files.  If the Trace Facility is
     66 ** desired in a non-debug build, then FORCE_NSPR_TRACE may be
     67 ** defined at compile time for both the optimized build of NSPR
     68 ** and the application. NSPR and any application using  NSPR's
     69 ** Trace Facility must be compiled with the same level of trace
     70 ** conditioning or unresolved references may be realized at link
     71 ** time.
     72 **
     73 ** For any of the Trace Facility methods that requires a trace
     74 ** handle as an input argument, the caller must ensure that the
     75 ** trace handle argument is valid. An invalid trace handle
     76 ** argument may cause unpredictable results.
     77 **
     78 ** Trace Facility methods are thread-safe and SMP safe.
     79 **
     80 ** Users of the Trace Facility should use the defined macros to
     81 ** invoke trace methods, not the function calls directly. e.g.
     82 ** PR_TRACE( h1,0,1,2, ...); not PR_Trace(h1,0,1,2, ...);
     83 **
     84 ** Application designers should be aware of the effects of
     85 ** debug and optimized build differences when using result of the
     86 ** Trace Facility macros in expressions.
     87 **
     88 ** See Also: prcountr.h
     89 **
     90 ** /lth. 08-Jun-1998.
     91 */
     92 
     93 #include "prtypes.h"
     94 #include "prthread.h"
     95 #include "prtime.h"
     96 
     97 PR_BEGIN_EXTERN_C
     98 
     99 /*
    100 ** Opaque type for the trace handle
    101 ** ... Don't even think about looking in here.
    102 **
    103 */
    104 typedef void *  PRTraceHandle;
    105 
    106 /*
    107 ** PRTraceEntry -- A trace entry in the in-memory trace buffer
    108 ** looks like this.
    109 **
    110 */
    111 typedef struct PRTraceEntry
    112 {
    113     PRThread        *thread;        /* The thread creating the trace entry */
    114     PRTraceHandle   handle;         /* PRTraceHandle creating the trace entry */
    115     PRTime          time;           /* Value of PR_Now() at time of trace entry */
    116     PRUint32        userData[8];    /* user supplied trace data */
    117 } PRTraceEntry;
    118 
    119 /*
    120 ** PRTraceOption -- command operands to
    121 ** PR_[Set|Get]TraceOption(). See descriptive meanings there.
    122 **
    123 */
    124 typedef enum PRTraceOption
    125 {
    126     PRTraceBufSize,
    127     PRTraceEnable,
    128     PRTraceDisable,
    129     PRTraceSuspend,
    130     PRTraceResume,
    131     PRTraceSuspendRecording,
    132     PRTraceResumeRecording,
    133     PRTraceLockHandles,
    134     PRTraceUnLockHandles,
    135     PRTraceStopRecording
    136 } PRTraceOption;
    137 
    138 /* -----------------------------------------------------------------------
    139 ** FUNCTION: PR_DEFINE_TRACE() -- Define a PRTraceHandle
    140 **
    141 ** DESCRIPTION: PR_DEFINE_TRACE() is used to define a trace
    142 ** handle.
    143 **
    144 */
    145 #define PR_DEFINE_TRACE(name) PRTraceHandle name
    146 
    147 /* -----------------------------------------------------------------------
    148 ** FUNCTION: PR_INIT_TRACE_HANDLE() -- Set the value of a PRTraceHandle
    149 **
    150 ** DESCRIPTION:
    151 ** PR_INIT_TRACE_HANDLE() sets the value of a PRTraceHandle
    152 ** to value. e.g. PR_INIT_TRACE_HANDLE( myHandle, NULL );
    153 **
    154 */
    155 #if defined (DEBUG) || defined (FORCE_NSPR_TRACE)
    156 #define PR_INIT_TRACE_HANDLE(handle,value)\
    157     (handle) = (PRCounterHandle)(value)
    158 #else
    159 #define PR_INIT_TRACE_HANDLE(handle,value)
    160 #endif
    161 
    162 
    163 /* -----------------------------------------------------------------------
    164 ** FUNCTION: PR_CreateTrace() -- Create a trace handle
    165 **
    166 ** DESCRIPTION:
    167 **  PR_CreateTrace() creates a new trace handle. Tracing is
    168 **  enabled for this handle when it is created. The trace handle
    169 **  is intended for use in other Trace Facility calls.
    170 **
    171 **  PR_CreateTrace() registers the QName, RName and description
    172 **  data so that this data can be retrieved later.
    173 **
    174 ** INPUTS:
    175 **  qName: pointer to string. QName for this trace handle.
    176 **
    177 **  rName: pointer to string. RName for this trace handle.
    178 **
    179 **  description: pointer to string. Descriptive data about this
    180 **  trace handle.
    181 **
    182 ** OUTPUTS:
    183 **  Creates the trace handle.
    184 **  Registers the QName and RName with the trace facility.
    185 **
    186 ** RETURNS:
    187 **  PRTraceHandle
    188 **
    189 ** RESTRICTIONS:
    190 **  qName is limited to 31 characters.
    191 **  rName is limited to 31 characters.
    192 **  description is limited to 255 characters.
    193 **
    194 */
    195 #define PRTRACE_NAME_MAX 31
    196 #define PRTRACE_DESC_MAX 255
    197 
    198 #if defined (DEBUG) || defined (FORCE_NSPR_TRACE)
    199 #define PR_CREATE_TRACE(handle,qName,rName,description)\
    200     (handle) = PR_CreateTrace((qName),(rName),(description))
    201 #else
    202 #define PR_CREATE_TRACE(handle,qName,rName,description)
    203 #endif
    204 
    205 NSPR_API(PRTraceHandle)
    206 	PR_CreateTrace(
    207     	const char *qName,          /* QName for this trace handle */
    208 	    const char *rName,          /* RName for this trace handle */
    209 	    const char *description     /* description for this trace handle */
    210 );
    211 
    212 
    213 /* -----------------------------------------------------------------------
    214 ** FUNCTION: PR_DestroyTrace() -- Destroy a trace handle
    215 **
    216 ** DESCRIPTION:
    217 **  PR_DestroyTrace() removes the referenced trace handle and
    218 ** associated QName, RName and description data from the Trace
    219 ** Facility.
    220 **
    221 ** INPUTS: handle. A PRTraceHandle
    222 **
    223 ** OUTPUTS:
    224 **  The trace handle is unregistered.
    225 **  The QName, RName and description are removed.
    226 **
    227 ** RETURNS: void
    228 **
    229 ** RESTRICTIONS:
    230 **
    231 */
    232 #if defined (DEBUG) || defined (FORCE_NSPR_TRACE)
    233 #define PR_DESTROY_TRACE(handle)\
    234     PR_DestroyTrace((handle))
    235 #else
    236 #define PR_DESTROY_TRACE(handle)
    237 #endif
    238 
    239 NSPR_API(void)
    240 	PR_DestroyTrace(
    241 		PRTraceHandle handle    /* Handle to be destroyed */
    242 );
    243 
    244 
    245 /* -----------------------------------------------------------------------
    246 ** FUNCTION: PR_Trace() -- Make a trace entry in the in-memory trace
    247 **
    248 ** DESCRIPTION:
    249 ** PR_Trace() makes an entry in the in-memory trace buffer for
    250 ** the referenced trace handle. The next logically available
    251 ** PRTraceEntry is used; when the next trace entry would overflow
    252 ** the trace table, the table wraps.
    253 **
    254 ** PR_Trace() for a specific trace handle may be disabled by
    255 ** calling PR_SetTraceOption() specifying PRTraceDisable for the
    256 ** trace handle to be disabled.
    257 **
    258 ** INPUTS:
    259 ** handle: PRTraceHandle. The trace handle for this trace.
    260 **
    261 ** userData[0..7]: unsigned 32bit integers. user supplied data
    262 ** that is copied into the PRTraceEntry
    263 **
    264 ** OUTPUTS:
    265 **  A PRTraceEntry is (conditionally) formatted in the in-memory
    266 ** trace buffer.
    267 **
    268 ** RETURNS: void.
    269 **
    270 ** RESTRICTIONS:
    271 **
    272 */
    273 #if defined (DEBUG) || defined (FORCE_NSPR_TRACE)
    274 #define PR_TRACE(handle,ud0,ud1,ud2,ud3,ud4,ud5,ud6,ud7)\
    275     PR_Trace((handle),(ud0),(ud1),(ud2),(ud3),(ud4),(ud5),(ud6),(ud7))
    276 #else
    277 #define PR_TRACE(handle,ud0,ud1,ud2,ud3,ud4,ud5,ud6,ud7)
    278 #endif
    279 
    280 NSPR_API(void)
    281 	PR_Trace(
    282     	PRTraceHandle handle,       /* use this trace handle */
    283 	    PRUint32    userData0,      /* User supplied data word 0 */
    284 	    PRUint32    userData1,      /* User supplied data word 1 */
    285 	    PRUint32    userData2,      /* User supplied data word 2 */
    286 	    PRUint32    userData3,      /* User supplied data word 3 */
    287 	    PRUint32    userData4,      /* User supplied data word 4 */
    288 	    PRUint32    userData5,      /* User supplied data word 5 */
    289 	    PRUint32    userData6,      /* User supplied data word 6 */
    290 	    PRUint32    userData7       /* User supplied data word 7 */
    291 );
    292 
    293 /* -----------------------------------------------------------------------
    294 ** FUNCTION: PR_SetTraceOption() -- Control the Trace Facility
    295 **
    296 ** DESCRIPTION:
    297 ** PR_SetTraceOption() controls the Trace Facility. Depending on
    298 ** command and value, attributes of the Trace Facility may be
    299 ** changed.
    300 **
    301 ** INPUTS:
    302 **  command: An enumerated value in the set of PRTraceOption.
    303 **  value: pointer to the data to be set. Type of the data is
    304 **  dependent on command; for each value of command, the type
    305 **  and meaning of dereferenced value is shown.
    306 **
    307 **  PRTraceBufSize: unsigned long: the size of the trace buffer,
    308 ** in bytes.
    309 **
    310 **  PRTraceEnable: PRTraceHandle. The trace handle to be
    311 ** enabled.
    312 **
    313 **  PRTraceDisable: PRTraceHandle. The trace handle to be
    314 ** disabled.
    315 **
    316 **  PRTraceSuspend: void. value must be NULL. All tracing is
    317 ** suspended.
    318 **
    319 **  PRTraceResume: void. value must be NULL. Tracing for all
    320 ** previously enabled, prior to a PRTraceSuspend, is resumed.
    321 **
    322 **  PRTraceStopRecording: void. value must be NULL. If recording
    323 ** (see: ** PR_RecordTraceEntries()) is being done,
    324 ** PRTraceStopRecording causes PR_RecordTraceEntries() to return
    325 ** to its caller. If recording is not being done, this function
    326 ** has no effect.
    327 **
    328 **  PRTraceSuspendRecording: void. Must be NULL. If recording is
    329 ** being done, PRTraceSuspendRecording causes further writes to
    330 ** the trace file to be suspended. Data in the in-memory
    331 ** trace buffer that would ordinarily be written to the
    332 ** trace file will not be written. Trace entries will continue
    333 ** to be entered in the in-memory buffer. If the Trace Facility
    334 ** recording is already in a suspended state, the call has no
    335 ** effect.
    336 **
    337 **  PRTraceResumeRecording: void. value must be NULL. If
    338 ** recording for the Trace Facility has been previously been
    339 ** suspended, this causes recording to resume. Recording resumes
    340 ** with the next in-memory buffer segment that would be written
    341 ** if trace recording had not been suspended. If recording is
    342 ** not currently suspended, the call has no effect.
    343 **
    344 **  PRTraceLockHandles: void. value must be NULL. Locks the
    345 ** trace handle lock. While the trace handle lock is held,
    346 ** calls to PR_CreateTrace() will block until the lock is
    347 ** released.
    348 **
    349 **  PRTraceUnlockHandles: void. value must be NULL. Unlocks the
    350 ** trace handle lock.
    351 **
    352 ** OUTPUTS:
    353 **  The operation of the Trace Facility may be changed.
    354 **
    355 ** RETURNS: void
    356 **
    357 ** RESTRICTIONS:
    358 **
    359 */
    360 #if defined (DEBUG) || defined (FORCE_NSPR_TRACE)
    361 #define PR_SET_TRACE_OPTION(command,value)\
    362     PR_SetTraceOption((command),(value))
    363 #else
    364 #define PR_SET_TRACE_OPTION(command,value)
    365 #endif
    366 
    367 NSPR_API(void)
    368 	PR_SetTraceOption(
    369 	    PRTraceOption command,  /* One of the enumerated values */
    370 	    void *value             /* command value or NULL */
    371 );
    372 
    373 
    374 /* -----------------------------------------------------------------------
    375 ** FUNCTION: PR_GetTraceOption() -- Retrieve settings from the Trace Facility
    376 **
    377 ** DESCRIPTION:
    378 ** PR_GetTraceOption() retrieves the current setting of the
    379 ** Trace Facility control depending on command.
    380 **
    381 **
    382 **  PRTraceBufSize: unsigned long: the size of the trace buffer,
    383 ** in bytes.
    384 **
    385 **
    386 ** INPUTS:
    387 **  command: one of the enumerated values in PRTraceOptions
    388 ** valid for PR_GetTraceOption().
    389 **
    390 ** OUTPUTS:
    391 **  dependent on command.
    392 **
    393 ** RETURNS: void
    394 **
    395 ** RESTRICTIONS:
    396 **
    397 */
    398 #if defined (DEBUG) || defined (FORCE_NSPR_TRACE)
    399 #define PR_GET_TRACE_OPTION(command,value)\
    400     PR_GetTraceOption((command),(value))
    401 #else
    402 #define PR_GET_TRACE_OPTION(command,value)
    403 #endif
    404 
    405 NSPR_API(void)
    406 	PR_GetTraceOption(
    407     	PRTraceOption command,  /* One of the enumerated values */
    408 	    void *value             /* command value or NULL */
    409 );
    410 
    411 /* -----------------------------------------------------------------------
    412 ** FUNCTION: PR_GetTraceHandleFromName() -- Retrieve an existing
    413 ** handle by name.
    414 **
    415 ** DESCRIPTION:
    416 ** PR_GetTraceHandleFromName() retreives an existing tracehandle
    417 ** using the name specified by qName and rName.
    418 **
    419 ** INPUTS:
    420 **  qName: pointer to string. QName for this trace handle.
    421 **
    422 **  rName: pointer to string. RName for this trace handle.
    423 **
    424 **
    425 ** OUTPUTS: returned.
    426 **
    427 ** RETURNS:
    428 **  PRTraceHandle associated with qName and rName or NULL when
    429 ** there is no match.
    430 **
    431 ** RESTRICTIONS:
    432 **
    433 */
    434 #if defined (DEBUG) || defined (FORCE_NSPR_TRACE)
    435 #define PR_GET_TRACE_HANDLE_FROM_NAME(handle,qName,rName)\
    436     (handle) = PR_GetTraceHandleFromName((qName),(rName))
    437 #else
    438 #define PR_GET_TRACE_HANDLE_FROM_NAME(handle,qName,rName)
    439 #endif
    440 
    441 NSPR_API(PRTraceHandle)
    442 	PR_GetTraceHandleFromName(
    443     	const char *qName,      /* QName search argument */
    444         const char *rName       /* RName search argument */
    445 );
    446 
    447 /* -----------------------------------------------------------------------
    448 ** FUNCTION: PR_GetTraceNameFromHandle() -- Retreive trace name
    449 ** by bandle.
    450 **
    451 ** DESCRIPTION:
    452 ** PR_GetTraceNameFromHandle() retreives the existing qName,
    453 ** rName, and description for the referenced trace handle.
    454 **
    455 ** INPUTS: handle: PRTraceHandle.
    456 **
    457 ** OUTPUTS: pointers to the Trace Facility's copy of qName,
    458 ** rName and description. ... Don't mess with these values.
    459 ** They're mine.
    460 **
    461 ** RETURNS: void
    462 **
    463 ** RESTRICTIONS:
    464 **
    465 */
    466 #if defined (DEBUG) || defined (FORCE_NSPR_TRACE)
    467 #define PR_GET_TRACE_NAME_FROM_HANDLE(handle,qName,rName,description)\
    468     PR_GetTraceNameFromHandle((handle),(qName),(rName),(description))
    469 #else
    470 #define PR_GET_TRACE_NAME_FROM_HANDLE(handle,qName,rName,description)
    471 #endif
    472 
    473 NSPR_API(void)
    474 	PR_GetTraceNameFromHandle(
    475     	PRTraceHandle handle,       /* handle as search argument */
    476 	    const char **qName,         /* pointer to associated QName */
    477 	    const char **rName,         /* pointer to associated RName */
    478     	const char **description    /* pointer to associated description */
    479 );
    480 
    481 /* -----------------------------------------------------------------------
    482 ** FUNCTION: PR_FindNextTraceQname() -- Retrieive a QName handle
    483 ** iterator.
    484 **
    485 ** DESCRIPTION:
    486 ** PR_FindNextTraceQname() retreives the first or next trace
    487 ** QName handle, depending on the value of handle, from the trace
    488 ** database. The PRTraceHandle returned can be used as an
    489 ** iterator to traverse the QName handles in the Trace database.
    490 **
    491 ** INPUTS:
    492 **  handle: When NULL, PR_FindNextQname() returns the first QName
    493 ** handle. When a handle is a valid PRTraceHandle previously
    494 ** retreived using PR_FindNextQname() the next QName handle is
    495 ** retreived.
    496 **
    497 ** OUTPUTS: returned.
    498 **
    499 ** RETURNS:
    500 **  PRTraceHandle or NULL when there are no trace handles.
    501 **
    502 ** RESTRICTIONS:
    503 **  Iterating thru the trace handles via FindFirst/FindNext
    504 ** should be done under protection of the trace handle lock.
    505 ** See: PR_SetTraceOption( PRLockTraceHandles ).
    506 **
    507 */
    508 #if defined (DEBUG) || defined (FORCE_NSPR_TRACE)
    509 #define PR_FIND_NEXT_TRACE_QNAME(next,handle)\
    510     (next) = PR_FindNextTraceQname((handle))
    511 #else
    512 #define PR_FIND_NEXT_TRACE_QNAME(next,handle)
    513 #endif
    514 
    515 NSPR_API(PRTraceHandle)
    516 	PR_FindNextTraceQname(
    517         PRTraceHandle handle
    518 );
    519 
    520 
    521 /* -----------------------------------------------------------------------
    522 ** FUNCTION: PR_FindNextTraceRname() -- Retrieive an RName handle
    523 ** iterator.
    524 **
    525 ** DESCRIPTION:
    526 ** PR_FindNextTraceRname() retreives the first or next trace
    527 ** RName handle, depending on the value of handle, from the trace
    528 ** database. The PRTraceHandle returned can be used as an
    529 ** iterator to traverse the RName handles in the Trace database.
    530 **
    531 ** INPUTS:
    532 **  rhandle: When NULL, PR_FindNextRname() returns the first
    533 ** RName handle. When a handle is a valid PRTraceHandle
    534 ** previously retreived using PR_FindNextRname() the next RName
    535 ** handle is retreived.
    536 **  qhandle: A valid PRTraceHandle retruned from a previous call
    537 ** to PR_FIND_NEXT_TRACE_QNAME().
    538 **
    539 ** OUTPUTS: returned.
    540 **
    541 ** RETURNS:
    542 **  PRTraceHandle or NULL when there are no trace handles.
    543 **
    544 ** RESTRICTIONS:
    545 **  Iterating thru the trace handles via FindNext should be done
    546 ** under protection of the trace handle lock. See: (
    547 ** PR_SetTraceOption( PRLockTraceHandles ).
    548 **
    549 */
    550 #if defined (DEBUG) || defined (FORCE_NSPR_TRACE)
    551 #define PR_FIND_NEXT_TRACE_RNAME(next,rhandle,qhandle)\
    552     (next) = PR_FindNextTraceRname((rhandle),(qhandle))
    553 #else
    554 #define PR_FIND_NEXT_TRACE_RNAME(next,rhandle,qhandle)
    555 #endif
    556 
    557 NSPR_API(PRTraceHandle)
    558 	PR_FindNextTraceRname(
    559         PRTraceHandle rhandle,
    560         PRTraceHandle qhandle
    561 );
    562 
    563 /* -----------------------------------------------------------------------
    564 ** FUNCTION: PR_RecordTraceEntries() -- Write trace entries to external media
    565 **
    566 ** DESCRIPTION:
    567 ** PR_RecordTraceEntries() causes entries in the in-memory trace
    568 ** buffer to be written to external media.
    569 **
    570 ** When PR_RecordTraceEntries() is called from an application
    571 ** thread, the function appears to block until another thread
    572 ** calls PR_SetTraceOption() with the PRTraceStopRecording
    573 ** option. This suggests that PR_RecordTraceEntries() should be
    574 ** called from a user supplied thread whose only job is to
    575 ** record trace entries.
    576 **
    577 ** The environment variable NSPR_TRACE_LOG controls the operation
    578 ** of this function. When NSPR_TRACE_LOG is not defined in the
    579 ** environment, no recording of trace entries occurs. When
    580 ** NSPR_TRACE_LOG is defined, the value of its definition must be
    581 ** the filename of the file to receive the trace entry buffer.
    582 **
    583 ** PR_RecordTraceEntries() attempts to record the in-memory
    584 ** buffer to a file, subject to the setting of the environment
    585 ** variable NSPR_TRACE_LOG. It is possible because of system
    586 ** load, the thread priority of the recording thread, number of
    587 ** active trace records being written over time, and other
    588 ** variables that some trace records can be lost. ... In other
    589 ** words: don't bet the farm on getting everything.
    590 **
    591 ** INPUTS: none
    592 **
    593 ** OUTPUTS: none
    594 **
    595 ** RETURNS: PR_STATUS
    596 **    PR_SUCCESS no errors were found.
    597 **    PR_FAILURE errors were found.
    598 **
    599 ** RESTRICTIONS:
    600 ** Only one thread can call PR_RecordTraceEntries() within a
    601 ** process.
    602 **
    603 ** On error, PR_RecordTraceEntries() may return prematurely.
    604 **
    605 */
    606 #if defined (DEBUG) || defined (FORCE_NSPR_TRACE)
    607 #define PR_RECORD_TRACE_ENTRIES()\
    608 	PR_RecordTraceEntries()
    609 #else
    610 #define PR_RECORD_TRACE_ENTRIES()
    611 #endif
    612 
    613 NSPR_API(void)
    614 	PR_RecordTraceEntries(
    615         void
    616 );
    617 
    618 /* -----------------------------------------------------------------------
    619 ** FUNCTION: PR_GetTraceEntries() -- Retreive trace entries from
    620 ** the Trace Facility
    621 **
    622 ** DESCRIPTION:
    623 ** PR_GetTraceEntries() retreives trace entries from the Trace
    624 ** Facility. Up to count trace entries are copied from the Trace
    625 ** Facility into buffer. Only those trace entries that have not
    626 ** been copied via a previous call to PR_GetTraceEntries() are
    627 ** copied. The actual number copied is placed in the PRInt32
    628 ** variable pointed to by found.
    629 **
    630 ** If more than count trace entries have entered the Trace
    631 ** Facility since the last call to PR_GetTraceEntries()
    632 ** a lost data condition is returned. In this case, the most
    633 ** recent count trace entries are copied into buffer and found is
    634 ** set to count.
    635 **
    636 ** INPUTS:
    637 **  count. The number of trace entries to be copied into buffer.
    638 **
    639 **
    640 ** OUTPUTS:
    641 **  buffer. An array of PRTraceEntries. The buffer is supplied
    642 ** by the caller.
    643 **
    644 ** found: 32bit signed integer. The number of PRTraceEntries
    645 ** actually copied. found is always less than or equal to count.
    646 **
    647 ** RETURNS:
    648 **  zero when there is no lost data.
    649 **  non-zero when some PRTraceEntries have been lost.
    650 **
    651 ** RESTRICTIONS:
    652 ** This is a real performance pig. The copy out operation is bad
    653 ** enough, but depending on then frequency of calls to the
    654 ** function, serious performance impact to the operating
    655 ** application may be realized. ... YMMV.
    656 **
    657 */
    658 #if defined (DEBUG) || defined (FORCE_NSPR_TRACE)
    659 #define PR_GET_TRACE_ENTRIES(buffer,count,found)\
    660         PR_GetTraceEntries((buffer),(count),(found))
    661 #else
    662 #define PR_GET_TRACE_ENTRIES(buffer,count,found)
    663 #endif
    664 
    665 NSPR_API(PRIntn)
    666     PR_GetTraceEntries(
    667         PRTraceEntry    *buffer,    /* where to write output */
    668         PRInt32         count,      /* number to get */
    669         PRInt32         *found      /* number you got */
    670 );
    671 
    672 PR_END_EXTERN_C
    673 
    674 #endif /* prtrace_h___ */
    675 
    676