diff options
Diffstat (limited to 'nsprpub/pr/tests/sem.c')
-rw-r--r-- | nsprpub/pr/tests/sem.c | 245 |
1 files changed, 129 insertions, 116 deletions
diff --git a/nsprpub/pr/tests/sem.c b/nsprpub/pr/tests/sem.c index ec7bb6e2c..80db76d2e 100644 --- a/nsprpub/pr/tests/sem.c +++ b/nsprpub/pr/tests/sem.c @@ -11,12 +11,12 @@ ** ** Modification History: ** 20-May-97 AGarcia- Converted the test to accomodate the debug_mode flag. -** The debug mode will print all of the printfs associated with this test. -** The regress mode will be the default mode. Since the regress tool limits +** The debug mode will print all of the printfs associated with this test. +** The regress mode will be the default mode. Since the regress tool limits ** the output to a one line status:PASS or FAIL,all of the printf statements -** have been handled with an if (debug_mode) statement. +** have been handled with an if (debug_mode) statement. ** 04-June-97 AGarcia removed the Test_Result function. Regress tool has been updated to -** recognize the return code from tha main program. +** recognize the return code from tha main program. ***********************************************************************/ /*********************************************************************** @@ -35,9 +35,9 @@ PRIntn failed_already=0; PRIntn debug_mode; -/* - Since we don't have stdin, stdout everywhere, we will fake - it with our in-memory buffers called stdin and stdout. +/* + Since we don't have stdin, stdout everywhere, we will fake + it with our in-memory buffers called stdin and stdout. */ #define SBSIZE 1024 @@ -54,156 +54,169 @@ static PRStatus finalResult = PR_SUCCESS; static size_t dread (PRUintn device, char *buf, size_t bufSize) { - 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; + 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; } static size_t dwrite (PRUintn device, char *buf, size_t bufSize) { - 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; + 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; } /*------------------ Following is the real test program ---------*/ /* - Program to copy standard input to standard output. The program - uses two threads. One reads the input and puts the data in a - double buffer. The other reads the buffer contents and writes - it to standard output. + Program to copy standard input to standard output. The program + uses two threads. One reads the input and puts the data in a + double buffer. The other reads the buffer contents and writes + it to standard output. */ -PRSemaphore *emptyBufs; /* number of empty buffers */ -PRSemaphore *fullBufs; /* number of buffers that are full */ +PRSemaphore *emptyBufs; /* number of empty buffers */ +PRSemaphore *fullBufs; /* number of buffers that are full */ -#define BSIZE 100 +#define BSIZE 100 struct { - char data[BSIZE]; - PRUintn nbytes; /* number of bytes in this buffer */ + char data[BSIZE]; + PRUintn nbytes; /* number of bytes in this buffer */ } buf[2]; static void PR_CALLBACK reader(void *arg) { - 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); + 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); } static void writer(void) { - 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); + 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); } int main(int argc, char **argv) { - PRThread *r; + 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))) + /* 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; + if (PL_OPT_BAD == os) { + continue; + } switch (opt->option) { - case 'd': /* debug mode */ - debug_mode = 1; - break; - default: - break; + case 'd': /* debug mode */ + debug_mode = 1; + break; + default: + break; } } - PL_DestroyOptState(opt); - } + PL_DestroyOptState(opt); + } - /* main test */ + /* main test */ - emptyBufs = PR_NewSem(2); /* two empty buffers */ + emptyBufs = PR_NewSem(2); /* two empty buffers */ - fullBufs = PR_NewSem(0); /* zero full 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); + /* create the reader thread */ - /* Do the writer operation in this thread */ - writer(); + r = PR_CreateThread(PR_USER_THREAD, + reader, 0, + PR_PRIORITY_NORMAL, + PR_LOCAL_THREAD, + PR_UNJOINABLE_THREAD, + 0); - PR_DestroySem(emptyBufs); - PR_DestroySem(fullBufs); + /* Do the writer operation in this thread */ + writer(); - 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_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; + if(failed_already) { + return 1; + } + else { + return 0; + } } |