diff options
author | Joel Sherrill <joel.sherrill@OARcorp.com> | 2010-06-24 19:46:40 +0000 |
---|---|---|
committer | Joel Sherrill <joel.sherrill@OARcorp.com> | 2010-06-24 19:46:40 +0000 |
commit | 287febb50397f321d5a38f8d7df668833c192125 (patch) | |
tree | 55a6185fe030fc3190925d939ea680980c76f736 /testsuites/sptests/spfifo03/init.c | |
parent | 2010-06-24 Joel Sherrill <joel.sherrilL@OARcorp.com> (diff) | |
download | rtems-287febb50397f321d5a38f8d7df668833c192125.tar.bz2 |
2010-06-24 Bharath Suri <bharath.s.jois@gmail.com>
* Makefile.am, configure.ac: Removed some fifo tests.
* spfifo01/Makefile.am, spfifo01/init.c: Minor changes to avoid
excessive new lines in the output.
spfifo02/Makefile.am, spfifo02/init.c, spfifo02/spfifo02.doc,
spfifo02/spfifo02.scn, spfifo03/Makefile.am: Merge from spfifo08.
Also added a few more cases, mostly from spfifo04/init.c.
* spfifo03/init.c, spfifo03/spfifo03.doc, spfifo03/spfifo03.scn:
Previously was spfifo06. Configure parameter for pipes is used now.
* spfifo04/.cvsignore, spfifo04/Makefile.am, spfifo04/init.c,
spfifo04/spfifo04.doc, spfifo04/spfifo04.scn, spfifo08/.cvsignore,
spfifo08/Makefile.am, spfifo08/init.c, spfifo08/spfifo08.doc,
spfifo08/spfifo08.scn: Removed.
Diffstat (limited to 'testsuites/sptests/spfifo03/init.c')
-rw-r--r-- | testsuites/sptests/spfifo03/init.c | 196 |
1 files changed, 166 insertions, 30 deletions
diff --git a/testsuites/sptests/spfifo03/init.c b/testsuites/sptests/spfifo03/init.c index 4902a3bacc..610c328165 100644 --- a/testsuites/sptests/spfifo03/init.c +++ b/testsuites/sptests/spfifo03/init.c @@ -1,6 +1,16 @@ -/* - * COPYRIGHT (c) 2010 - * Bharath Suri<bharath.s.jois@gmail.com>. +/* Init + * + * This routine is the initialization task for this test program. + * It is a user initialization task and has the responsibility + * of invoking the test routine + * + * Input parameters: + * not_used + * + * Output parameters: NONE + * + * COPYRIGHT (c) 1989-1999. + * On-Line Applications Research Corporation (OAR). * * The license and distribution terms for this file may be * found in the file LICENSE in this distribution or at @@ -22,48 +32,169 @@ #include <rtems.h> #include <rtems/libio.h> +#define SEND_RCV_BUFSIZ 12 +rtems_id Barrier; -void test_main(void) +rtems_task read_task(rtems_task_argument not_used) { + int fd = 0; + int status = -1; + + char recvBuf_r1[SEND_RCV_BUFSIZ] = {0}; + char recvBuf_r2[SEND_RCV_BUFSIZ] = {0}; + + puts("\nRead task activated, waiting till writer opens"); + + status = rtems_barrier_wait( Barrier, RTEMS_NO_TIMEOUT ); + rtems_test_assert( status == RTEMS_SUCCESSFUL ); + + sleep(1); + + puts("\nNow, reader opening file(1)"); + fd = open("/tmp/fifo01", O_RDONLY); + if(fd <= 0) { + printf("Error opening file: (%d) :: %s", errno, strerror(errno)); + rtems_test_assert(0); + } + + status = read(fd, recvBuf_r1, sizeof(recvBuf_r1)-1); + rtems_test_assert(status == sizeof(recvBuf_r1)-1); + + printf("\n@ receiver (being a unblocked reader): Got %s", recvBuf_r1); + + status = close(fd); + rtems_test_assert(status == 0); + + status = rtems_barrier_wait( Barrier, RTEMS_NO_TIMEOUT ); + rtems_test_assert( status == RTEMS_SUCCESSFUL ); + + puts("\nReader opening file(2)"); + fd = open("/tmp/fifo01", O_RDONLY); + if(fd <= 0) { + printf("Error opening file: (%d) :: %s", errno, strerror(errno)); + rtems_test_assert(0); + } + + status = read(fd, recvBuf_r2, sizeof(recvBuf_r2)-1); + rtems_test_assert(status == sizeof(recvBuf_r2)-1); + + printf("\n@ receiver (being a blocked reader): Got %s", recvBuf_r2); + + status = close(fd); + rtems_test_assert(status == 0); + + + puts("\nReader done!"); + status = rtems_barrier_wait( Barrier, RTEMS_NO_TIMEOUT ); + rtems_test_assert( status == RTEMS_SUCCESSFUL ); + rtems_task_delete( RTEMS_SELF ); +} + + +void test_main(void) //Also acts as the write task +{ + + rtems_id readTaskID; + rtems_name readTaskName; + + char sendBuf_r1[SEND_RCV_BUFSIZ] = {0}; + char sendBuf_r2[SEND_RCV_BUFSIZ] = {0}; int status = -1; int fd = 0; - puts("\n\n*** FIFO / PIPE OPEN TEST - 3 ***"); - puts( -"\n\nConfiguration: Pipes configured, \ -but number of barriers configured = 1\n\ -Required number of barriers = 2" - ); - puts("\n\nCreating directory /tmp"); + strcpy( sendBuf_r1, "SendBuffer1" ); + strcpy( sendBuf_r2, "SendBuffer2" ); + + memset( &Barrier, 0, sizeof(Barrier) ); + status = rtems_barrier_create ( + rtems_build_name ( 'B', 'A', 'R', 't' ), + RTEMS_BARRIER_AUTOMATIC_RELEASE, + 2, + &Barrier + ); + + rtems_test_assert( status == RTEMS_SUCCESSFUL ); + + puts("\n\n*** FIFO / PIPE OPEN TEST - 6 ***"); + + puts("\nCreating a task name and a task"); + readTaskName = rtems_build_name('T','A','r',' '); + + status = rtems_task_create( + readTaskName, + 1, + RTEMS_MINIMUM_STACK_SIZE * 2, + RTEMS_INTERRUPT_LEVEL(31), + RTEMS_DEFAULT_ATTRIBUTES, + &readTaskID + ); + + rtems_test_assert( status == RTEMS_SUCCESSFUL ); + + puts("\ncreating directory /tmp"); status = mkdir("/tmp", 0777); rtems_test_assert(status == 0); - puts("\n\nCreating fifo /tmp/fifo"); + puts("\ncreating fifo file /tmp/fifo01"); status = mkfifo("/tmp/fifo01", 0777); rtems_test_assert(status == 0); - puts("\n\nAttempt to open the fifo file\n"); - puts( -"Must result in failure since \n\ -number of barriers = 1 => not all resources\n\ -were acquired" - ); + puts("\nStarting the read task"); + status = rtems_task_start(readTaskID, read_task, 0); + rtems_test_assert(status == 0); - fd = open("/tmp/fifo01", O_RDONLY); - rtems_test_assert(fd == -1); - rtems_test_assert(errno == EINTR); // Should this - // be ENOMEM? - puts("\n\nRemove the entry /tmp/fifo01"); - status = unlink("/tmp/fifo01"); + status = rtems_barrier_wait( Barrier, RTEMS_NO_TIMEOUT ); + rtems_test_assert( status == RTEMS_SUCCESSFUL ); + + puts("\nWriter opening file(1)"); + fd = open("/tmp/fifo01", O_WRONLY); + if(fd <= 0) { + printf("Error opening file: (%d) :: %s", errno, strerror(errno)); + rtems_test_assert(0); + } + + + printf("\n@ sender: %s", sendBuf_r1); + status = write(fd, sendBuf_r1, sizeof(sendBuf_r1)-1); + rtems_test_assert(status == sizeof(sendBuf_r1)-1); + + status = close(fd); rtems_test_assert(status == 0); + + status = rtems_barrier_wait( Barrier, RTEMS_NO_TIMEOUT ); + rtems_test_assert( status == RTEMS_SUCCESSFUL ); - puts("\n\nRemove directory /tmp"); - status = rmdir("/tmp"); + sleep(1); + + // Reader would have blocked by now + puts("\nWriter opening file(2)"); + fd = open("/tmp/fifo01", O_WRONLY); + if(fd <= 0) { + printf("Error opening file: (%d) :: %s", errno, strerror(errno)); + rtems_test_assert(0); + } + + printf("\n@ sender: %s", sendBuf_r2); + status = write(fd, sendBuf_r2, sizeof(sendBuf_r2)-1); + rtems_test_assert(status == sizeof(sendBuf_r2)-1); + + status = close(fd); rtems_test_assert(status == 0); - puts("\n\n*** END OF FIFO / PIPE OPEN TEST - 3 ***"); + status = rtems_barrier_wait( Barrier, RTEMS_NO_TIMEOUT ); + rtems_test_assert( status == RTEMS_SUCCESSFUL ); + + puts( "Removing the fifo" ); + status = unlink("/tmp/fifo01"); + rtems_test_assert(status == 0); + + puts( "Removing /tmp" ); + status = rmdir("/tmp"); + rtems_test_assert(status == 0); + + puts("\n*** END OF FIFO / PIPE OPEN TEST - 6 ***"); } rtems_task Init( @@ -80,13 +211,18 @@ rtems_task Init( #define CONFIGURE_USE_IMFS_AS_BASE_FILESYSTEM #define CONFIGURE_LIBIO_MAXIMUM_FILE_DESCRIPTORS 6 -#define CONFIGURE_MAXIMUM_TASKS 1 +#define CONFIGURE_MAXIMUM_TASKS 3 #define CONFIGURE_RTEMS_INIT_TASKS_TABLE -#define CONFIGURE_PIPES_ENABLED -#define CONFIGURE_MAXIMUM_PIPES 1 + +#define CONFIGURE_MAXIMUM_BARRIERS 1 + #define CONFIGURE_INIT +#define CONFIGURE_FIFOS_ENABLED +#define CONFIGURE_MAXIMUM_FIFOS 1 + +#define CONFIGURE_INIT #include <rtems/confdefs.h> /* end of file */ |