⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 init.c

📁 RTEMS (Real-Time Executive for Multiprocessor Systems) is a free open source real-time operating sys
💻 C
📖 第 1 页 / 共 3 页
字号:
  printf( "%s Verify Queues are full\n", task_name );  for( que = RW_QUEUE; que < CLOSED; que++ )    Validate_attributes( Test_q[que].mq, Test_q[que].oflag, Test_q[que].count );}void verify_queues_empty(  char *task_name){  int             que;  printf( "%s Verify Queues are empty\n", task_name );  for( que = RW_QUEUE; que < CLOSED; que++ )     Validate_attributes( Test_q[que].mq, Test_q[que].oflag, 0 );}int fill_message_queues(  char *task_name){  int             msg;  int             que;  verify_queues_empty( task_name );  /*   * Fill Queue with predefined messages.   */  printf( "%s Fill Queues with messages\n", task_name );  for(msg=0; msg<MAXMSG; msg++){    for( que = RW_QUEUE; que < CLOSED; que++ ) {      Send_msg_to_que( que, msg );    }  }  verify_queues_full( "Init:" );  return msg; }void Read_msg_from_que(  int que,  int msg){  unsigned int    priority;  Test_Message_t *ptr;  int             status;  char            message[100];  char            err_msg[100];  ptr = &Predefined_Msgs[msg];  status = mq_receive(Test_q[ que ].mq, message, 100, &priority );  Test_q[que].count--;  sprintf( err_msg, "%s msg %s size failure", Test_q[ que ].name, ptr->msg );  fatal_int_service_status( status, ptr->size, err_msg );  assert( !strcmp( message, ptr->msg ) );  strcpy( message, "No Message" );  sprintf( err_msg,"%s msg %s size failure", Test_q[ que ].name, ptr->msg );  fatal_int_service_status(priority, ptr->priority, err_msg );}int empty_message_queues(  char *task_name){  int que;  int i;  printf( "%s Empty all Queues\n", task_name );  for( que = RW_QUEUE; que < CLOSED; que++ ) {    for(i=0; Test_q[que].count != 0; i++ )      Read_msg_from_que( que,  Priority_Order[i] );    Validate_attributes( Test_q[ que].mq, Test_q[ que ].oflag, 0 );  }  return 0;}/* * Returns the number of messages queued after the test on the * first queue. */int validate_mq_send_error_codes( ){  int             status;  int             i;  char           *str;  Start_Test( "mq_send errors" );  /*   * EBADF - Write to a closed queue.   */  puts( "Init: mq_send - Closed message queue (EBADF)" );  status = mq_send( Test_q[CLOSED].mq, "", 1, 0 );  fatal_posix_service_status( status, -1, "mq_send error return status");  fatal_posix_service_status( errno, EBADF, "mq_send errno EBADF");  /*   * EBADF - Write to a read only  queue.   */  puts( "Init: mq_send - Read only message queue (EBADF)" );  status = mq_send( Test_q[ RD_QUEUE ].mq, "", 1, 0 );  fatal_posix_service_status( status, -1, "mq_send error return status");  fatal_posix_service_status( errno, EBADF, "mq_send errno EBADF");  /*   * XXX - EINTR      Signal interrupted the call.   *  puts( "Init: mq_send - UNSUCCESSFUL (EINTR)" );  status = mq_send( Test_q, "", 0xffff, 0 );  fatal_posix_service_status( status, -1, "mq_send error return status");  fatal_posix_service_status( errno, E, "mq_send errno E");   */  /*   * EINVAL priority is out of range.   */  puts( "Init: mq_send - Priority out of range (EINVAL)" );  status = mq_send( Test_q[ RW_QUEUE ].mq, "", 1, MQ_PRIO_MAX + 1 );  fatal_posix_service_status( status, -1, "mq_send error return status");  fatal_posix_service_status( errno, EINVAL, "mq_send errno EINVAL");  /*   *  EMSGSIZE - Message size larger than msg_len   *             Validates that msgsize is stored correctly.   */  puts( "Init: mq_send - Message longer than msg_len (EMSGSIZE)" );  status = mq_send( Test_q[ RW_QUEUE ].mq, "", MSGSIZE+1, 0 );  fatal_posix_service_status( status, -1, "mq_send error return status");  fatal_posix_service_status( errno, EMSGSIZE, "mq_send errno EMSGSIZE");  i = fill_message_queues( "Init:" );  /*   * ENOSYS - send not supported   puts( "Init: mq_send - Blocking Queue overflow (ENOSYS)" );  status = mq_send( n_mq1, Predefined_Msgs[i], 0, 0 );  fatal_posix_service_status( status, -1, "mq_send error return status");  fatal_posix_service_status( errno, EBADF, "mq_send errno EBADF");  status = mq_close( n_mq1 );  fatal_posix_service_status( status, 0, "mq_close message queue");   status = mq_unlink( "read_only" );  fatal_posix_service_status( status, 0, "mq_unlink message queue");    */  /*   * EAGAIN - O_NONBLOCK and message queue is full.   */  puts( "Init: mq_send - on a FULL non-blocking queue with (EAGAIN)" );  str = Predefined_Msgs[i].msg;  status = mq_send(Test_q[RW_QUEUE].mq, str, 0, 0 );  fatal_posix_service_status( status, -1, "mq_send error return status");  fatal_posix_service_status( errno, EAGAIN, "mq_send errno EAGAIN");  return i-1;}void validate_mq_receive_error_codes( ){  int            status;  char           message[100];  unsigned int   priority;  Start_Test( "mq_receive errors"  );  /*   * EBADF - Not A Valid Message Queue   */  puts( "Init: mq_receive - Unopened message queue (EBADF)" );  status = mq_receive( Test_q[CLOSED].mq, message, 100, &priority );  fatal_posix_service_status( status, -1, "mq_ error return status");  fatal_posix_service_status( errno, EBADF, "mq_receive errno EBADF");  /*   * EBADF - Queue not opened to read   */  puts( "Init: mq_receive - Write only queue (EBADF)" );  status = mq_receive( Test_q[WR_QUEUE].mq, message, 100, &priority  );  fatal_posix_service_status( status, -1, "mq_ error return status");  fatal_posix_service_status( errno, EBADF, "mq_receive errno EBADF");  /*   * EMSGSIZE - Size is less than the message size attribute   */  puts( "Init: mq_receive - Size is less than the message (EMSGSIZE)" );  status = mq_receive(     Test_q[RW_QUEUE].mq, message, Predefined_Msgs[0].size-1, &priority );  fatal_posix_service_status( status, -1, "mq_ error return status");  fatal_posix_service_status( errno, EMSGSIZE, "mq_receive errno EMSGSIZE");  /*   * EAGAIN - O_NONBLOCK and Queue is empty    */  verify_queues_full( "Init:" );  empty_message_queues( "Init:" );  puts( "Init: mq_receive - Queue is empty (EAGAIN)" );  status = mq_receive( Test_q[RW_QUEUE].mq, message, 100, &priority );  fatal_posix_service_status( status, -1, "mq_ error return status");  fatal_posix_service_status( errno, EAGAIN, "mq_receive errno EAGAIN");  /*   * XXX - EINTR - Interrupted by a signal   */  /*   * XXX - EBADMSG - a data corruption problem.   */  /*   * XXX - ENOSYS - mq_receive not supported   */}void verify_open_functionality(){#if 0  mqd_t           n_mq;#endif  Start_Test( "mq_open functionality" );  /*   * Validate a second open returns the same message queue.   */#if 0  puts( "Init: mq_open - Open an existing mq ( same id )" );  n_mq = mq_open( RD_NAME, 0 );  fatal_posix_service_status(     (int) n_mq, (int ) Test_q[RD_QUEUE].mq, "mq_open error return status" );#endif}void verify_unlink_functionality(){    mqd_t           n_mq;  int             status;  Start_Test( "mq_unlink functionality" );  /*   * Unlink the message queue, then verify an open of the same name produces a    * different message queue.   */  puts( "Init: Unlink and Open without closing SUCCESSFUL" );  status = mq_unlink( DEFAULT_NAME );  fatal_posix_service_status( status, 0, "mq_unlink locked message queue");   n_mq = mq_open( DEFAULT_NAME, DEFAULT_ATTR, 0x777, NULL );  assert( n_mq != (-1) );  assert( n_mq != Test_q[ DEFAULT_RW ].mq );  status = mq_unlink( DEFAULT_NAME );  fatal_posix_service_status( status, 0, "mq_unlink locked message queue");   status = mq_close( Test_q[ DEFAULT_RW ].mq );  fatal_posix_service_status( status, 0, "mq_close message queue");   Test_q[ DEFAULT_RW ].mq = n_mq;}void verify_close_functionality(){  int i;  int status;  Start_Test( "Unlink and Close All Files"  );  for (i=0; i<DEFAULT_RW; i++) {        status = mq_unlink( Get_Queue_Name(i) );    fatal_posix_service_status( status, 0, "mq_unlink message queue");     status = mq_close( Test_q[i].mq );    fatal_posix_service_status( status, 0, "mq_close message queue");   }}void verify_timed_send_queue(  int  que,  int  is_blocking){  struct timespec timeout;  struct timeval  tv1, tv2, tv3;  struct timezone tz1, tz2;  int              len;  int              status;  char            *msg;  timeout.tv_sec  = 1;  timeout.tv_nsec = 0;   printf( "Init: mq_timedsend - on queue %s ", Test_q[que].name);  len = Predefined_Msgs[MAXMSG].size;  msg = Predefined_Msgs[MAXMSG].msg;  gettimeofday( &tv1, &tz1 );  status = mq_timedsend( Test_q[que].mq, msg, len , 0, &timeout );  gettimeofday( &tv2, &tz2 );  tv3.tv_sec  = tv2.tv_sec - tv1.tv_sec;  tv3.tv_usec = tv2.tv_usec - tv1.tv_usec;  if ( is_blocking ) { /* Don't verify the non-blocking queue */    fatal_int_service_status( status, -1, "mq_timedsend status");    fatal_posix_service_status( errno, ETIMEDOUT,  "errno ETIMEDOUT");  }  printf("Init: %ld sec %ld us\n", (long)tv3.tv_sec, (long)tv3.tv_usec );  if ( is_blocking ) /* non-blocking queue */    assert( tv3.tv_sec == 1 );  else    assert( tv3.tv_sec == 0 );  if ( que == DEFAULT_RW )    Test_q[que].count++;}void verify_timed_send(){  int              que;  Start_Test( "mq_timedsend"  );  for( que = RW_QUEUE; que < CLOSED; que++ ) {    if ( que == BLOCKING )       verify_timed_send_queue( que, 1 );    else      verify_timed_send_queue( que, 0 );  }}void verify_timed_receive_queue(  char *task_name,  int   que,  int   is_blocking){  char message[ 100 ];  unsigned int priority;  struct timespec tm;  struct timeval  tv1, tv2, tv3;  struct timezone tz1, tz2;  int              status;   tm.tv_sec  = 1;  tm.tv_nsec = 0;  printf( "Init: %s mq_timedreceive - on queue %s ", task_name, Test_q[que].name);  gettimeofday( &tv1, &tz1 );  status = mq_timedreceive( Test_q[ que ].mq, message, 100, &priority, &tm );  gettimeofday( &tv2, &tz2 );  tv3.tv_sec  = tv2.tv_sec - tv1.tv_sec;  tv3.tv_usec = tv2.tv_usec - tv1.tv_usec;  fatal_int_service_status( status, -1, "mq_timedreceive status");  if ( is_blocking )    fatal_posix_service_status( errno, ETIMEDOUT,  "errno ETIMEDOUT");  printf( "Init: %ld sec %ld us\n", (long)tv3.tv_sec, (long)tv3.tv_usec );  if ( is_blocking )    assert( tv3.tv_sec == 1 );  else    assert( tv3.tv_sec == 0 );}void verify_timed_receive(){  int  que;   Start_Test( "mq_timedreceive"  );  for( que = RW_QUEUE; que < CLOSED; que++ ) {    if (( que == BLOCKING ) || ( que == DEFAULT_RW ))      verify_timed_receive_queue( "Init:", que, 1 );    else      verify_timed_receive_queue( "Init:", que, 0 );  }}#if (0)void verify_set_attr(){  struct mq_attr save_attr[ NUMBER_OF_TEST_QUEUES ];  struct mq_attr attr;  int            i;  int            status;  attr.mq_maxmsg  = 0;  attr.mq_msgsize = 0;  Start_Test( "mq_setattr"  );  puts( "Init: set_attr all queues to blocking" );  for(i=0; i<CLOSED; i++) {    attr.mq_flags =  Test_q[i].oflag & (~O_NONBLOCK );    status = mq_setattr( Test_q[i].mq, &attr, &save_attr[i] );    fatal_int_service_status( status, 0, "mq_setattr valid return status");    Validate_attributes( Test_q[i].mq, attr.mq_flags, 0 );  }  for( i = RW_QUEUE; i < CLOSED; i++ ) {    verify_timed_receive_queue( "Init:", i, 1 );  }    for(i=0; i<CLOSED; i++) {    attr.mq_flags =  Test_q[i].oflag & (~O_NONBLOCK );    status = mq_setattr( Test_q[i].mq, &save_attr[i], NULL );    fatal_int_service_status( status, 0, "mq_setattr valid return status");    Validate_attributes( Test_q[i].mq, Test_q[i].oflag, 0 );  }}#endifvoid wait_for_signal(

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -