File indexing completed on 2025-05-11 08:24:47
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
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 <sys/ioctl.h>
0039 #include <fcntl.h>
0040 #include <unistd.h>
0041 #include <errno.h>
0042 #include <limits.h>
0043
0044 #include <rtems.h>
0045 #include <rtems/libio.h>
0046
0047 const char rtems_test_name[] = "SPFIFO 5";
0048
0049
0050 rtems_task Init(rtems_task_argument argument);
0051 rtems_task read_task(rtems_task_argument not_used);
0052
0053 #define SEND_RCV_BUFSIZ (PIPE_BUF+20)
0054
0055 rtems_id rBarrier;
0056 rtems_id wBarrier;
0057
0058 char recvBuf[SEND_RCV_BUFSIZ] = {0};
0059 char sendBuf[SEND_RCV_BUFSIZ] = {0};
0060
0061 rtems_task read_task(rtems_task_argument not_used)
0062 {
0063 int fd = 0;
0064 int status = -1;
0065 uint32_t released = 0;
0066
0067 puts( "read_task - opening /fifo in non-blocking mode" );
0068
0069 fd = open( "/fifo", O_RDONLY | O_NONBLOCK );
0070 if( fd <= 0 ) {
0071 printf( "Error opening file: (%d) :: %s\n", errno, strerror( errno ) );
0072 rtems_test_assert( 0 );
0073 }
0074
0075 puts( "read_task - attempt to read with number of writers = 0" );
0076 status = read( fd, recvBuf, SEND_RCV_BUFSIZ );
0077 rtems_test_assert( status == 0 );
0078
0079 puts( "read_task - releasing the write task" );
0080 status = rtems_barrier_release( wBarrier, &released );
0081 rtems_test_assert( status == 0 );
0082
0083 puts( "read_task - waiting at a barrier" );
0084 status = rtems_barrier_wait( rBarrier, RTEMS_NO_TIMEOUT );
0085 rtems_test_assert( status == RTEMS_SUCCESSFUL );
0086
0087 puts( "read_task - attempting to read from the fifo -- Expect EAGAIN" );
0088 status = read( fd, recvBuf, SEND_RCV_BUFSIZ );
0089 rtems_test_assert( status == -1 );
0090 rtems_test_assert( errno == EAGAIN );
0091
0092 puts( "read_task - closing /fifo" );
0093 status = close( fd );
0094 rtems_test_assert( status == 0 );
0095
0096 puts("read_task - opening /fifo in read-only mode");
0097 fd = open( "/fifo", O_RDONLY );
0098 if( fd <= 0 ) {
0099 printf( "Error opening file: (%d) :: %s\n", errno, strerror( errno ) );
0100 rtems_test_assert( 0 );
0101 }
0102
0103 puts( "read_task - releasing the write task" );
0104 status = rtems_barrier_release( wBarrier, &released );
0105 rtems_test_assert( status == 0 );
0106
0107 puts( "read_task - reading from /fifo - OK" );
0108 status = read( fd, recvBuf, 10 );
0109 rtems_test_assert( status == 10 );
0110
0111 puts( "read_task - reading from /fifo - OK" );
0112 status = read( fd, recvBuf+10, 10 );
0113 rtems_test_assert( status == 10 );
0114
0115 puts( "read_task - waiting at a barrier" );
0116 status = rtems_barrier_wait( rBarrier, RTEMS_NO_TIMEOUT );
0117 rtems_test_assert( status == RTEMS_SUCCESSFUL );
0118
0119 puts( "read_task - reading from /fifo - OK" );
0120 status = read( fd, recvBuf+20, SEND_RCV_BUFSIZ - 20 );
0121 rtems_test_assert( status == SEND_RCV_BUFSIZ - 20 );
0122
0123 if( strcmp( sendBuf, recvBuf ) ) {
0124 puts( "Sent, received buffer do not match" );
0125 rtems_test_assert( 0 );
0126 }
0127
0128 puts( "read_task - releasing the write task" );
0129 status = rtems_barrier_release( wBarrier, &released );
0130 rtems_test_assert( status == 0 );
0131
0132 puts( "read_task - waiting at a barrier" );
0133 status = rtems_barrier_wait( rBarrier, RTEMS_NO_TIMEOUT );
0134 rtems_test_assert( status == RTEMS_SUCCESSFUL );
0135
0136 status = close( fd );
0137 rtems_test_assert( status == 0 );
0138
0139 puts( "read_task - releasing the write task" );
0140 status = rtems_barrier_release( wBarrier, &released );
0141 rtems_test_assert( status == 0 );
0142
0143 rtems_task_exit();
0144 }
0145
0146 rtems_task Init(
0147 rtems_task_argument not_used
0148 )
0149 {
0150 rtems_id readTaskID;
0151
0152 rtems_name readTaskName;
0153
0154 int status = -1;
0155 int fd = 0;
0156 uint32_t released = 0;
0157 int flag = 1;
0158
0159 TEST_BEGIN();
0160
0161 memset( sendBuf, '1', SEND_RCV_BUFSIZ - 30 );
0162 memset( sendBuf, '2', 29 );
0163 sendBuf[SEND_RCV_BUFSIZ-1] = 0;
0164
0165 memset( &rBarrier, 0, sizeof(rBarrier) );
0166 status = rtems_barrier_create (
0167 rtems_build_name ( 'B', 'A', 'R', 'r' ),
0168 RTEMS_BARRIER_MANUAL_RELEASE,
0169 2,
0170 &rBarrier
0171 );
0172
0173 rtems_test_assert( status == RTEMS_SUCCESSFUL );
0174
0175 memset( &wBarrier, 0, sizeof( wBarrier ) );
0176 status = rtems_barrier_create (
0177 rtems_build_name ( 'B', 'A', 'R', 'w' ),
0178 RTEMS_BARRIER_MANUAL_RELEASE,
0179 2,
0180 &wBarrier
0181 );
0182 rtems_test_assert( status == RTEMS_SUCCESSFUL );
0183
0184 readTaskName = rtems_build_name( 'T','A','r',' ' );
0185 status = rtems_task_create(
0186 readTaskName,
0187 1,
0188 RTEMS_MINIMUM_STACK_SIZE * 2,
0189 RTEMS_DEFAULT_MODES,
0190 RTEMS_DEFAULT_ATTRIBUTES,
0191 &readTaskID
0192 );
0193
0194 rtems_test_assert( status == RTEMS_SUCCESSFUL );
0195
0196 puts( "Init - Creating fifo file /fifo" );
0197 status = mkfifo( "/fifo", 0777 );
0198 rtems_test_assert( status == 0 );
0199
0200 puts( "Init - starting the read task" );
0201 status = rtems_task_start( readTaskID, read_task, 0 );
0202 rtems_test_assert( status == 0 );
0203
0204 puts( "Init - waiting at a barrier" );
0205 status = rtems_barrier_wait( wBarrier, RTEMS_NO_TIMEOUT );
0206 rtems_test_assert( status == RTEMS_SUCCESSFUL );
0207
0208 puts("Init - opening the fifo in write only mode -- OK");
0209 fd = open("/fifo", O_WRONLY);
0210 if(fd <= 0) {
0211 printf("Error opening file: (%d) :: %s\n", errno, strerror(errno));
0212 rtems_test_assert(0);
0213 }
0214
0215 puts( "Init - writing to /fifo" );
0216 status = write(fd, sendBuf, 0 );
0217 rtems_test_assert( status == 0 );
0218
0219 puts( "Init - releasing the read_task" );
0220 status = rtems_barrier_release( rBarrier, &released );
0221 rtems_test_assert( status == 0 );
0222
0223 puts( "Init - waiting at a barrier" );
0224 status = rtems_barrier_wait( wBarrier, RTEMS_NO_TIMEOUT );
0225 rtems_test_assert( status == RTEMS_SUCCESSFUL );
0226
0227 puts( "Init - writing to /fifo - OK" );
0228 status = write(fd, sendBuf, SEND_RCV_BUFSIZ - 30 );
0229 rtems_test_assert( status == SEND_RCV_BUFSIZ - 30 );
0230
0231 puts( "Init - writing to /fifo - OK" );
0232 status = write(fd, sendBuf+SEND_RCV_BUFSIZ - 30, 30 );
0233 rtems_test_assert( status == 30 );
0234
0235 puts( "Init - releasing the read_task" );
0236 status = rtems_barrier_release( rBarrier, &released );
0237 rtems_test_assert( status == 0 );
0238
0239 puts( "Init - waiting at a barrier" );
0240 status = rtems_barrier_wait( wBarrier, RTEMS_NO_TIMEOUT );
0241 rtems_test_assert( status == RTEMS_SUCCESSFUL );
0242
0243 puts( "Init - converting the write-mode to non-block" );
0244 status = ioctl( fd, FIONBIO, &flag );
0245 rtems_test_assert( status == 0 );
0246
0247 puts( "Init - writing to /fifo - OK" );
0248 status = write(fd, sendBuf, SEND_RCV_BUFSIZ - 30 );
0249 rtems_test_assert( status == SEND_RCV_BUFSIZ - 30 );
0250
0251 puts( "Init - writing to /fifo - Expect EAGAIN" );
0252 status = write(fd, sendBuf, SEND_RCV_BUFSIZ - 30 );
0253 rtems_test_assert( status == -1 );
0254 rtems_test_assert( errno == EAGAIN );
0255
0256 puts( "Init - releasing the read_task" );
0257 status = rtems_barrier_release( rBarrier, &released );
0258 rtems_test_assert( status == 0 );
0259
0260 puts( "Init - waiting at a barrier" );
0261 status = rtems_barrier_wait( wBarrier, RTEMS_NO_TIMEOUT );
0262 rtems_test_assert( status == RTEMS_SUCCESSFUL );
0263
0264 puts( "Init - writing to /fifo - Expect EPIPE" );
0265 status = write(fd, sendBuf, SEND_RCV_BUFSIZ - 30 );
0266 rtems_test_assert( status == -1 );
0267 rtems_test_assert( errno == EPIPE );
0268
0269 status = close( fd );
0270 rtems_test_assert( status == 0 );
0271
0272 puts( "Removing the fifo" );
0273 status = unlink("/fifo");
0274 rtems_test_assert(status == 0);
0275
0276 TEST_END();
0277 rtems_test_exit(0);
0278 }
0279
0280 #define CONFIGURE_APPLICATION_NEEDS_SIMPLE_CONSOLE_DRIVER
0281 #define CONFIGURE_APPLICATION_DOES_NOT_NEED_CLOCK_DRIVER
0282
0283 #define CONFIGURE_MAXIMUM_FILE_DESCRIPTORS 6
0284
0285 #define CONFIGURE_MAXIMUM_TASKS 3
0286
0287 #define CONFIGURE_INITIAL_EXTENSIONS RTEMS_TEST_INITIAL_EXTENSION
0288
0289 #define CONFIGURE_RTEMS_INIT_TASKS_TABLE
0290
0291 #define CONFIGURE_MAXIMUM_BARRIERS 2
0292
0293 #define CONFIGURE_IMFS_ENABLE_MKFIFO
0294
0295 #define CONFIGURE_INIT
0296 #include <rtems/confdefs.h>
0297
0298