📄 init.c
字号:
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 + -