Back to home page

LXR

 
 

    


File indexing completed on 2025-05-11 08:24:47

0001 /* SPDX-License-Identifier: BSD-2-Clause */
0002 
0003 /*
0004  *  COPYRIGHT (c) 1989-2012.
0005  *  On-Line Applications Research Corporation (OAR).
0006  *
0007  * Redistribution and use in source and binary forms, with or without
0008  * modification, are permitted provided that the following conditions
0009  * are met:
0010  * 1. Redistributions of source code must retain the above copyright
0011  *    notice, this list of conditions and the following disclaimer.
0012  * 2. Redistributions in binary form must reproduce the above copyright
0013  *    notice, this list of conditions and the following disclaimer in the
0014  *    documentation and/or other materials provided with the distribution.
0015  *
0016  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
0017  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
0018  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
0019  * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
0020  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
0021  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
0022  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
0023  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
0024  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
0025  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
0026  * POSSIBILITY OF SUCH DAMAGE.
0027  */
0028 
0029 #ifdef HAVE_CONFIG_H
0030 #include "config.h"
0031 #endif
0032 
0033 #include <bsp.h>
0034 #include <tmacros.h>
0035 #include <stdio.h>
0036 #include <sys/types.h>
0037 #include <sys/stat.h>
0038 #include <fcntl.h>
0039 #include <unistd.h>
0040 #include <errno.h>
0041 
0042 #include <rtems.h>
0043 #include <rtems/libio.h>
0044 
0045 const char rtems_test_name[] = "SPFIFO 3";
0046 
0047 /* forward declarations to avoid warnings */
0048 rtems_task Init(rtems_task_argument argument);
0049 rtems_task read_task(rtems_task_argument not_used);
0050 void test_main(void);
0051 
0052 #define SEND_RCV_BUFSIZ 12
0053 rtems_id Barrier;
0054 
0055 rtems_task read_task(rtems_task_argument not_used)
0056 {
0057   int fd = 0;
0058   int status = -1;
0059 
0060   char recvBuf_r1[SEND_RCV_BUFSIZ] = {0};
0061   char recvBuf_r2[SEND_RCV_BUFSIZ] = {0};
0062 
0063   puts("\nRead task activated, waiting till writer opens");
0064 
0065   status = rtems_barrier_wait( Barrier, RTEMS_NO_TIMEOUT );
0066   rtems_test_assert( status == RTEMS_SUCCESSFUL );
0067 
0068   sleep(1);
0069 
0070   puts("\nNow, reader opening file(1)");  
0071   fd = open("/tmp/fifo01", O_RDONLY);
0072   if(fd <= 0) {
0073     printf("Error opening file: (%d) :: %s", errno, strerror(errno));
0074     rtems_test_assert(0);
0075   }
0076 
0077   status = read(fd, recvBuf_r1, sizeof(recvBuf_r1)-1);
0078   rtems_test_assert(status == sizeof(recvBuf_r1)-1);
0079 
0080   printf("\n@ receiver (being a unblocked reader): Got %s", recvBuf_r1);
0081 
0082   status = close(fd);
0083   rtems_test_assert(status == 0);
0084 
0085   status = rtems_barrier_wait( Barrier, RTEMS_NO_TIMEOUT );
0086   rtems_test_assert( status == RTEMS_SUCCESSFUL );
0087   
0088   puts("\nReader opening file(2)");
0089   fd = open("/tmp/fifo01", O_RDONLY);
0090   if(fd <= 0) {
0091     printf("Error opening file: (%d) :: %s", errno, strerror(errno));
0092     rtems_test_assert(0);
0093   }
0094 
0095   status = read(fd, recvBuf_r2, sizeof(recvBuf_r2)-1);
0096   rtems_test_assert(status == sizeof(recvBuf_r2)-1);
0097 
0098   printf("\n@ receiver (being a blocked reader): Got %s", recvBuf_r2);
0099 
0100   status = close(fd);
0101   rtems_test_assert(status == 0);
0102   
0103   
0104   puts("\nReader done!");
0105   status = rtems_barrier_wait( Barrier, RTEMS_NO_TIMEOUT );
0106   rtems_test_assert( status == RTEMS_SUCCESSFUL );
0107   rtems_task_exit();
0108 }
0109 
0110 void test_main(void) /* Also acts as the write task */
0111 {
0112 
0113   rtems_id readTaskID;
0114 
0115   rtems_name readTaskName;
0116 
0117   char sendBuf_r1[SEND_RCV_BUFSIZ] = {0};
0118   char sendBuf_r2[SEND_RCV_BUFSIZ] = {0};
0119   int status = -1;
0120   int fd = 0;
0121 
0122 
0123   strcpy( sendBuf_r1, "SendBuffer1" );
0124   strcpy( sendBuf_r2, "SendBuffer2" );
0125 
0126   memset( &Barrier, 0, sizeof(Barrier) );
0127   status = rtems_barrier_create (
0128     rtems_build_name ( 'B', 'A', 'R', 't' ),
0129     RTEMS_BARRIER_AUTOMATIC_RELEASE,
0130     2,
0131     &Barrier
0132     );
0133 
0134   rtems_test_assert( status == RTEMS_SUCCESSFUL );
0135 
0136   TEST_BEGIN();
0137 
0138   puts("\nCreating a task name and a task");
0139   readTaskName = rtems_build_name('T','A','r',' ');
0140 
0141   status = rtems_task_create(
0142                  readTaskName,
0143                  1,
0144                  RTEMS_MINIMUM_STACK_SIZE * 2,
0145                  RTEMS_DEFAULT_MODES,
0146                  RTEMS_DEFAULT_ATTRIBUTES,
0147                  &readTaskID
0148                  );
0149   
0150   rtems_test_assert( status == RTEMS_SUCCESSFUL );
0151 
0152   puts("\ncreating directory /tmp");
0153   status = mkdir("/tmp", 0777);
0154   rtems_test_assert(status == 0);
0155 
0156   puts("\ncreating fifo file /tmp/fifo01");
0157   status = mkfifo("/tmp/fifo01", 0777);
0158   rtems_test_assert(status == 0);
0159 
0160   puts("\nStarting the read task");
0161   status = rtems_task_start(readTaskID, read_task, 0);
0162   rtems_test_assert(status == 0);
0163 
0164   status = rtems_barrier_wait( Barrier, RTEMS_NO_TIMEOUT );
0165   rtems_test_assert( status == RTEMS_SUCCESSFUL );
0166 
0167   puts("\nWriter opening file(1)");
0168   fd = open("/tmp/fifo01", O_WRONLY);
0169   if(fd <= 0) {
0170     printf("Error opening file: (%d) :: %s", errno, strerror(errno));
0171     rtems_test_assert(0);
0172   }
0173 
0174   
0175   printf("\n@ sender: %s", sendBuf_r1);
0176   status = write(fd, sendBuf_r1, sizeof(sendBuf_r1)-1);
0177   rtems_test_assert(status == sizeof(sendBuf_r1)-1);
0178 
0179   status = close(fd);
0180   rtems_test_assert(status == 0);
0181   
0182   status = rtems_barrier_wait( Barrier, RTEMS_NO_TIMEOUT );
0183   rtems_test_assert( status == RTEMS_SUCCESSFUL );
0184 
0185   sleep(1);
0186 
0187   // Reader would have blocked by now
0188   puts("\nWriter opening file(2)");
0189   fd = open("/tmp/fifo01", O_WRONLY);
0190   if(fd <= 0) {
0191     printf("Error opening file: (%d) :: %s", errno, strerror(errno));
0192     rtems_test_assert(0);
0193   }
0194 
0195   printf("\n@ sender: %s", sendBuf_r2);
0196   status = write(fd, sendBuf_r2, sizeof(sendBuf_r2)-1);
0197   rtems_test_assert(status == sizeof(sendBuf_r2)-1);
0198 
0199   status = close(fd);
0200   rtems_test_assert(status == 0);
0201 
0202   status = rtems_barrier_wait( Barrier, RTEMS_NO_TIMEOUT );
0203   rtems_test_assert( status == RTEMS_SUCCESSFUL );
0204 
0205   puts( "Removing the fifo" );
0206   status = unlink("/tmp/fifo01");
0207   rtems_test_assert(status == 0);
0208   
0209   puts( "Removing /tmp" );
0210   status = rmdir("/tmp");
0211   rtems_test_assert(status == 0);
0212   
0213   TEST_END();
0214 }
0215 
0216 rtems_task Init(
0217   rtems_task_argument not_used
0218 )
0219 {
0220   test_main();
0221   rtems_test_exit(0);
0222 }
0223 
0224 #define CONFIGURE_APPLICATION_NEEDS_SIMPLE_CONSOLE_DRIVER
0225 #define CONFIGURE_APPLICATION_NEEDS_CLOCK_DRIVER
0226 
0227 #define CONFIGURE_MAXIMUM_FILE_DESCRIPTORS 6
0228 
0229 #define CONFIGURE_MAXIMUM_TASKS 3
0230 
0231 #define CONFIGURE_INITIAL_EXTENSIONS RTEMS_TEST_INITIAL_EXTENSION
0232 
0233 #define CONFIGURE_RTEMS_INIT_TASKS_TABLE
0234 
0235 #define CONFIGURE_MAXIMUM_BARRIERS 1
0236 
0237 #define CONFIGURE_IMFS_ENABLE_MKFIFO
0238 
0239 #define CONFIGURE_INIT
0240 #include <rtems/confdefs.h>
0241 
0242 /* end of file */