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