nsprpub/pr/src/threads/prdump.c

Wed, 31 Dec 2014 06:55:46 +0100

author
Michael Schloh von Bennewitz <michael@schloh.com>
date
Wed, 31 Dec 2014 06:55:46 +0100
changeset 1
ca08bd8f51b2
permissions
-rw-r--r--

Added tag TORBROWSER_REPLICA for changeset 6474c204b198

     1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
     2 /* This Source Code Form is subject to the terms of the Mozilla Public
     3  * License, v. 2.0. If a copy of the MPL was not distributed with this
     4  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
     6 #include "primpl.h"
     8 #if defined(WIN95)
     9 /*
    10 ** Some local variables report warnings on Win95 because the code paths 
    11 ** using them are conditioned on HAVE_CUSTOME_USER_THREADS.
    12 ** The pragma suppresses the warning.
    13 ** 
    14 */
    15 #pragma warning(disable : 4101)
    16 #endif
    18 /* XXX use unbuffered nspr stdio */
    20 PRFileDesc *_pr_dumpOut;
    22 PRUint32 _PR_DumpPrintf(PRFileDesc *fd, const char *fmt, ...)
    23 {
    24     char buf[100];
    25     PRUint32 nb;
    26     va_list ap;
    28     va_start(ap, fmt);
    29     nb = PR_vsnprintf(buf, sizeof(buf), fmt, ap);
    30     va_end(ap);
    31     PR_Write(fd, buf, nb);
    33     return nb;
    34 }
    36 void _PR_DumpThread(PRFileDesc *fd, PRThread *thread)
    37 {
    39 #ifndef _PR_GLOBAL_THREADS_ONLY
    40     _PR_DumpPrintf(fd, "%05d[%08p] pri=%2d flags=0x%02x",
    41                    thread->id, thread, thread->priority, thread->flags);
    42     switch (thread->state) {
    43       case _PR_RUNNABLE:
    44       case _PR_RUNNING:
    45         break;
    46       case _PR_LOCK_WAIT:
    47         _PR_DumpPrintf(fd, " lock=%p", thread->wait.lock);
    48         break;
    49       case _PR_COND_WAIT:
    50         _PR_DumpPrintf(fd, " condvar=%p sleep=%lldms",
    51                        thread->wait.cvar, thread->sleep);
    52         break;
    53       case _PR_SUSPENDED:
    54         _PR_DumpPrintf(fd, " suspended");
    55         break;
    56     }
    57     PR_Write(fd, "\n", 1);
    58 #endif
    60     /* Now call dump routine */
    61     if (thread->dump) {
    62 	thread->dump(fd, thread, thread->dumpArg);
    63     }
    64 }
    66 static void DumpThreadQueue(PRFileDesc *fd, PRCList *list)
    67 {
    68 #ifndef _PR_GLOBAL_THREADS_ONLY
    69     PRCList *q;
    71     q = list->next;
    72     while (q != list) {
    73         PRThread *t = _PR_THREAD_PTR(q);
    74         _PR_DumpThread(fd, t);
    75         q = q->next;
    76     }
    77 #endif
    78 }
    80 void _PR_DumpThreads(PRFileDesc *fd)
    81 {
    82     PRThread *t;
    83     PRIntn i;
    85     _PR_DumpPrintf(fd, "Current Thread:\n");
    86     t = _PR_MD_CURRENT_THREAD();
    87     _PR_DumpThread(fd, t);
    89     _PR_DumpPrintf(fd, "Runnable Threads:\n");
    90     for (i = 0; i < 32; i++) {
    91         DumpThreadQueue(fd, &_PR_RUNQ(t->cpu)[i]);
    92     }
    94     _PR_DumpPrintf(fd, "CondVar timed wait Threads:\n");
    95     DumpThreadQueue(fd, &_PR_SLEEPQ(t->cpu));
    97     _PR_DumpPrintf(fd, "CondVar wait Threads:\n");
    98     DumpThreadQueue(fd, &_PR_PAUSEQ(t->cpu));
   100     _PR_DumpPrintf(fd, "Suspended Threads:\n");
   101     DumpThreadQueue(fd, &_PR_SUSPENDQ(t->cpu));
   102 }
   104 PR_IMPLEMENT(void) PR_ShowStatus(void)
   105 {
   106     PRIntn is;
   108     if ( _PR_MD_CURRENT_THREAD()
   109     && !_PR_IS_NATIVE_THREAD(_PR_MD_CURRENT_THREAD())) _PR_INTSOFF(is);
   110     _pr_dumpOut = _pr_stderr;
   111     _PR_DumpThreads(_pr_dumpOut);
   112     if ( _PR_MD_CURRENT_THREAD()
   113     && !_PR_IS_NATIVE_THREAD(_PR_MD_CURRENT_THREAD())) _PR_FAST_INTSON(is);
   114 }
   116 PR_IMPLEMENT(void)
   117 PR_SetThreadDumpProc(PRThread* thread, PRThreadDumpProc dump, void *arg)
   118 {
   119     thread->dump = dump;
   120     thread->dumpArg = arg;
   121 }

mercurial