diff options
author | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2013-10-25 15:37:06 +0200 |
---|---|---|
committer | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2013-10-31 13:18:50 +0100 |
commit | 37b0ab6ee44d33b3c1225db5ef06be1fc768bb0d (patch) | |
tree | cfa4689ebb0b63f70c203176d93b2d03dc14fe1c /testsuite/loopback01 | |
parent | loopback01: Initialize via IFCONFIG(8) (diff) | |
download | rtems-libbsd-37b0ab6ee44d33b3c1225db5ef06be1fc768bb0d.tar.bz2 |
loopback01: Wait for client termination
Diffstat (limited to 'testsuite/loopback01')
-rw-r--r-- | testsuite/loopback01/test_main.c | 56 |
1 files changed, 49 insertions, 7 deletions
diff --git a/testsuite/loopback01/test_main.c b/testsuite/loopback01/test_main.c index 396b8ef9..ec4ad7d6 100644 --- a/testsuite/loopback01/test_main.c +++ b/testsuite/loopback01/test_main.c @@ -27,6 +27,8 @@ #include <rtems.h> +static rtems_id masterTask; + /* * Thread-safe output routines */ @@ -42,6 +44,44 @@ static void printSafe(const char *fmt, ...) } #define printf printSafe +static void +setSelfPrio(rtems_task_priority prio) +{ + rtems_status_code sc; + + sc = rtems_task_set_priority(RTEMS_SELF, prio, &prio); + assert(sc == RTEMS_SUCCESSFUL); +} + +static rtems_event_set argToClientEvent(rtems_task_argument arg) +{ + return 1U << arg; +} + +static void +sendClientEventToMasterTask(rtems_task_argument arg) +{ + rtems_status_code sc; + + sc = rtems_event_send(masterTask, argToClientEvent(arg)); + assert(sc == RTEMS_SUCCESSFUL); +} + +static void +waitForClientEvents(rtems_event_set which) +{ + rtems_status_code sc; + rtems_event_set events; + + sc = rtems_event_receive( + which, + RTEMS_EVENT_ALL | RTEMS_WAIT, + RTEMS_NO_TIMEOUT, + &events + ); + assert(sc == RTEMS_SUCCESSFUL); +} + /* * Spawn a task */ @@ -80,7 +120,6 @@ static rtems_task workerTask(rtems_task_argument arg) } if (i == 0) break; - rtems_task_wake_after(20); /* Simulate some processing delay */ i = sprintf(reply, "Server received %d (%s)", i, msg); if ((i = write(s, reply, i+1)) < 0) { printf("Server couldn't write message to client: %s\n", strerror(errno)); @@ -161,7 +200,6 @@ static rtems_task clientWorker(int arg) printf("Can't connect to server: %s\n", strerror(errno)); goto close; } - rtems_task_wake_after(20); /* Simulate client delay */ i = sprintf(cbuf, "Hi there, server (%d).", arg); i++; /* Send the '\0', too */ printf("Write %d-byte message to server.\n", i); @@ -174,7 +212,6 @@ static rtems_task clientWorker(int arg) goto close; } printf("Read %d from server: %.*s\n", i, i, cbuf); - rtems_task_wake_after(20); /* Simulate client delay */ close: printf("Client closing connection.\n"); if (close(s) < 0) @@ -187,6 +224,7 @@ static rtems_task clientWorker(int arg) static rtems_task clientTask(rtems_task_argument arg) { clientWorker(arg); + sendClientEventToMasterTask(arg); printf("Client task terminating.\n"); rtems_task_delete( RTEMS_SELF ); } @@ -209,6 +247,10 @@ static void test_main(void) NULL }; + masterTask = rtems_task_self(); + + setSelfPrio(RTEMS_MAXIMUM_PRIORITY - 1); + sc = rtems_semaphore_create( rtems_build_name('P','m','t','x'), 1, @@ -236,23 +278,23 @@ static void test_main(void) assert(exit_code == EX_OK); printf("\nStart server.\n"); - spawnTask(serverTask, 150, 0); + spawnTask(serverTask, 110, 0); printf("\nTry running client with server present.\n"); spawnTask(clientTask, 120, 1); - rtems_task_wake_after(500); + waitForClientEvents(argToClientEvent(1)); printf("\nTry running two clients.\n"); spawnTask(clientTask, 120, 2); spawnTask(clientTask, 120, 3); - rtems_task_wake_after(500); + waitForClientEvents(argToClientEvent(2) | argToClientEvent(3)); printf("\nTry running three clients.\n"); spawnTask(clientTask, 120, 4); spawnTask(clientTask, 120, 5); spawnTask(clientTask, 120, 6); + waitForClientEvents(argToClientEvent(4) | argToClientEvent(5) | argToClientEvent(6)); - rtems_task_wake_after(500); puts( "*** END OF " TEST_NAME " TEST ***" ); exit( 0 ); } |