From 3bad54fbfb46f4798292298df30a4f8f1c4431ec Mon Sep 17 00:00:00 2001 From: "wtc%netscape.com" Date: Fri, 12 Feb 1999 18:41:36 +0000 Subject: [PATCH] Completely rewrote the test. --- nsprpub/pr/tests/pipeself.c | 156 +++++++++++++++++++++++++----------- 1 file changed, 110 insertions(+), 46 deletions(-) diff --git a/nsprpub/pr/tests/pipeself.c b/nsprpub/pr/tests/pipeself.c index 6379a0347f2..4c4b9bba175 100644 --- a/nsprpub/pr/tests/pipeself.c +++ b/nsprpub/pr/tests/pipeself.c @@ -20,79 +20,143 @@ * File: pipeself.c * * Description: - * This test creates a pipe, writes to it, and reads from it. + * This test has two threads communicating with each other using + * two unidirectional pipes. The primordial thread is the ping + * thread and the other thread is the pong thread. The ping + * thread writes "ping" to the pong thread and the pong thread + * writes "pong" back. */ #include "prio.h" #include "prerror.h" +#include "prthread.h" #include +#include #include #define NUM_ITERATIONS 10 -#define ENGLISH_GREETING "Hello" -#define SPANISH_GREETING "Hola" +static PRFileDesc *ping_in, *ping_out; +static PRFileDesc *pong_in, *pong_out; + +static void PongThreadFunc(void *arg) +{ + char buf[1024]; + int idx; + PRInt32 nBytes; + PRStatus status; + + for (idx = 0; idx < NUM_ITERATIONS; idx++) { + memset(buf, 0, sizeof(buf)); + nBytes = PR_Read(pong_in, buf, sizeof(buf)); + if (nBytes == -1) { + fprintf(stderr, "PR_Read failed\n"); + exit(1); + } + printf("pong thread: received \"%s\"\n", buf); + if (nBytes != 5) { + fprintf(stderr, "pong thread: expected 5 bytes but got %d bytes\n", + nBytes); + exit(1); + } + if (strcmp(buf, "ping") != 0) { + fprintf(stderr, "pong thread: expected \"ping\" but got \"%s\"\n", + buf); + exit(1); + } + strcpy(buf, "pong"); + printf("pong thread: sending \"%s\"\n", buf); + nBytes = PR_Write(pong_out, buf, 5); + if (nBytes == -1) { + fprintf(stderr, "PR_Write failed: (%d, %d)\n", PR_GetError(), + PR_GetOSError()); + exit(1); + } + } + + status = PR_Close(pong_in); + if (status == PR_FAILURE) { + fprintf(stderr, "PR_Close failed\n"); + exit(1); + } + status = PR_Close(pong_out); + if (status == PR_FAILURE) { + fprintf(stderr, "PR_Close failed\n"); + exit(1); + } +} int main() { - PRFileDesc *readPipe, *writePipe; - char buf[128]; - int len; + PRStatus status; + PRThread *pongThread; + char buf[1024]; + PRInt32 nBytes; int idx; - if (PR_CreatePipe(&readPipe, &writePipe) == PR_FAILURE) { - fprintf(stderr, "cannot create pipe: (%d, %d)\n", - PR_GetError(), PR_GetOSError()); - return 1; + status = PR_CreatePipe(&ping_in, &pong_out); + if (status == PR_FAILURE) { + fprintf(stderr, "PR_CreatePipe failed\n"); + exit(1); + } + status = PR_CreatePipe(&pong_in, &ping_out); + if (status == PR_FAILURE) { + fprintf(stderr, "PR_CreatePipe failed\n"); + exit(1); + } + + pongThread = PR_CreateThread(PR_USER_THREAD, PongThreadFunc, NULL, + PR_PRIORITY_NORMAL, PR_GLOBAL_THREAD, PR_JOINABLE_THREAD, 0); + if (pongThread == NULL) { + fprintf(stderr, "PR_CreateThread failed\n"); + exit(1); } for (idx = 0; idx < NUM_ITERATIONS; idx++) { - strcpy(buf, ENGLISH_GREETING); - len = strlen(buf) + 1; - if (PR_Write(writePipe, buf, len) < len) { - fprintf(stderr, "write failed\n"); - return 1; + strcpy(buf, "ping"); + printf("ping thread: sending \"%s\"\n", buf); + nBytes = PR_Write(ping_out, buf, 5); + if (nBytes == -1) { + fprintf(stderr, "PR_Write failed: (%d, %d)\n", PR_GetError(), + PR_GetOSError()); + exit(1); } memset(buf, 0, sizeof(buf)); - if (PR_Read(readPipe, buf, sizeof(buf)) == -1) { - fprintf(stderr, "read failed: (%d, %d)\n", - PR_GetError(), PR_GetOSError()); - return 1; + nBytes = PR_Read(ping_in, buf, sizeof(buf)); + if (nBytes == -1) { + fprintf(stderr, "PR_Read failed\n"); + exit(1); } - if (strcmp(buf, ENGLISH_GREETING) != 0) { - fprintf(stderr, "expected \"%s\" but got \"%s\"\n", - ENGLISH_GREETING, buf); - return 1; + printf("ping thread: received \"%s\"\n", buf); + if (nBytes != 5) { + fprintf(stderr, "ping thread: expected 5 bytes but got %d bytes\n", + nBytes); + exit(1); } - - strcpy(buf, SPANISH_GREETING); - len = strlen(buf) + 1; - if (PR_Write(writePipe, buf, len) < len) { - fprintf(stderr, "write failed\n"); - return 1; - } - memset(buf, 0, sizeof(buf)); - if (PR_Read(readPipe, buf, sizeof(buf)) == -1) { - fprintf(stderr, "read failed: (%d, %d)\n", - PR_GetError(), PR_GetOSError()); - return 1; - } - if (strcmp(buf, SPANISH_GREETING) != 0) { - fprintf(stderr, "expected \"%s\" but got \"%s\"\n", - SPANISH_GREETING, buf); - return 1; + if (strcmp(buf, "pong") != 0) { + fprintf(stderr, "ping thread: expected \"pong\" but got \"%s\"\n", + buf); + exit(1); } } - if (PR_Close(readPipe) == PR_FAILURE) { - fprintf(stderr, "close failed\n"); - return 1; + status = PR_Close(ping_in); + if (status == PR_FAILURE) { + fprintf(stderr, "PR_Close failed\n"); + exit(1); } - if (PR_Close(writePipe) == PR_FAILURE) { - fprintf(stderr, "close failed\n"); - return 1; + status = PR_Close(ping_out); + if (status == PR_FAILURE) { + fprintf(stderr, "PR_Close failed\n"); + exit(1); } + status = PR_JoinThread(pongThread); + if (status == PR_FAILURE) { + fprintf(stderr, "PR_JoinThread failed\n"); + exit(1); + } + printf("PASS\n"); return 0; }