Back to index

lightning-sunbird  0.9+nobinonly
Functions | Variables
threads.c File Reference
#include "nspr.h"
#include "prinrval.h"
#include "plgetopt.h"
#include "pprthred.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

Go to the source code of this file.

Functions

void PR_CALLBACK ReallyDumbThread (void *arg)
void PR_CALLBACK DumbThread (void *arg)
static void CreateThreads (PRThreadScope scope1, PRThreadScope scope2)
static void CreateThreadsUU (void)
static void CreateThreadsUK (void)
static void CreateThreadsKU (void)
static void CreateThreadsKK (void)
static void Measure (void(*func)(void), const char *msg)
int main (int argc, char **argv)
 The Xalan testcases app.

Variables

PRMonitormon
PRInt32 count
PRInt32 iterations
PRInt32 alive
PRBool debug_mode = PR_FALSE
PRBool passed = PR_TRUE

Function Documentation

static void CreateThreads ( PRThreadScope  scope1,
PRThreadScope  scope2 
) [static]

Definition at line 95 of file threads.c.

{
    PRThread *thr;
    int n;

    alive = 0;
    mon = PR_NewMonitor();

    alive = count;
    for (n=0; n<count; n++) {
        thr = PR_CreateThread(PR_USER_THREAD,
                              DumbThread, 
                              (void *)scope2, 
                              PR_PRIORITY_NORMAL,
                              scope1,
                              PR_UNJOINABLE_THREAD,
                              0);
        if (!thr) {
            if (debug_mode) {
                printf("Could not create dumb thread (%d, %d)!\n",
                        PR_GetError(), PR_GetOSError());
            }
            passed = PR_FALSE;
            alive--;
        }
         
        PR_Sleep(0);
    }

    /* Wait for all threads to exit */
    PR_EnterMonitor(mon);
    while (alive) {
        PR_Wait(mon, PR_INTERVAL_NO_TIMEOUT);
    }

    PR_ExitMonitor(mon);
       PR_DestroyMonitor(mon);
}

Here is the call graph for this function:

Here is the caller graph for this function:

static void CreateThreadsKK ( void  ) [static]

Definition at line 149 of file threads.c.

Here is the call graph for this function:

Here is the caller graph for this function:

static void CreateThreadsKU ( void  ) [static]

Definition at line 144 of file threads.c.

Here is the call graph for this function:

Here is the caller graph for this function:

static void CreateThreadsUK ( void  ) [static]

Definition at line 139 of file threads.c.

Here is the call graph for this function:

Here is the caller graph for this function:

static void CreateThreadsUU ( void  ) [static]

Definition at line 134 of file threads.c.

Here is the call graph for this function:

Here is the caller graph for this function:

Definition at line 66 of file threads.c.

{
    PRInt32 tmp = (PRInt32)arg;
    PRThreadScope scope = (PRThreadScope)tmp;
    PRThread *thr;

    thr = PR_CreateThread(PR_USER_THREAD,
                          ReallyDumbThread,
                          NULL,
                          PR_PRIORITY_NORMAL,
                          scope,
                          PR_JOINABLE_THREAD,
                          0);

    if (!thr) {
        if (debug_mode) {
            printf("Could not create really dumb thread (%d, %d)!\n",
                    PR_GetError(), PR_GetOSError());
        }
        passed = PR_FALSE;
    } else {
        PR_JoinThread(thr);
    }
    PR_EnterMonitor(mon);
    alive--;
    PR_Notify(mon);
    PR_ExitMonitor(mon);
}

Here is the call graph for this function:

Here is the caller graph for this function:

int main ( int  argc,
char **  argv 
)

The Xalan testcases app.

Definition at line 172 of file threads.c.

{
    int index;

    PR_STDIO_INIT();
    PR_Init(PR_USER_THREAD, PR_PRIORITY_HIGH, 0);
    
    {
       PLOptStatus os;
       PLOptState *opt = PL_CreateOptState(argc, argv, "dc:i:");
       while (PL_OPT_EOL != (os = PL_GetNextOpt(opt)))
        {
              if (PL_OPT_BAD == os) continue;
            switch (opt->option)
            {
            case 'd':  /* debug mode */
                     debug_mode = PR_TRUE;
                break;
            case 'c':  /* loop counter */
                     count = atoi(opt->value);
                break;
            case 'i':  /* loop counter */
                     iterations = atoi(opt->value);
                break;
             default:
                break;
            }
        }
       PL_DestroyOptState(opt);
    }

#ifdef XP_MAC
       SetupMacPrintfLog("threads.log");
       count = 10;
       iterations = 10;
       debug_mode = PR_TRUE;
#else
    if (0 == count) count = 50;
    if (0 == iterations) iterations = 10;

#endif

    if (debug_mode)
    {
    printf("\
** Tests lots of thread creations.  \n\
** Create %ld native threads %ld times. \n\
** Create %ld user threads %ld times \n", iterations,count,iterations,count);
    }

    for (index=0; index<iterations; index++) {
        Measure(CreateThreadsUU, "Create user/user threads");
        Measure(CreateThreadsUK, "Create user/native threads");
        Measure(CreateThreadsKU, "Create native/user threads");
        Measure(CreateThreadsKK, "Create native/native threads");
    }

    if (debug_mode) printf("\nNow switch to recycling threads \n\n");
    PR_SetThreadRecycleMode(1);

    for (index=0; index<iterations; index++) {
        Measure(CreateThreadsUU, "Create user/user threads");
        Measure(CreateThreadsUK, "Create user/native threads");
        Measure(CreateThreadsKU, "Create native/user threads");
        Measure(CreateThreadsKK, "Create native/native threads");
    }


    printf("%s\n", ((passed) ? "PASS" : "FAIL"));

    PR_Cleanup();

    if (passed) {
        return 0;
    } else {
        return 1;
    }
}

Here is the call graph for this function:

static void Measure ( void(*)(void func,
const char *  msg 
) [static]

Definition at line 156 of file threads.c.

{
    PRIntervalTime start, stop;
    double d;

    start = PR_IntervalNow();
    (*func)();
    stop = PR_IntervalNow();

    if (debug_mode)
    {
        d = (double)PR_IntervalToMicroseconds(stop - start);
        printf("%40s: %6.2f usec\n", msg, d / count);
    }
}

Here is the caller graph for this function:

Definition at line 59 of file threads.c.

{
    return;
}

Here is the caller graph for this function:


Variable Documentation

Definition at line 53 of file threads.c.

Definition at line 53 of file threads.c.

Definition at line 55 of file threads.c.

Definition at line 53 of file threads.c.

Definition at line 52 of file threads.c.

Definition at line 55 of file threads.c.