File indexing completed on 2025-05-11 08:24:40
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 #define CONFIGURE_INIT
0034 #include "system.h"
0035
0036 #include <fcntl.h> /* For O_* constants */
0037 #include <sys/stat.h> /* For mode constants */
0038 #include <mqueue.h>
0039
0040 #include "test_support.h"
0041
0042 const char rtems_test_name[] = "PSXMSGQ 3";
0043
0044
0045 rtems_timer_service_routine mq_send_timer(rtems_id timer, void *arg);
0046
0047 mqd_t Queue;
0048 volatile bool tsr_fired;
0049 volatile int tsr_status;
0050 volatile int tsr_errno;
0051
0052 rtems_timer_service_routine mq_send_timer(
0053 rtems_id timer,
0054 void *arg
0055 )
0056 {
0057 int msg = 4;
0058
0059 tsr_fired = true;
0060
0061 tsr_status = mq_send( Queue, (const char *)&msg, sizeof(int), 1 );
0062 tsr_errno = errno;
0063 }
0064
0065 void *POSIX_Init(
0066 void *argument
0067 )
0068 {
0069 struct mq_attr attr;
0070 int status;
0071 rtems_id timer;
0072 rtems_status_code rc;
0073
0074 TEST_BEGIN();
0075
0076 attr.mq_maxmsg = 1;
0077 attr.mq_msgsize = sizeof(int);
0078
0079 puts( "Init - Open message queue" );
0080 Queue = mq_open( "Qsend", O_CREAT | O_RDWR, 0x777, &attr );
0081 if ( Queue == (-1) ) {
0082 perror( "mq_open failed" );
0083 }
0084 rtems_test_assert( Queue != (-1) );
0085
0086 puts( "Init - send to message queue" );
0087 status = mq_send( Queue, (const char *)&status, sizeof(int), 1 );
0088 if ( status == (-1) ) {
0089 perror( "mq_status failed" );
0090 }
0091 rtems_test_assert( status != (-1) );
0092
0093
0094
0095
0096 puts( "Init - Create Classic API Timer" );
0097 rc = rtems_timer_create( 1, &timer );
0098 directive_failed( rc, "rtems_timer_create" );
0099
0100 puts( "Init - Fire After Classic API Timer" );
0101 tsr_fired = false;
0102
0103 rc = rtems_timer_fire_after(
0104 timer,
0105 rtems_clock_get_ticks_per_second(),
0106 mq_send_timer,
0107 NULL
0108 );
0109 directive_failed( rc, "rtems_timer_fire_after" );
0110
0111 sleep(2);
0112
0113 if ( tsr_fired == false ) {
0114 puts( "ERROR -- TSR DID NOT FIRE" );
0115 rtems_test_exit( 0 );
0116 }
0117 if ( (tsr_status != -1) || (tsr_errno != EAGAIN) ) {
0118 puts( "ERROR -- TSR DID NOT RETURN CORRECT STATUS" );
0119 printf(
0120 "status=%d errno=%d --> %s\n",
0121 tsr_status,
0122 tsr_errno,
0123 strerror(tsr_errno)
0124 );
0125 rtems_test_exit( 0 );
0126 }
0127
0128 puts( "Init - mq_send from ISR returned correct status" );
0129
0130 TEST_END();
0131 rtems_test_exit( 0 );
0132
0133 return NULL;
0134 }