📄 prtrace.c
字号:
case PRTraceDisable : rnp = *(RName **)value; rnp->state = Suspended; PR_LOG( lm, PR_LOG_DEBUG, ("PRSetTraceOption: PRTraceDisable: %p", rnp)); break; case PRTraceSuspend : traceState = Suspended; PR_LOG( lm, PR_LOG_DEBUG, ("PRSetTraceOption: PRTraceSuspend")); break; case PRTraceResume : traceState = Running; PR_LOG( lm, PR_LOG_DEBUG, ("PRSetTraceOption: PRTraceResume")); break; case PRTraceSuspendRecording : PR_Lock( logLock ); logOrder = LogSuspend; PR_NotifyCondVar( logCVar ); PR_Unlock( logLock ); PR_LOG( lm, PR_LOG_DEBUG, ("PRSetTraceOption: PRTraceSuspendRecording")); break; case PRTraceResumeRecording : PR_LOG( lm, PR_LOG_DEBUG, ("PRSetTraceOption: PRTraceResumeRecording")); if ( logState != LogSuspend ) break; PR_Lock( logLock ); logOrder = LogResume; PR_NotifyCondVar( logCVar ); PR_Unlock( logLock ); break; case PRTraceStopRecording : PR_Lock( logLock ); logOrder = LogStop; PR_NotifyCondVar( logCVar ); PR_Unlock( logLock ); PR_LOG( lm, PR_LOG_DEBUG, ("PRSetTraceOption: PRTraceStopRecording")); break; case PRTraceLockHandles : PR_LOG( lm, PR_LOG_DEBUG, ("PRSetTraceOption: PRTraceLockTraceHandles")); PR_Lock( traceLock ); break; case PRTraceUnLockHandles : PR_LOG( lm, PR_LOG_DEBUG, ("PRSetTraceOption: PRTraceUnLockHandles")); PR_Lock( traceLock ); break; default: PR_LOG( lm, PR_LOG_ERROR, ("PRSetTraceOption: Invalid command %ld", command )); PR_ASSERT( 0 ); break; } /* end switch() */ return;} /* end PR_SetTraceOption() *//****/PR_IMPLEMENT(void) PR_GetTraceOption( PRTraceOption command, /* One of the enumerated values */ void *value /* command value or NULL */){ switch ( command ) { case PRTraceBufSize : *((PRInt32 *)value) = bufSize; PR_LOG( lm, PR_LOG_DEBUG, ("PRGetTraceOption: PRTraceBufSize: %ld", bufSize )); break; default: PR_LOG( lm, PR_LOG_ERROR, ("PRGetTraceOption: Invalid command %ld", command )); PR_ASSERT( 0 ); break; } /* end switch() */ return;} /* end PR_GetTraceOption() *//****/PR_IMPLEMENT(PRTraceHandle) PR_GetTraceHandleFromName( const char *qName, /* QName search argument */ const char *rName /* RName search argument */){ const char *qn, *rn, *desc; PRTraceHandle qh, rh; RName *rnp = NULL; PR_LOG( lm, PR_LOG_DEBUG, ("PRTrace: GetTraceHandleFromName:\n\t" "QName: %s, RName: %s", qName, rName )); qh = PR_FindNextTraceQname( NULL ); while (qh != NULL) { rh = PR_FindNextTraceRname( NULL, qh ); while ( rh != NULL ) { PR_GetTraceNameFromHandle( rh, &qn, &rn, &desc ); if ( (strcmp( qName, qn ) == 0) && (strcmp( rName, rn ) == 0 )) { rnp = (RName *)rh; goto foundIt; } rh = PR_FindNextTraceRname( rh, qh ); } qh = PR_FindNextTraceQname( NULL ); }foundIt: PR_LOG( lm, PR_LOG_DEBUG, ("PR_Counter: GetConterHandleFromName: %p", rnp )); return(rh);} /* end PR_GetTraceHandleFromName() *//****/PR_IMPLEMENT(void) PR_GetTraceNameFromHandle( PRTraceHandle handle, /* handle as search argument */ const char **qName, /* pointer to associated QName */ const char **rName, /* pointer to associated RName */ const char **description /* pointer to associated description */){ RName *rnp = (RName *)handle; QName *qnp = rnp->qName; *qName = qnp->name; *rName = rnp->name; *description = rnp->desc; PR_LOG( lm, PR_LOG_DEBUG, ("PRTrace: GetConterNameFromHandle: " "QNp: %p, RNp: %p,\n\tQName: %s, RName: %s, Desc: %s", qnp, rnp, qnp->name, rnp->name, rnp->desc )); return;} /* end PR_GetTraceNameFromHandle() *//****/PR_IMPLEMENT(PRTraceHandle) PR_FindNextTraceQname( PRTraceHandle handle){ QName *qnp = (QName *)handle; if ( PR_CLIST_IS_EMPTY( &qNameList )) qnp = NULL; else if ( qnp == NULL ) qnp = (QName *)PR_LIST_HEAD( &qNameList ); else if ( PR_NEXT_LINK( &qnp->link ) == &qNameList ) qnp = NULL; else qnp = (QName *)PR_NEXT_LINK( &qnp->link ); PR_LOG( lm, PR_LOG_DEBUG, ("PRTrace: FindNextQname: Handle: %p, Returns: %p", handle, qnp )); return((PRTraceHandle)qnp);} /* end PR_FindNextTraceQname() *//****/PR_IMPLEMENT(PRTraceHandle) PR_FindNextTraceRname( PRTraceHandle rhandle, PRTraceHandle qhandle){ RName *rnp = (RName *)rhandle; QName *qnp = (QName *)qhandle; if ( PR_CLIST_IS_EMPTY( &qnp->rNameList )) rnp = NULL; else if ( rnp == NULL ) rnp = (RName *)PR_LIST_HEAD( &qnp->rNameList ); else if ( PR_NEXT_LINK( &rnp->link ) == &qnp->rNameList ) rnp = NULL; else rnp = (RName *)PR_NEXT_LINK( &rnp->link ); PR_LOG( lm, PR_LOG_DEBUG, ("PRTrace: FindNextRname: Rhandle: %p, QHandle: %p, Returns: %p", rhandle, qhandle, rnp )); return((PRTraceHandle)rnp);} /* end PR_FindNextTraceRname() */ /****/static PRFileDesc * InitializeRecording( void ){ char *logFileName; PRFileDesc *logFile; /* Self initialize, if necessary */ if ( traceLock == NULL ) _PR_InitializeTrace(); PR_LOG( lm, PR_LOG_DEBUG, ("PR_RecordTraceEntries: begins")); logLostData = 0; /* reset at entry */ logState = LogReset; /* Get the filename for the logfile from the environment */ logFileName = PR_GetEnv( "NSPR_TRACE_LOG" ); if ( logFileName == NULL ) { PR_LOG( lm, PR_LOG_ERROR, ("RecordTraceEntries: Environment variable not defined. Exiting")); return NULL; } /* Open the logfile */ logFile = PR_Open( logFileName, PR_WRONLY | PR_CREATE_FILE, 0666 ); if ( logFile == NULL ) { PR_LOG( lm, PR_LOG_ERROR, ("RecordTraceEntries: Cannot open %s as trace log file. OS error: %ld", logFileName, PR_GetOSError())); return NULL; } return logFile;} /* end InitializeRecording() *//****/static void ProcessOrders( void ){ switch ( logOrder ) { case LogReset : logOrder = logState = localState; PR_LOG( lm, PR_LOG_DEBUG, ("RecordTraceEntries: LogReset")); break; case LogSuspend : localState = logOrder = logState = LogSuspend; PR_LOG( lm, PR_LOG_DEBUG, ("RecordTraceEntries: LogSuspend")); break; case LogResume : localState = logOrder = logState = LogActive; PR_LOG( lm, PR_LOG_DEBUG, ("RecordTraceEntries: LogResume")); break; case LogStop : logOrder = logState = LogStop; PR_LOG( lm, PR_LOG_DEBUG, ("RecordTraceEntries: LogStop")); break; default : PR_LOG( lm, PR_LOG_ERROR, ("RecordTraceEntries: Invalid logOrder: %ld", logOrder )); PR_ASSERT( 0 ); break; } /* end switch() */ return ;} /* end ProcessOrders() *//****/static void WriteTraceSegment( PRFileDesc *logFile, void *buf, PRInt32 amount ){ PRInt32 rc; PR_LOG( lm, PR_LOG_ERROR, ("WriteTraceSegment: Buffer: %p, Amount: %ld", buf, amount)); rc = PR_Write( logFile, buf , amount ); if ( rc == -1 ) PR_LOG( lm, PR_LOG_ERROR, ("RecordTraceEntries: PR_Write() failed. Error: %ld", PR_GetError() )); else if ( rc != amount ) PR_LOG( lm, PR_LOG_ERROR, ("RecordTraceEntries: PR_Write() Tried to write: %ld, Wrote: %ld", amount, rc)); else PR_LOG( lm, PR_LOG_DEBUG, ("RecordTraceEntries: PR_Write(): Buffer: %p, bytes: %ld", buf, amount)); return;} /* end WriteTraceSegment() *//****/PR_IMPLEMENT(void) PR_RecordTraceEntries( void ){ PRFileDesc *logFile; PRInt32 lostSegments; PRInt32 currentSegment = 0; void *buf; PRBool doWrite; logFile = InitializeRecording(); if ( logFile == NULL ) { PR_LOG( lm, PR_LOG_DEBUG, ("PR_RecordTraceEntries: Failed to initialize")); return; } /* Do this until told to stop */ while ( logState != LogStop ) { PR_Lock( logLock ); while ( (logCount == 0) && ( logOrder == logState ) ) PR_WaitCondVar( logCVar, PR_INTERVAL_NO_TIMEOUT ); /* Handle state transitions */ if ( logOrder != logState ) ProcessOrders(); /* recalculate local controls */ if ( logCount ) { lostSegments = logCount - logSegments; if ( lostSegments > 0 ) { logLostData += ( logCount - logSegments ); logCount = (logCount % logSegments); currentSegment = logCount; PR_LOG( lm, PR_LOG_DEBUG, ("PR_RecordTraceEntries: LostData segments: %ld", logLostData)); } else { logCount--; } buf = tBuf + ( logEntriesPerSegment * currentSegment ); if (++currentSegment >= logSegments ) currentSegment = 0; doWrite = PR_TRUE; } else doWrite = PR_FALSE; PR_Unlock( logLock ); if ( doWrite == PR_TRUE ) { if ( localState != LogSuspend ) WriteTraceSegment( logFile, buf, logSegSize ); else PR_LOG( lm, PR_LOG_DEBUG, ("RecordTraceEntries: PR_Write(): is suspended" )); } } /* end while(logState...) */ PR_Close( logFile ); PR_LOG( lm, PR_LOG_DEBUG, ("RecordTraceEntries: exiting")); return;} /* end PR_RecordTraceEntries() *//****/PR_IMPLEMENT(PRIntn) PR_GetTraceEntries( PRTraceEntry *buffer, /* where to write output */ PRInt32 count, /* number to get */ PRInt32 *found /* number you got */){ PRInt32 rc; PRInt32 copied = 0; PR_Lock( traceLock ); /* ** Depending on where the LastSeen and Next indices are, ** copy the trace buffer in one or two pieces. */ PR_LOG( lm, PR_LOG_ERROR, ("PR_GetTraceEntries: Next: %ld, LastSeen: %ld", next, fetchLastSeen)); if ( fetchLastSeen <= next ) { while (( count-- > 0 ) && (fetchLastSeen < next )) { *(buffer + copied++) = *(tBuf + fetchLastSeen++); } PR_LOG( lm, PR_LOG_ERROR, ("PR_GetTraceEntries: Copied: %ld, LastSeen: %ld", copied, fetchLastSeen)); } else /* copy in 2 parts */ { while ( count-- > 0 && fetchLastSeen <= last ) { *(buffer + copied++) = *(tBuf + fetchLastSeen++); } fetchLastSeen = 0; PR_LOG( lm, PR_LOG_ERROR, ("PR_GetTraceEntries: Copied: %ld, LastSeen: %ld", copied, fetchLastSeen)); while ( count-- > 0 && fetchLastSeen < next ) { *(buffer + copied++) = *(tBuf + fetchLastSeen++); } PR_LOG( lm, PR_LOG_ERROR, ("PR_GetTraceEntries: Copied: %ld, LastSeen: %ld", copied, fetchLastSeen)); } *found = copied; rc = ( fetchLostData == PR_TRUE )? 1 : 0; fetchLostData = PR_FALSE; PR_Unlock( traceLock ); return rc;} /* end PR_GetTraceEntries() */#else /* !defined(FORCE_NSPR_TRACE) *//*** The trace facility is not defined when !DEBUG and !FORCE_NSPR_TRACE***//* Some compilers don't like an empty compilation unit. */static int dummy = 0;#endif /* defined(FORCE_NSPR_TRACE) *//* end prtrace.c */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -