⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 prtrace.c

📁 Netscape NSPR库源码
💻 C
📖 第 1 页 / 共 2 页
字号:
                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 + -