Back to index

lightning-sunbird  0.9+nobinonly
Classes | Typedefs | Functions | Variables
gc1.c File Reference
#include "plgetopt.h"
#include "prgc.h"
#include "prinit.h"
#include "prmon.h"
#include "prinrval.h"
#include "private/pprthred.h"
#include <stdio.h>
#include <stdlib.h>

Go to the source code of this file.

Classes

struct  Array

Typedefs

typedef struct Array Array

Functions

static void PR_CALLBACK ScanArray (void *a)
static void PR_CALLBACK FinalizeArray (void *a)
static void PR_CALLBACK FreeArray (void *a)
static ArrayNewArray (PRUintn size)
static void Initialize (void)
static void PR_CALLBACK AllocateLikeMad (void *arg)
int main (int argc, char **argv)
 The Xalan testcases app.

Variables

static PRMonitormon
static PRInt32 threads
static PRInt32 waiting
static PRInt32 iterations
static PRInt32 scanCount
static PRInt32 finalizeCount
static PRInt32 freeCount
PRIntn failed_already = 0
PRIntn debug_mode
int arrayTypeIndex
GCType arrayType

Class Documentation

struct Array

Definition at line 71 of file gc1.c.

Class Members
void * body
PRUintn size

Typedef Documentation

typedef struct Array Array

Definition at line 123 of file nsCSSValue.h.


Function Documentation

static void PR_CALLBACK AllocateLikeMad ( void arg) [static]

Definition at line 125 of file gc1.c.

{
    Array *prev;
    PRInt32 i;
       PRInt32 count;

       count = (PRInt32)arg;
    prev = 0;
    for (i = 0; i < count; i++) {
        Array *leak = NewArray(i & 511);
        if ((i & 1023) == 0) {
            prev = 0;                   /* forget */
        } else {
            if (i & 1) {
                prev = leak;            /* remember */
            }
        }
    }
    PR_EnterMonitor(mon);
    waiting++;
    PR_Notify(mon);
    PR_ExitMonitor(mon);
}

Here is the call graph for this function:

Here is the caller graph for this function:

static void PR_CALLBACK FinalizeArray ( void a) [static]

Definition at line 84 of file gc1.c.

{
/*     printf ("In FinalizeArray a = %X size = %d \n", a, a->size); */       
       finalizeCount++;
}
static void PR_CALLBACK FreeArray ( void a) [static]

Definition at line 90 of file gc1.c.

{
/*     printf ("In FreeArray\n");  */
       freeCount++;
}
static void Initialize ( void  ) [static]

Definition at line 119 of file gc1.c.

{
    PR_InitGC(0, 0, 0, PR_GLOBAL_THREAD);
    arrayTypeIndex = PR_RegisterType(&arrayType);
}
int main ( int  argc,
char **  argv 
)

The Xalan testcases app.

Definition at line 149 of file gc1.c.

{
    PRIntervalTime start, stop, usec;
    double d;
    PRIntn i, totalIterations;
       /* The command line argument: -d is used to determine if the test is being run
       in debug mode. The regress tool requires only one line output:PASS or FAIL.
       All of the printfs associated with this test has been handled with a if (debug_mode)
       test.
       Usage: test_name -d
       */
       PLOptStatus os;
       PLOptState *opt = PL_CreateOptState(argc, argv, "dt:c:");

       threads = 10;
       iterations = 100;

       while (PL_OPT_EOL != (os = PL_GetNextOpt(opt)))
    {
        if (PL_OPT_BAD == os) {
            fprintf(stderr, "Invalid command-line option\n");
            exit(1);
        }
        switch (opt->option)
        {
        case 'd':  /* debug mode */
                     debug_mode = 1;
            break;
        case 't':  /* number of threads */
            threads = atoi(opt->value);
            break;
        case 'c':  /* iteration count */
            iterations = atoi(opt->value);
            break;
        default:
            break;
        }
    }
       PL_DestroyOptState(opt);

    fprintf(stderr, "t is %ld, i is %ld\n", (long) threads, (long) iterations);
       /* main test */

    PR_Init(PR_USER_THREAD, PR_PRIORITY_NORMAL, 5);
    PR_STDIO_INIT();
    Initialize();

#ifdef XP_MAC
       SetupMacPrintfLog("gc1.log");
       debug_mode = 1;
#endif

    /* Spin all of the allocator threads and then wait for them to exit */
    start = PR_IntervalNow();
    mon = PR_NewMonitor();
    PR_EnterMonitor(mon);
    waiting = 0;
    for (i = 0; i < threads; i++) {
        (void) PR_CreateThreadGCAble(PR_USER_THREAD,
                               AllocateLikeMad, (void*)iterations,
                                                PR_PRIORITY_NORMAL,
                                                PR_LOCAL_THREAD,
                                            PR_UNJOINABLE_THREAD,
                                                0);
    }
    while (waiting != threads) {
        PR_Wait(mon, PR_INTERVAL_NO_TIMEOUT);
    }
    PR_ExitMonitor(mon);

       PR_GC();
       PR_ForceFinalize();  

       totalIterations = iterations * threads;
/*
       if (scanCount != totalIterations)
              printf ("scanCount discrepancy scanCount = %d totalIterations = %d \n", 
                     scanCount, totalIterations);
       if (freeCount != totalIterations)
              printf ("freeCount discrepancy freeCount = %d totalIterations = %d \n", 
                     freeCount, totalIterations);
       if ((finalizeCount != totalIterations) && (finalizeCount != (totalIterations-1)))
              printf ("finalizeCount discrepancy finalizeCount = %d totalIterations = %d \n", 
                     finalizeCount,totalIterations);
*/

    stop = PR_IntervalNow();
    
    usec = stop = stop - start;
    d = (double)usec;

    if (debug_mode) printf("%40s: %6.2f usec\n", "GC allocation", d / (iterations * threads));
       else {
              if (d == 0.0) failed_already = PR_TRUE;

       }

    PR_Cleanup();
       if(failed_already)   
       {
           printf("FAIL\n");
              return 1;
       }
       else
       {
           printf("PASS\n");
              return 0;
       }
}

Here is the call graph for this function:

static Array* NewArray ( PRUintn  size) [static]

Definition at line 96 of file gc1.c.

{
    Array *a;

    a = (Array *)PR_AllocMemory(sizeof(Array) + size*sizeof(void*) - 1*sizeof(void*),
                       arrayTypeIndex, PR_ALLOC_CLEAN);

/*     printf ("In NewArray a = %X \n", a); */   

    if (a)
        a->size = size;
    return a;
}

Here is the caller graph for this function:

static void PR_CALLBACK ScanArray ( void a) [static]

Definition at line 78 of file gc1.c.

{
/*     printf ("In ScanArray a = %X size = %d \n", a, a->size); */
       scanCount++;
}

Variable Documentation

Initial value:

Definition at line 110 of file gc1.c.

Definition at line 76 of file gc1.c.

PRIntn debug_mode

Definition at line 68 of file gc1.c.

PRIntn failed_already = 0

Definition at line 67 of file gc1.c.

Definition at line 65 of file gc1.c.

PRInt32 freeCount [static]

Definition at line 65 of file gc1.c.

PRInt32 iterations [static]

Definition at line 64 of file gc1.c.

PRMonitor* mon [static]

Definition at line 63 of file gc1.c.

PRInt32 scanCount [static]

Definition at line 65 of file gc1.c.

PRInt32 threads [static]

Definition at line 64 of file gc1.c.

PRInt32 waiting [static]

Definition at line 64 of file gc1.c.