Back to index

lightning-sunbird  0.9+nobinonly
Defines | Functions | Variables
sem.c File Reference
#include "plgetopt.h"
#include "nspr.h"
#include "prpriv.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "obsolete/prsem.h"

Go to the source code of this file.

Defines

#define SBSIZE   1024
#define BSIZE   100

Functions

static size_t dread (PRUintn device, char *buf, size_t bufSize)
static size_t dwrite (PRUintn device, char *buf, size_t bufSize)
static void PR_CALLBACK reader (void *arg)
static void writer (void)
int main (int argc, char **argv)
 The Xalan testcases app.

Variables

PRIntn failed_already = 0
PRIntn debug_mode
static char stdinBuf [SBSIZE]
static char stdoutBuf [SBSIZE]
static PRUintn stdinBufIdx = 0
static PRUintn stdoutBufIdx = 0
static PRStatus finalResult = PR_SUCCESS
PRSemaphoreemptyBufs
PRSemaphorefullBufs
struct {
char data [BSIZE]
PRUintn nbytes
buf [2]

Define Documentation

#define BSIZE   100

Definition at line 147 of file sem.c.

#define SBSIZE   1024

Definition at line 75 of file sem.c.


Function Documentation

static size_t dread ( PRUintn  device,
char *  buf,
size_t  bufSize 
) [static]

Definition at line 94 of file sem.c.

{
       PRUintn       i;
       
       /* during first read call, initialize the stdinBuf buffer*/
       if (stdinBufIdx == 0) {
              for (i=0; i<SBSIZE; i++)
                     stdinBuf[i] = i;
       }

       /* now copy data from stdinBuf to the given buffer upto bufSize */
       for (i=0; i<bufSize; i++) {
              if (stdinBufIdx == SBSIZE)
                     break;
              buf[i] = stdinBuf[stdinBufIdx++];
       }

       return i;
}

Here is the caller graph for this function:

static size_t dwrite ( PRUintn  device,
char *  buf,
size_t  bufSize 
) [static]

Definition at line 114 of file sem.c.

{
       PRUintn       i, j;
       
       /* copy data from the given buffer upto bufSize to stdoutBuf */
       for (i=0; i<bufSize; i++) {
              if (stdoutBufIdx == SBSIZE)
                     break;
              stdoutBuf[stdoutBufIdx++] = buf[i];
       }

       /* during last write call, compare the two buffers */
       if (stdoutBufIdx == SBSIZE)
              for (j=0; j<SBSIZE; j++)
                     if (stdinBuf[j] != stdoutBuf[j]) {
                            if (debug_mode) printf("data mismatch for index= %d \n", j);
                            finalResult = PR_FAILURE;
                     }

       return i;
}

Here is the caller graph for this function:

int main ( int  argc,
char **  argv 
)

The Xalan testcases app.

Definition at line 184 of file sem.c.

{
       PRThread *r;

    PR_STDIO_INIT();
    PR_Init(PR_USER_THREAD, PR_PRIORITY_NORMAL, 0);

    {
       /* 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, "d:");
       while (PL_OPT_EOL != (os = PL_GetNextOpt(opt)))
        {
              if (PL_OPT_BAD == os) continue;
            switch (opt->option)
            {
            case 'd':  /* debug mode */
                     debug_mode = 1;
                break;
             default:
                break;
            }
        }
       PL_DestroyOptState(opt);
    }        

 /* main test */

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

    emptyBufs = PR_NewSem(2);      /* two empty buffers */

    fullBufs = PR_NewSem(0);       /* zero full buffers */

       /* create the reader thread */
       
       r = PR_CreateThread(PR_USER_THREAD,
                                  reader, 0, 
                                  PR_PRIORITY_NORMAL,
                                  PR_LOCAL_THREAD,
                              PR_UNJOINABLE_THREAD,
                                  0);

       /* Do the writer operation in this thread */
       writer();

       PR_DestroySem(emptyBufs);
       PR_DestroySem(fullBufs);

       if (finalResult == PR_SUCCESS) {
              if (debug_mode) printf("sem Test Passed.\n");
       }
       else{
              if (debug_mode) printf("sem Test Failed.\n");
              failed_already=1;
       }
    PR_Cleanup();
       if(failed_already)   
              return 1;
       else
              return 0;
}

Here is the call graph for this function:

static void PR_CALLBACK reader ( void arg) [static]

Definition at line 154 of file sem.c.

{
       PRUintn       i = 0;
       size_t nbytes;
       
       do {
              (void) PR_WaitSem(emptyBufs);
              nbytes = dread(0, buf[i].data, BSIZE);
              buf[i].nbytes = nbytes;
              PR_PostSem(fullBufs);
              i = (i + 1) % 2;
       } while (nbytes > 0);
}

Here is the call graph for this function:

Here is the caller graph for this function:

static void writer ( void  ) [static]

Definition at line 168 of file sem.c.

{
       PRUintn       i = 0;
       size_t nbytes;
       
       do {
              (void) PR_WaitSem(fullBufs);
              nbytes = buf[i].nbytes;
              if (nbytes > 0) {
                     nbytes = dwrite(1, buf[i].data, nbytes);
                     PR_PostSem(emptyBufs);
                     i = (i + 1) % 2;
              }
       } while (nbytes > 0);
}

Here is the call graph for this function:

Here is the caller graph for this function:


Variable Documentation

struct { ... } buf[2]
PRIntn debug_mode

Definition at line 68 of file sem.c.

Definition at line 144 of file sem.c.

PRIntn failed_already = 0

Definition at line 67 of file sem.c.

Definition at line 91 of file sem.c.

Definition at line 145 of file sem.c.

char stdinBuf[SBSIZE] [static]

Definition at line 86 of file sem.c.

PRUintn stdinBufIdx = 0 [static]

Definition at line 89 of file sem.c.

char stdoutBuf[SBSIZE] [static]

Definition at line 87 of file sem.c.

PRUintn stdoutBufIdx = 0 [static]

Definition at line 90 of file sem.c.