summaryrefslogtreecommitdiffstats
path: root/nsprpub/pr/tests/server_test.c
diff options
context:
space:
mode:
Diffstat (limited to 'nsprpub/pr/tests/server_test.c')
-rw-r--r--nsprpub/pr/tests/server_test.c401
1 files changed, 235 insertions, 166 deletions
diff --git a/nsprpub/pr/tests/server_test.c b/nsprpub/pr/tests/server_test.c
index b794a7fe7..93ffe4aff 100644
--- a/nsprpub/pr/tests/server_test.c
+++ b/nsprpub/pr/tests/server_test.c
@@ -8,16 +8,16 @@
** This server simulates a server running in loopback mode.
**
** The idea is that a single server is created. The server initially creates
-** a number of worker threads. Then, with the server running, a number of
+** a number of worker threads. Then, with the server running, a number of
** clients are created which start requesting service from the server.
**
**
** Modification History:
** 19-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.
***********************************************************************/
/***********************************************************************
@@ -68,34 +68,34 @@ PRCondVar *ServerStateCV;
/***********************************************************************
** PRIVATE FUNCTION: Test_Result
** DESCRIPTION: Used in conjunction with the regress tool, prints out the
-** status of the test case.
+** status of the test case.
** INPUTS: PASS/FAIL
** OUTPUTS: None
** RETURN: None
** SIDE EFFECTS:
-**
+**
** RESTRICTIONS:
** None
** MEMORY: NA
** ALGORITHM: Determine what the status is and print accordingly.
-**
+**
***********************************************************************/
static void Test_Result (int result)
{
- switch (result)
- {
- case PASS:
- printf ("PASS\n");
- break;
- case FAIL:
- printf ("FAIL\n");
- failed_already = 1;
- break;
- default:
- break;
- }
+ switch (result)
+ {
+ case PASS:
+ printf ("PASS\n");
+ break;
+ case FAIL:
+ printf ("FAIL\n");
+ failed_already = 1;
+ break;
+ default:
+ break;
+ }
}
static void do_work(void);
@@ -108,7 +108,9 @@ SetServerState(char *waiter, PRInt32 state)
ServerState = state;
PR_NotifyCondVar(ServerStateCV);
- if (debug_mode) DPRINTF("\t%s changed state to %d\n", waiter, state);
+ if (debug_mode) {
+ DPRINTF("\t%s changed state to %d\n", waiter, state);
+ }
PR_Unlock(ServerStateCVLock);
}
@@ -120,14 +122,17 @@ WaitServerState(char *waiter, PRInt32 state)
PR_Lock(ServerStateCVLock);
- if (debug_mode) DPRINTF("\t%s waiting for state %d\n", waiter, state);
+ if (debug_mode) {
+ DPRINTF("\t%s waiting for state %d\n", waiter, state);
+ }
- while(!(ServerState & state))
+ while(!(ServerState & state)) {
PR_WaitCondVar(ServerStateCV, PR_INTERVAL_NO_TIMEOUT);
+ }
rv = ServerState;
- if (debug_mode) DPRINTF("\t%s resuming from wait for state %d; state now %d\n",
- waiter, state, ServerState);
+ if (debug_mode) DPRINTF("\t%s resuming from wait for state %d; state now %d\n",
+ waiter, state, ServerState);
PR_Unlock(ServerStateCVLock);
return rv;
@@ -149,15 +154,21 @@ WorkerThreadFunc(void *_listenSock)
char *sendBuf;
if (debug_mode) DPRINTF("\tServer buffer is %d bytes; %d data, %d netaddrs\n",
- _client_data+(2*sizeof(PRNetAddr))+32, _client_data, (2*sizeof(PRNetAddr))+32);
+ _client_data+(2*sizeof(PRNetAddr))+32, _client_data, (2*sizeof(PRNetAddr))+32);
dataBuf = (char *)PR_MALLOC(_client_data + 2*sizeof(PRNetAddr) + 32);
if (!dataBuf)
- if (debug_mode) printf("\tServer could not malloc space!?\n");
+ if (debug_mode) {
+ printf("\tServer could not malloc space!?\n");
+ }
sendBuf = (char *)PR_MALLOC(_server_data *sizeof(char));
if (!sendBuf)
- if (debug_mode) printf("\tServer could not malloc space!?\n");
+ if (debug_mode) {
+ printf("\tServer could not malloc space!?\n");
+ }
- if (debug_mode) DPRINTF("\tServer worker thread running\n");
+ if (debug_mode) {
+ DPRINTF("\tServer worker thread running\n");
+ }
while(1) {
PRInt32 bytesToRead = _client_data;
@@ -168,9 +179,11 @@ WorkerThreadFunc(void *_listenSock)
loops++;
- if (debug_mode) DPRINTF("\tServer thread going into accept\n");
+ if (debug_mode) {
+ DPRINTF("\tServer thread going into accept\n");
+ }
- bytesRead = PR_AcceptRead(listenSock,
+ bytesRead = PR_AcceptRead(listenSock,
&newSock,
&rAddr,
dataBuf,
@@ -178,66 +191,76 @@ WorkerThreadFunc(void *_listenSock)
PR_INTERVAL_NO_TIMEOUT);
if (bytesRead < 0) {
- if (debug_mode) printf("\tServer error in accept (%d)\n", bytesRead);
+ if (debug_mode) {
+ printf("\tServer error in accept (%d)\n", bytesRead);
+ }
continue;
}
- if (debug_mode) DPRINTF("\tServer accepted connection (%d bytes)\n", bytesRead);
-
+ if (debug_mode) {
+ DPRINTF("\tServer accepted connection (%d bytes)\n", bytesRead);
+ }
+
PR_AtomicIncrement(&workerThreadsBusy);
-#ifdef SYMBIAN
- if (workerThreadsBusy == workerThreads && workerThreads<1) {
-#else
if (workerThreadsBusy == workerThreads) {
-#endif
PR_Lock(workerThreadsLock);
if (workerThreadsBusy == workerThreads) {
PRThread *WorkerThread;
WorkerThread = PR_CreateThread(
- PR_SYSTEM_THREAD,
- WorkerThreadFunc,
- listenSock,
- PR_PRIORITY_NORMAL,
- ServerScope,
- PR_UNJOINABLE_THREAD,
- THREAD_STACKSIZE);
+ PR_SYSTEM_THREAD,
+ WorkerThreadFunc,
+ listenSock,
+ PR_PRIORITY_NORMAL,
+ ServerScope,
+ PR_UNJOINABLE_THREAD,
+ THREAD_STACKSIZE);
if (!WorkerThread) {
- if (debug_mode) printf("Error creating client thread %d\n", workerThreads);
+ if (debug_mode) {
+ printf("Error creating client thread %d\n", workerThreads);
+ }
} else {
PR_AtomicIncrement(&workerThreads);
- if (debug_mode) DPRINTF("\tServer creates worker (%d)\n", workerThreads);
+ if (debug_mode) {
+ DPRINTF("\tServer creates worker (%d)\n", workerThreads);
+ }
}
}
PR_Unlock(workerThreadsLock);
}
-
+
bytesToRead -= bytesRead;
while (bytesToRead) {
- bytesRead = PR_Recv(newSock,
- dataBuf,
- bytesToRead,
- 0,
+ bytesRead = PR_Recv(newSock,
+ dataBuf,
+ bytesToRead,
+ 0,
PR_INTERVAL_NO_TIMEOUT);
if (bytesRead < 0) {
- if (debug_mode) printf("\tServer error receiving data (%d)\n", bytesRead);
+ if (debug_mode) {
+ printf("\tServer error receiving data (%d)\n", bytesRead);
+ }
continue;
}
- if (debug_mode) DPRINTF("\tServer received %d bytes\n", bytesRead);
+ if (debug_mode) {
+ DPRINTF("\tServer received %d bytes\n", bytesRead);
+ }
}
bytesWritten = PR_Send(newSock,
- sendBuf,
- bytesToWrite,
- 0,
+ sendBuf,
+ bytesToWrite,
+ 0,
PR_INTERVAL_NO_TIMEOUT);
if (bytesWritten != _server_data) {
- if (debug_mode) printf("\tError sending data to client (%d, %d)\n",
- bytesWritten, PR_GetOSError());
+ if (debug_mode) printf("\tError sending data to client (%d, %d)\n",
+ bytesWritten, PR_GetOSError());
} else {
- if (debug_mode) DPRINTF("\tServer sent %d bytes\n", bytesWritten);
- }
+ if (debug_mode) {
+ DPRINTF("\tServer sent %d bytes\n", bytesWritten);
+ }
+ }
PR_Close(newSock);
PR_AtomicDecrement(&workerThreadsBusy);
@@ -253,8 +276,12 @@ ServerSetup(void)
PRThread *WorkerThread;
if ((listenSocket = PR_NewTCPSocket()) == NULL) {
- if (debug_mode) printf("\tServer error creating listen socket\n");
- else Test_Result(FAIL);
+ if (debug_mode) {
+ printf("\tServer error creating listen socket\n");
+ }
+ else {
+ Test_Result(FAIL);
+ }
return NULL;
}
@@ -262,8 +289,10 @@ ServerSetup(void)
sockOpt.value.reuse_addr = PR_TRUE;
if (PR_SetSocketOption(listenSocket, &sockOpt) != PR_SUCCESS) {
if (debug_mode) printf("\tServer error setting socket option: OS error %d\n",
- PR_GetOSError());
- else Test_Result(FAIL);
+ PR_GetOSError());
+ else {
+ Test_Result(FAIL);
+ }
PR_Close(listenSocket);
return NULL;
}
@@ -275,15 +304,21 @@ ServerSetup(void)
if (PR_Bind(listenSocket, &serverAddr) != PR_SUCCESS) {
if (debug_mode) printf("\tServer error binding to server address: OS error %d\n",
- PR_GetOSError());
- else Test_Result(FAIL);
+ PR_GetOSError());
+ else {
+ Test_Result(FAIL);
+ }
PR_Close(listenSocket);
return NULL;
}
if (PR_Listen(listenSocket, 128) != PR_SUCCESS) {
- if (debug_mode) printf("\tServer error listening to server socket\n");
- else Test_Result(FAIL);
+ if (debug_mode) {
+ printf("\tServer error listening to server socket\n");
+ }
+ else {
+ Test_Result(FAIL);
+ }
PR_Close(listenSocket);
return NULL;
@@ -296,21 +331,25 @@ ServerSetup(void)
workerThreadsLock = PR_NewLock();
WorkerThread = PR_CreateThread(
- PR_SYSTEM_THREAD,
- WorkerThreadFunc,
- listenSocket,
- PR_PRIORITY_NORMAL,
- ServerScope,
- PR_UNJOINABLE_THREAD,
- THREAD_STACKSIZE);
+ PR_SYSTEM_THREAD,
+ WorkerThreadFunc,
+ listenSocket,
+ PR_PRIORITY_NORMAL,
+ ServerScope,
+ PR_UNJOINABLE_THREAD,
+ THREAD_STACKSIZE);
if (!WorkerThread) {
- if (debug_mode) printf("error creating working thread\n");
+ if (debug_mode) {
+ printf("error creating working thread\n");
+ }
PR_Close(listenSocket);
return NULL;
}
PR_AtomicIncrement(&workerThreads);
- if (debug_mode) DPRINTF("\tServer created primordial worker thread\n");
+ if (debug_mode) {
+ DPRINTF("\tServer created primordial worker thread\n");
+ }
return listenSocket;
}
@@ -328,7 +367,9 @@ ServerThreadFunc(void *unused)
SetServerState(SERVER, SERVER_STATE_DEAD);
} else {
- if (debug_mode) DPRINTF("\tServer up\n");
+ if (debug_mode) {
+ DPRINTF("\tServer up\n");
+ }
/* Tell clients they can start now. */
SetServerState(SERVER, SERVER_STATE_READY);
@@ -359,10 +400,14 @@ ClientThreadFunc(void *unused)
sendBuf = (char *)PR_MALLOC(_client_data * sizeof(char));
if (!sendBuf)
- if (debug_mode) printf("\tClient could not malloc space!?\n");
+ if (debug_mode) {
+ printf("\tClient could not malloc space!?\n");
+ }
recvBuf = (char *)PR_MALLOC(_server_data * sizeof(char));
if (!recvBuf)
- if (debug_mode) printf("\tClient could not malloc space!?\n");
+ if (debug_mode) {
+ printf("\tClient could not malloc space!?\n");
+ }
memset(&serverAddr, 0, sizeof(PRNetAddr));
serverAddr.inet.family = PR_AF_INET;
@@ -372,59 +417,75 @@ ClientThreadFunc(void *unused)
while(numRequests > 0) {
if ( (numRequests % 10) == 0 )
- if (debug_mode) printf(".");
- if (debug_mode) DPRINTF("\tClient starting request %d\n", numRequests);
+ if (debug_mode) {
+ printf(".");
+ }
+ if (debug_mode) {
+ DPRINTF("\tClient starting request %d\n", numRequests);
+ }
clientSocket = PR_NewTCPSocket();
if (!clientSocket) {
if (debug_mode) printf("Client error creating socket: OS error %d\n",
- PR_GetOSError());
+ PR_GetOSError());
continue;
}
- if (debug_mode) DPRINTF("\tClient connecting\n");
+ if (debug_mode) {
+ DPRINTF("\tClient connecting\n");
+ }
- rv = PR_Connect(clientSocket,
+ rv = PR_Connect(clientSocket,
&serverAddr,
PR_INTERVAL_NO_TIMEOUT);
if (!clientSocket) {
- if (debug_mode) printf("\tClient error connecting\n");
+ if (debug_mode) {
+ printf("\tClient error connecting\n");
+ }
continue;
}
- if (debug_mode) DPRINTF("\tClient connected\n");
+ if (debug_mode) {
+ DPRINTF("\tClient connected\n");
+ }
- rv = PR_Send(clientSocket,
- sendBuf,
- _client_data,
- 0,
+ rv = PR_Send(clientSocket,
+ sendBuf,
+ _client_data,
+ 0,
PR_INTERVAL_NO_TIMEOUT);
if (rv != _client_data) {
- if (debug_mode) printf("Client error sending data (%d)\n", rv);
+ if (debug_mode) {
+ printf("Client error sending data (%d)\n", rv);
+ }
PR_Close(clientSocket);
continue;
}
- if (debug_mode) DPRINTF("\tClient sent %d bytes\n", rv);
+ if (debug_mode) {
+ DPRINTF("\tClient sent %d bytes\n", rv);
+ }
bytesNeeded = _server_data;
while(bytesNeeded) {
- rv = PR_Recv(clientSocket,
- recvBuf,
- bytesNeeded,
- 0,
+ rv = PR_Recv(clientSocket,
+ recvBuf,
+ bytesNeeded,
+ 0,
PR_INTERVAL_NO_TIMEOUT);
if (rv <= 0) {
- if (debug_mode) printf("Client error receiving data (%d) (%d/%d)\n",
- rv, (_server_data - bytesNeeded), _server_data);
+ if (debug_mode) printf("Client error receiving data (%d) (%d/%d)\n",
+ rv, (_server_data - bytesNeeded), _server_data);
break;
}
- if (debug_mode) DPRINTF("\tClient received %d bytes; need %d more\n", rv, bytesNeeded - rv);
+ if (debug_mode) {
+ DPRINTF("\tClient received %d bytes; need %d more\n", rv, bytesNeeded - rv);
+ }
bytesNeeded -= rv;
}
PR_Close(clientSocket);
-
+
PR_AtomicDecrement(&numRequests);
}
@@ -449,26 +510,30 @@ RunClients(void)
for (index=0; index<_clients; index++) {
PRThread *clientThread;
-
+
clientThread = PR_CreateThread(
- PR_USER_THREAD,
- ClientThreadFunc,
- NULL,
- PR_PRIORITY_NORMAL,
- ClientScope,
- PR_UNJOINABLE_THREAD,
- THREAD_STACKSIZE);
+ PR_USER_THREAD,
+ ClientThreadFunc,
+ NULL,
+ PR_PRIORITY_NORMAL,
+ ClientScope,
+ PR_UNJOINABLE_THREAD,
+ THREAD_STACKSIZE);
if (!clientThread) {
- if (debug_mode) printf("\terror creating client thread %d\n", index);
- } else
- if (debug_mode) DPRINTF("\tMain created client %d/%d\n", index+1, _clients);
+ if (debug_mode) {
+ printf("\terror creating client thread %d\n", index);
+ }
+ } else if (debug_mode) {
+ DPRINTF("\tMain created client %d/%d\n", index+1, _clients);
+ }
}
PR_EnterMonitor(clientMonitor);
- while(numClients)
+ while(numClients) {
PR_Wait(clientMonitor, PR_INTERVAL_NO_TIMEOUT);
+ }
PR_ExitMonitor(clientMonitor);
}
@@ -482,15 +547,17 @@ void do_work()
SetServerState(MAIN, SERVER_STATE_STARTUP);
ServerThread = PR_CreateThread(
- PR_USER_THREAD,
- ServerThreadFunc,
- NULL,
- PR_PRIORITY_NORMAL,
- ServerScope,
- PR_JOINABLE_THREAD,
- THREAD_STACKSIZE);
+ PR_USER_THREAD,
+ ServerThreadFunc,
+ NULL,
+ PR_PRIORITY_NORMAL,
+ ServerScope,
+ PR_JOINABLE_THREAD,
+ THREAD_STACKSIZE);
if (!ServerThread) {
- if (debug_mode) printf("error creating main server thread\n");
+ if (debug_mode) {
+ printf("error creating main server thread\n");
+ }
return;
}
@@ -548,62 +615,64 @@ static void Measure(void (*func)(void), const char *msg)
d = (double)PR_IntervalToMicroseconds(stop - start);
- if (debug_mode) printf("\n%40s: %6.2f usec\n", msg, d / _iterations);
+ if (debug_mode) {
+ printf("\n%40s: %6.2f usec\n", msg, d / _iterations);
+ }
}
int main(int argc, char **argv)
{
- /* 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 */
-#ifndef SYMBIAN
+ /* main test */
if (debug_mode) {
- printf("Enter number of iterations: \n");
- scanf("%d", &_iterations);
- printf("Enter number of clients : \n");
- scanf("%d", &_clients);
- printf("Enter size of client data : \n");
- scanf("%d", &_client_data);
- printf("Enter size of server data : \n");
- scanf("%d", &_server_data);
- }
- else
-#endif
- {
-
- _iterations = 10;
- _clients = 1;
- _client_data = 10;
- _server_data = 10;
- }
-
+ printf("Enter number of iterations: \n");
+ scanf("%d", &_iterations);
+ printf("Enter number of clients : \n");
+ scanf("%d", &_clients);
+ printf("Enter size of client data : \n");
+ scanf("%d", &_client_data);
+ printf("Enter size of server data : \n");
+ scanf("%d", &_server_data);
+ }
+ else
+ {
+
+ _iterations = 10;
+ _clients = 1;
+ _client_data = 10;
+ _server_data = 10;
+ }
+
if (debug_mode) {
- printf("\n\n%d iterations with %d client threads.\n",
- _iterations, _clients);
- printf("Sending %d bytes of client data and %d bytes of server data\n",
- _client_data, _server_data);
- }
+ printf("\n\n%d iterations with %d client threads.\n",
+ _iterations, _clients);
+ printf("Sending %d bytes of client data and %d bytes of server data\n",
+ _client_data, _server_data);
+ }
PR_Init(PR_USER_THREAD, PR_PRIORITY_NORMAL, 0);
PR_STDIO_INIT();
@@ -611,11 +680,11 @@ int main(int argc, char **argv)
ServerStateCV = PR_NewCondVar(ServerStateCVLock);
Measure(do_workUU, "server loop user/user");
- #if 0
+#if 0
Measure(do_workUK, "server loop user/kernel");
Measure(do_workKU, "server loop kernel/user");
Measure(do_workKK, "server loop kernel/kernel");
- #endif
+#endif
PR_Cleanup();