Back to index

lightning-sunbird  0.9+nobinonly
Classes | Typedefs | Functions | Variables
thrashgc.c File Reference
#include "prthread.h"
#include "prgc.h"
#include "prprf.h"
#include "prinrval.h"
#include "prlock.h"
#include "prinit.h"
#include "prcvar.h"
#include "private/pprthred.h"
#include <stdio.h>
#include <memory.h>
#include <string.h>

Go to the source code of this file.

Classes

struct  Type1
struct  Type2

Typedefs

typedef struct Type1
typedef struct Type2

Functions

static void PR_CALLBACK ScanType1 (void *obj)
static void PR_CALLBACK ScanType2 (void *obj)
Type1NewType1 (void)
Type2NewType2 (void)
voidNewBuffer (PRInt32 size)
static void PR_CALLBACK AllocStuff (void *unused)
static void usage (char *progname)
static int realMain (int argc, char **argv, char *notused)
static int padMain (int argc, char **argv)
int main (int argc, char **argv)
 The Xalan testcases app.

Variables

PRIntn failed_already = 0
PRIntn debug_mode
static char * progname
static PRInt32 loops = 1000
static int tix1
static int tix2
static int tix3
static GCInfogcInfo
static PRLockstderrLock
static GCType type1
static GCType type2
static GCType type3

Class Documentation

struct Type1

Definition at line 92 of file thrashgc.c.

Collaboration diagram for Type1:
Class Members
Type2 * atwo
Type1 * next
struct Type2

Definition at line 97 of file thrashgc.c.

Class Members
void * buf

Typedef Documentation

typedef struct Type1

Definition at line 89 of file thrashgc.c.

typedef struct Type2

Definition at line 90 of file thrashgc.c.


Function Documentation

static void PR_CALLBACK AllocStuff ( void unused) [static]

Definition at line 142 of file thrashgc.c.

                                                 {
  PRInt32 i;
  void* danglingRefs[50];
  PRIntervalTime start, end;
  char msg[100];

  start = PR_IntervalNow();
  for (i = 0; i < loops; i++) {
    void* p;
    if (i & 1) {
      Type1* t1 = NewType1();
      t1->atwo = NewType2();
      t1->next = NewType1();
      t1->atwo->buf = NewBuffer(100);
      p = t1;
    } else {
      Type2* t2 = NewType2();
      t2->buf = NewBuffer(i & 16383);
      p = t2;
    }
    if ((i % 10) == 0) {
      memmove(&danglingRefs[0], &danglingRefs[1], 49*sizeof(void*));
      danglingRefs[49] = p;
    }
  }
  end = PR_IntervalNow();
  if (debug_mode) PR_snprintf(msg, sizeof(msg), "Thread %p: %ld allocations took %ld ms",
             PR_GetCurrentThread(), loops,
             PR_IntervalToMilliseconds((PRIntervalTime) (end - start)));
  PR_Lock(stderrLock);
#ifndef XP_MAC
  fprintf(stderr, "%s\n", msg);
#else
  if (debug_mode) printf("%s\n", msg);
#endif
  PR_Unlock(stderrLock);
  }

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 250 of file thrashgc.c.

                                {
  int rv;

  debug_mode = 1;
  
  PR_Init(PR_USER_THREAD, PR_PRIORITY_NORMAL, 0);
  PR_SetThreadGCAble();

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

  PR_InitGC(0, 0, 0, PR_GLOBAL_THREAD);
  PR_STDIO_INIT();
  stderrLock = PR_NewLock();
  tix1 = PR_RegisterType(&type1);
  tix2 = PR_RegisterType(&type2);
  tix3 = PR_RegisterType(&type3);
  gcInfo = PR_GetGCInfo();
  rv = padMain(argc, argv);
  printf("PASS\n");
  PR_Cleanup();
  return rv;
}

Here is the call graph for this function:

void* NewBuffer ( PRInt32  size)

Definition at line 135 of file thrashgc.c.

                              {
    void* p = PR_AllocMemory(size, tix3, PR_ALLOC_DOUBLE);
    PR_ASSERT(p != NULL);
    return p;
}

Here is the caller graph for this function:

Definition at line 123 of file thrashgc.c.

                      {
    Type1* p = (Type1*) PR_AllocMemory(sizeof(Type1), tix1, PR_ALLOC_DOUBLE);
    PR_ASSERT(p != NULL);
    return p;
}

Here is the caller graph for this function:

Definition at line 129 of file thrashgc.c.

                      {
    Type2* p = (Type2*) PR_AllocMemory(sizeof(Type2), tix2, PR_ALLOC_DOUBLE);
    PR_ASSERT(p != NULL);
    return p;
}

Here is the caller graph for this function:

static int padMain ( int  argc,
char **  argv 
) [static]

Definition at line 245 of file thrashgc.c.

                                          {
  char pad[512];
  return realMain(argc, argv, pad);
}

Here is the call graph for this function:

Here is the caller graph for this function:

static int realMain ( int  argc,
char **  argv,
char *  notused 
) [static]

Definition at line 189 of file thrashgc.c.

                                                          {
  int i;
  int threads = 0;

#ifndef XP_MAC
  progname = strrchr(argv[0], '/');
  if (progname == 0) progname = argv[0];
  for (i = 1; i < argc; i++) {
    if (strcmp(argv[i], "-t") == 0) {
      if (i == argc - 1) {
       usage(progname);
      }
      threads = atoi(argv[++i]);
      if (threads < 0) threads = 0;
      if (threads > 10000) threads = 10000;
      continue;
    }
    if (strcmp(argv[i], "-l") == 0) {
      if (i == argc - 1) {
       usage(progname);
      }
      loops = atoi(argv[++i]);
      continue;
    }
    usage(progname);
  }
#else
       threads = 50;
#endif

  for (i = 0; i < threads; i++) {
    PRThread* thread;

    /* XXXXX */
    thread = PR_CreateThreadGCAble(PR_USER_THREAD,  /* thread type */
                          AllocStuff,  /* start function */
                          NULL,  /* arg */
                          PR_PRIORITY_NORMAL,  /* priority */
                          PR_LOCAL_THREAD,  /* thread scope */
                          PR_UNJOINABLE_THREAD,  /* thread state */
                          0);   /* stack size */
    if (thread == 0) {
#ifndef XP_MAC
      fprintf(stderr, "%s: no more threads (only %d were created)\n",
             progname, i);
#else
      printf("%s: no more threads (only %d were created)\n",
             progname, i);
#endif
      break;
    }
  }
  AllocStuff(NULL);
  return 0;
}

Here is the call graph for this function:

Here is the caller graph for this function:

static void PR_CALLBACK ScanType1 ( void obj) [static]

Definition at line 101 of file thrashgc.c.

                                             {
  gcInfo->livePointer(((Type1 *)obj)->atwo);
  gcInfo->livePointer(((Type1 *)obj)->next);
}
static void PR_CALLBACK ScanType2 ( void obj) [static]

Definition at line 106 of file thrashgc.c.

                                             {
  gcInfo->livePointer(((Type2 *)obj)->buf);
}
static void usage ( char *  progname) [static]

Definition at line 180 of file thrashgc.c.

                                  {
#ifndef XP_MAC
  fprintf(stderr, "Usage: %s [-t threads] [-l loops]\n", progname);
#else
  printf("Usage: %s [-t threads] [-l loops]\n", progname);
#endif
  exit(-1);
}

Here is the call graph for this function:


Variable Documentation

PRIntn debug_mode

Definition at line 81 of file thrashgc.c.

PRIntn failed_already = 0

Definition at line 80 of file thrashgc.c.

GCInfo* gcInfo [static]

Definition at line 86 of file thrashgc.c.

PRInt32 loops = 1000 [static]

Definition at line 84 of file thrashgc.c.

char* progname [static]

Definition at line 83 of file thrashgc.c.

PRLock* stderrLock [static]

Definition at line 87 of file thrashgc.c.

int tix1 [static]

Definition at line 85 of file thrashgc.c.

int tix2 [static]

Definition at line 85 of file thrashgc.c.

int tix3 [static]

Definition at line 85 of file thrashgc.c.

GCType type1 [static]
Initial value:
 {
    ScanType1
}

Definition at line 110 of file thrashgc.c.

GCType type2 [static]
Initial value:
 {
    ScanType2

}

Definition at line 114 of file thrashgc.c.

GCType type3 [static]
Initial value:
 {
  0
}

Definition at line 119 of file thrashgc.c.