diff options
Diffstat (limited to 'testsuites/ada/sptests/sp13/sptest.adb')
-rw-r--r-- | testsuites/ada/sptests/sp13/sptest.adb | 891 |
1 files changed, 891 insertions, 0 deletions
diff --git a/testsuites/ada/sptests/sp13/sptest.adb b/testsuites/ada/sptests/sp13/sptest.adb new file mode 100644 index 0000000000..7b61b9e7ba --- /dev/null +++ b/testsuites/ada/sptests/sp13/sptest.adb @@ -0,0 +1,891 @@ +-- +-- SPTEST / BODY +-- +-- DESCRIPTION: +-- +-- This package is the implementation of Test 13 of the RTEMS +-- Single Processor Test Suite. +-- +-- DEPENDENCIES: +-- +-- +-- +-- COPYRIGHT (c) 1989-2011. +-- On-Line Applications Research Corporation (OAR). +-- +-- The license and distribution terms for this file may in +-- the file LICENSE in this distribution or at +-- http://www.rtems.org/license/LICENSE. +-- + +with INTERFACES; use INTERFACES; +with RTEMS; +with RTEMS.MESSAGE_QUEUE; +with TEST_SUPPORT; +with TEXT_IO; +with UNSIGNED32_IO; +use type RTEMS.STATUS_CODES; + +package body SPTEST is + + type BIG_BUFFER_TYPE is array (1 .. 2048) of RTEMS.UNSIGNED8; + + +-- +-- INIT +-- + + procedure INIT ( + ARGUMENT : in RTEMS.TASKS.ARGUMENT + ) is + pragma Unreferenced(ARGUMENT); + STATUS : RTEMS.STATUS_CODES; + begin + + TEXT_IO.NEW_LINE( 2 ); + TEXT_IO.PUT_LINE( "*** TEST 13 ***" ); + + SPTEST.TASK_NAME( 1 ) := RTEMS.BUILD_NAME( 'T', 'A', '1', ' ' ); + SPTEST.TASK_NAME( 2 ) := RTEMS.BUILD_NAME( 'T', 'A', '2', ' ' ); + SPTEST.TASK_NAME( 3 ) := RTEMS.BUILD_NAME( 'T', 'A', '3', ' ' ); + + RTEMS.TASKS.CREATE( + SPTEST.TASK_NAME( 1 ), + 4, + 2048, + RTEMS.DEFAULT_MODES, + RTEMS.DEFAULT_ATTRIBUTES, + SPTEST.TASK_ID( 1 ), + STATUS + ); + TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "TASK_CREATE OF TA1" ); + + RTEMS.TASKS.CREATE( + SPTEST.TASK_NAME( 2 ), + 4, + 2048, + RTEMS.DEFAULT_MODES, + RTEMS.DEFAULT_ATTRIBUTES, + SPTEST.TASK_ID( 2 ), + STATUS + ); + TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "TASK_CREATE OF TA2" ); + + RTEMS.TASKS.CREATE( + SPTEST.TASK_NAME( 3 ), + 4, + 2048, + RTEMS.DEFAULT_MODES, + RTEMS.DEFAULT_ATTRIBUTES, + SPTEST.TASK_ID( 3 ), + STATUS + ); + TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "TASK_CREATE OF TA3" ); + + RTEMS.TASKS.START( + SPTEST.TASK_ID( 1 ), + SPTEST.TASK_1'ACCESS, + 0, + STATUS + ); + TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "TASK_START OF TA1" ); + + RTEMS.TASKS.START( + SPTEST.TASK_ID( 2 ), + SPTEST.TASK_2'ACCESS, + 0, + STATUS + ); + TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "TASK_START OF TA2" ); + + RTEMS.TASKS.START( + SPTEST.TASK_ID( 3 ), + SPTEST.TASK_3'ACCESS, + 0, + STATUS + ); + TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "TASK_START OF TA3" ); + + SPTEST.QUEUE_NAME( 1 ) := RTEMS.BUILD_NAME( 'Q', '1', ' ', ' ' ); + SPTEST.QUEUE_NAME( 2 ) := RTEMS.BUILD_NAME( 'Q', '2', ' ', ' ' ); + SPTEST.QUEUE_NAME( 3 ) := RTEMS.BUILD_NAME( 'Q', '3', ' ', ' ' ); + + RTEMS.MESSAGE_QUEUE.CREATE( + SPTEST.QUEUE_NAME( 1 ), + 100, + 16, + RTEMS.DEFAULT_ATTRIBUTES, + SPTEST.QUEUE_ID( 1 ), + STATUS + ); + TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "QUEUE_CREATE OF Q1" ); + + RTEMS.MESSAGE_QUEUE.CREATE( + SPTEST.QUEUE_NAME( 2 ), + 10, + 16, + RTEMS.PRIORITY, + SPTEST.QUEUE_ID( 2 ), + STATUS + ); + TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "QUEUE_CREATE OF Q2" ); + + RTEMS.MESSAGE_QUEUE.CREATE( + SPTEST.QUEUE_NAME( 3 ), + 100, + 16, + RTEMS.DEFAULT_ATTRIBUTES, + SPTEST.QUEUE_ID( 3 ), + STATUS + ); + TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "QUEUE_CREATE OF Q3" ); + + RTEMS.TASKS.DELETE( RTEMS.SELF, STATUS ); + TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "TASK_DELETE OF SELF" ); + + end INIT; + +-- +-- FILL_BUFFER +-- + +-- +-- Depends on tricks to make the copy work. +-- + + procedure FILL_BUFFER ( + SOURCE : in STRING; + BUFFER : out SPTEST.BUFFER + ) is + begin + + BUFFER.FIELD1 := RTEMS.BUILD_NAME( + SOURCE( SOURCE'FIRST ), + SOURCE( SOURCE'FIRST + 1 ), + SOURCE( SOURCE'FIRST + 2 ), + SOURCE( SOURCE'FIRST + 3 ) + ); + + BUFFER.FIELD2 := RTEMS.BUILD_NAME( + SOURCE( SOURCE'FIRST + 4 ), + SOURCE( SOURCE'FIRST + 5 ), + SOURCE( SOURCE'FIRST + 6 ), + SOURCE( SOURCE'FIRST + 7 ) + ); + + BUFFER.FIELD3 := RTEMS.BUILD_NAME( + SOURCE( SOURCE'FIRST + 8 ), + SOURCE( SOURCE'FIRST + 9 ), + SOURCE( SOURCE'FIRST + 10 ), + SOURCE( SOURCE'FIRST + 11 ) + ); + + BUFFER.FIELD4 := RTEMS.BUILD_NAME( + SOURCE( SOURCE'FIRST + 12 ), + SOURCE( SOURCE'FIRST + 13 ), + SOURCE( SOURCE'FIRST + 14 ), + SOURCE( SOURCE'FIRST + 15 ) + ); + + end FILL_BUFFER; + +-- +-- PUT_BUFFER +-- + +-- +-- Depends on tricks to make the output work. +-- + + procedure PUT_BUFFER ( + BUFFER : in SPTEST.BUFFER + ) is + begin + + TEST_SUPPORT.PUT_NAME( BUFFER.FIELD1, FALSE ); + TEST_SUPPORT.PUT_NAME( BUFFER.FIELD2, FALSE ); + TEST_SUPPORT.PUT_NAME( BUFFER.FIELD3, FALSE ); + TEST_SUPPORT.PUT_NAME( BUFFER.FIELD4, FALSE ); + + end PUT_BUFFER; + +-- +-- TASK_1 +-- + + procedure TASK_1 ( + ARGUMENT : in RTEMS.TASKS.ARGUMENT + ) is + pragma Unreferenced(ARGUMENT); + QID : RTEMS.ID; + BIG_SEND_BUFFER : BIG_BUFFER_TYPE; + BIG_SEND_BUFFER_POINTER : constant RTEMS.ADDRESS + := BIG_SEND_BUFFER'ADDRESS; + BIG_RECEIVE_BUFFER : BIG_BUFFER_TYPE; + BIG_RECEIVE_BUFFER_POINTER : constant RTEMS.ADDRESS + := BIG_RECEIVE_BUFFER'ADDRESS; + BUFFER : SPTEST.BUFFER; + BUFFER_POINTER : constant RTEMS.ADDRESS := BUFFER'ADDRESS; + COUNT : RTEMS.UNSIGNED32; + MESSAGE_SIZE : RTEMS.UNSIGNED32 := 0; + STATUS : RTEMS.STATUS_CODES; + SIZE : RTEMS.UNSIGNED32 := 0; + begin + + RTEMS.MESSAGE_QUEUE.IDENT( + SPTEST.QUEUE_NAME( 1 ), + RTEMS.SEARCH_ALL_NODES, + QID, + STATUS + ); + TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "MESSAGE_QUEUE_IDENT" ); + TEXT_IO.PUT( "TA1 - message_queue_ident - qid => " ); + UNSIGNED32_IO.PUT( QID, WIDTH => 8, BASE => 16 ); + TEXT_IO.NEW_LINE; + + SPTEST.FILL_BUFFER( "BUFFER 1 TO Q 1 ", BUFFER ); + TEXT_IO.PUT_LINE( "TA1 - message_queue_send - BUFFER 1 TO Q 1" ); + RTEMS.MESSAGE_QUEUE.SEND( + SPTEST.QUEUE_ID( 1 ), + BUFFER_POINTER, + 16, + STATUS + ); + TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "MESSAGE_QUEUE_SEND" ); + + SPTEST.FILL_BUFFER( "BUFFER 2 TO Q 1 ", BUFFER ); + TEXT_IO.PUT_LINE( "TA1 - message_queue_send - BUFFER 2 TO Q 1" ); + RTEMS.MESSAGE_QUEUE.SEND( + SPTEST.QUEUE_ID( 1 ), + BUFFER_POINTER, + 16, + STATUS + ); + TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "MESSAGE_QUEUE_SEND" ); + + TEXT_IO.PUT_LINE( "TA1 - task_wake_after - sleep 5 seconds" ); + RTEMS.TASKS.WAKE_AFTER( 5 * TEST_SUPPORT.TICKS_PER_SECOND, STATUS ); + TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "TASK_WAKE_AFTER" ); + + SPTEST.FILL_BUFFER( "BUFFER 3 TO Q 1 ", BUFFER ); + TEXT_IO.PUT_LINE( "TA1 - message_queue_send - BUFFER 3 TO Q 1" ); + RTEMS.MESSAGE_QUEUE.SEND( + SPTEST.QUEUE_ID( 1 ), + BUFFER_POINTER, + 16, + STATUS + ); + TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "MESSAGE_QUEUE_SEND" ); + + TEXT_IO.PUT_LINE( "TA1 - task_wake_after - sleep 5 seconds" ); + RTEMS.TASKS.WAKE_AFTER( 5 * TEST_SUPPORT.TICKS_PER_SECOND, STATUS ); + TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "TASK_WAKE_AFTER" ); + +TEST_SUPPORT.PAUSE; + + SPTEST.FILL_BUFFER( "BUFFER 1 TO Q 2 ", BUFFER ); + TEXT_IO.PUT_LINE( "TA1 - message_queue_send - BUFFER 1 TO Q 2" ); + RTEMS.MESSAGE_QUEUE.SEND( + SPTEST.QUEUE_ID( 2 ), + BUFFER_POINTER, + 16, + STATUS + ); + TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "MESSAGE_QUEUE_SEND" ); + + TEXT_IO.PUT( + "TA1 - message_queue_receive - receive from queue 1 - " + ); + TEXT_IO.PUT_LINE( "10 second timeout" ); + RTEMS.MESSAGE_QUEUE.RECEIVE( + SPTEST.QUEUE_ID( 1 ), + BUFFER_POINTER, + RTEMS.DEFAULT_OPTIONS, + 10 * TEST_SUPPORT.TICKS_PER_SECOND, + MESSAGE_SIZE, + STATUS + ); + TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "MESSAGE_QUEUE_RECEIVE" ); + TEXT_IO.PUT( "TA1 - buffer received: " ); + SPTEST.PUT_BUFFER( BUFFER ); + TEXT_IO.NEW_LINE; + + TEXT_IO.PUT_LINE( "TA1 - task_delete - delete TA2" ); + RTEMS.TASKS.DELETE( SPTEST.TASK_ID( 2 ), STATUS ); + TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "TASK_DELETE" ); + + SPTEST.FILL_BUFFER( "BUFFER 1 TO Q 3 ", BUFFER ); + TEXT_IO.PUT_LINE( "TA1 - message_queue_send - BUFFER 1 TO Q 3" ); + RTEMS.MESSAGE_QUEUE.SEND( + SPTEST.QUEUE_ID( 3 ), + BUFFER_POINTER, + 16, + STATUS + ); + TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "MESSAGE_QUEUE_SEND" ); + + TEXT_IO.PUT_LINE( "TA1 - task_wake_after - sleep 5 seconds" ); + RTEMS.TASKS.WAKE_AFTER( 5 * TEST_SUPPORT.TICKS_PER_SECOND, STATUS ); + TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "TASK_WAKE_AFTER" ); + +TEST_SUPPORT.PAUSE; + + SPTEST.FILL_BUFFER( "BUFFER 2 TO Q 3 ", BUFFER ); + TEXT_IO.PUT_LINE( "TA1 - message_queue_send - BUFFER 2 TO Q 3" ); + RTEMS.MESSAGE_QUEUE.SEND( + SPTEST.QUEUE_ID( 3 ), + BUFFER_POINTER, + 16, + STATUS + ); + TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "MESSAGE_QUEUE_SEND" ); + + SPTEST.FILL_BUFFER( "BUFFER 3 TO Q 3 ", BUFFER ); + TEXT_IO.PUT_LINE( "TA1 - message_queue_send - BUFFER 3 TO Q 3" ); + RTEMS.MESSAGE_QUEUE.SEND( + SPTEST.QUEUE_ID( 3 ), + BUFFER_POINTER, + 16, + STATUS + ); + TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "MESSAGE_QUEUE_SEND" ); + + SPTEST.FILL_BUFFER( "BUFFER 4 TO Q 3 ", BUFFER ); + TEXT_IO.PUT_LINE( "TA1 - message_queue_send - BUFFER 4 TO Q 3" ); + RTEMS.MESSAGE_QUEUE.SEND( + SPTEST.QUEUE_ID( 3 ), + BUFFER_POINTER, + 16, + STATUS + ); + TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "MESSAGE_QUEUE_SEND" ); + + SPTEST.FILL_BUFFER( "BUFFER 5 TO Q 3 ", BUFFER ); + TEXT_IO.PUT_LINE( "TA1 - message_queue_urgent - BUFFER 5 TO Q 3" ); + RTEMS.MESSAGE_QUEUE.URGENT( + SPTEST.QUEUE_ID( 3 ), + BUFFER_POINTER, + 16, + STATUS + ); + TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "MESSAGE_QUEUE_URGENT" ); + + for TIMES in 1 .. 4 + loop + TEXT_IO.PUT( + "TA1 - message_queue_receive - receive from queue 3 - " + ); + TEXT_IO.PUT_LINE( "WAIT FOREVER" ); + RTEMS.MESSAGE_QUEUE.RECEIVE( + SPTEST.QUEUE_ID( 3 ), + BUFFER_POINTER, + RTEMS.DEFAULT_OPTIONS, + RTEMS.NO_TIMEOUT, + MESSAGE_SIZE, + STATUS + ); + TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "MESSAGE_QUEUE_RECEIVE" ); + TEXT_IO.PUT( "TA1 - buffer received: " ); + SPTEST.PUT_BUFFER( BUFFER ); + TEXT_IO.NEW_LINE; + end loop; + + SPTEST.FILL_BUFFER( "BUFFER 3 TO Q 2 ", BUFFER ); + TEXT_IO.PUT_LINE( "TA1 - message_queue_urgent - BUFFER 3 TO Q 2" ); + RTEMS.MESSAGE_QUEUE.URGENT( + SPTEST.QUEUE_ID( 2 ), + BUFFER_POINTER, + 16, + STATUS + ); + TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "MESSAGE_QUEUE_URGENT" ); + + TEXT_IO.PUT( + "TA1 - message_queue_receive - receive from queue 2 - " + ); + TEXT_IO.PUT_LINE( "WAIT FOREVER" ); + RTEMS.MESSAGE_QUEUE.RECEIVE( + SPTEST.QUEUE_ID( 2 ), + BUFFER_POINTER, + RTEMS.DEFAULT_OPTIONS, + RTEMS.NO_TIMEOUT, + MESSAGE_SIZE, + STATUS + ); + TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "MESSAGE_QUEUE_RECEIVE" ); + TEXT_IO.PUT( "TA1 - buffer received: " ); + SPTEST.PUT_BUFFER( BUFFER ); + TEXT_IO.NEW_LINE; + +TEST_SUPPORT.PAUSE; + + TEXT_IO.PUT_LINE( "TA1 - message_queue_delete - delete queue 1" ); + RTEMS.MESSAGE_QUEUE.DELETE( SPTEST.QUEUE_ID( 1 ), STATUS ); + TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "MESSAGE_QUEUE_DELETE" ); + + SPTEST.FILL_BUFFER( "BUFFER 3 TO Q 2 ", BUFFER ); + TEXT_IO.PUT_LINE( "TA1 - message_queue_urgent - BUFFER 3 TO Q 2" ); + RTEMS.MESSAGE_QUEUE.URGENT( + SPTEST.QUEUE_ID( 2 ), + BUFFER_POINTER, + 16, + STATUS + ); + TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "MESSAGE_QUEUE_URGENT" ); + + TEXT_IO.PUT_LINE( "TA1 - message_queue_delete - delete queue 2" ); + RTEMS.MESSAGE_QUEUE.DELETE( SPTEST.QUEUE_ID( 2 ), STATUS ); + TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "MESSAGE_QUEUE_DELETE" ); + + TEXT_IO.PUT_LINE( "TA1 - message_queue_get_number_pending - check Q 3" ); + RTEMS.MESSAGE_QUEUE.GET_NUMBER_PENDING( + SPTEST.QUEUE_ID( 3 ), COUNT, STATUS + ); + TEST_SUPPORT.DIRECTIVE_FAILED( + STATUS, "MESSAGE_QUEUE_GET_NUMBER_PENDING" + ); + TEXT_IO.PUT( "TA1 - " ); + UNSIGNED32_IO.PUT( COUNT, WIDTH => 3, BASE => 10 ); + TEXT_IO.PUT_LINE( " messages are pending on Q 3" ); + + TEXT_IO.PUT_LINE( "TA1 - message_queue_flush - empty Q 3" ); + RTEMS.MESSAGE_QUEUE.FLUSH( SPTEST.QUEUE_ID( 3 ), COUNT, STATUS ); + TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "MESSAGE_QUEUE_FLUSH" ); + TEXT_IO.PUT( "TA1 - " ); + UNSIGNED32_IO.PUT( COUNT, WIDTH => 3, BASE => 10 ); + TEXT_IO.PUT_LINE( " messages were flushed from Q 3" ); + + SPTEST.FILL_BUFFER( "BUFFER 1 TO Q 3 ", BUFFER ); + TEXT_IO.PUT_LINE( "TA1 - message_queue_send - BUFFER 1 TO Q 3" ); + RTEMS.MESSAGE_QUEUE.SEND( + SPTEST.QUEUE_ID( 3 ), + BUFFER_POINTER, + 16, + STATUS + ); + TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "MESSAGE_QUEUE_SEND" ); + + SPTEST.FILL_BUFFER( "BUFFER 2 TO Q 3 ", BUFFER ); + TEXT_IO.PUT_LINE( "TA1 - message_queue_send - BUFFER 2 TO Q 3" ); + RTEMS.MESSAGE_QUEUE.SEND( + SPTEST.QUEUE_ID( 3 ), + BUFFER_POINTER, + 16, + STATUS + ); + TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "MESSAGE_QUEUE_SEND" ); + + -- this broadcast should have no effect on the queue + SPTEST.FIlL_BUFFER( "NO BUFFER TO Q1 ", BUFFER ); + TEXT_IO.PUT_LINE( "TA1 - message_queue_broadcast - NO BUFFER TO Q1" ); + RTEMS.MESSAGE_QUEUE.BROADCAST( + SPTEST.QUEUE_ID( 1 ), + BUFFER_POINTER, + 16, + COUNT, + STATUS + ); + TEXT_IO.PUT( "TA1 - number of tasks awakened = " ); + UNSIGNED32_IO.PUT( COUNT, WIDTH => 3, BASE => 10 ); + TEXT_IO.NEW_LINE; + + TEXT_IO.PUT_LINE( "TA1 - message_queue_get_number_pending - check Q 3" ); + RTEMS.MESSAGE_QUEUE.GET_NUMBER_PENDING( + SPTEST.QUEUE_ID( 3 ), COUNT, STATUS + ); + TEST_SUPPORT.DIRECTIVE_FAILED( + STATUS, "MESSAGE_QUEUE_GET_NUMBER_PENDING" + ); + TEXT_IO.PUT( "TA1 - " ); + UNSIGNED32_IO.PUT( COUNT, WIDTH => 3, BASE => 10 ); + TEXT_IO.PUT_LINE( " messages are pending on Q 3" ); + + SPTEST.FILL_BUFFER( "BUFFER 3 TO Q 3 ", BUFFER ); + TEXT_IO.PUT_LINE( "TA1 - message_queue_send - BUFFER 3 TO Q 3" ); + RTEMS.MESSAGE_QUEUE.SEND( + SPTEST.QUEUE_ID( 3 ), + BUFFER_POINTER, + 16, + STATUS + ); + TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "MESSAGE_QUEUE_SEND" ); + + TEXT_IO.PUT_LINE( "TA1 - message_queue_flush - Q 3" ); + RTEMS.MESSAGE_QUEUE.FLUSH( SPTEST.QUEUE_ID( 3 ), COUNT, STATUS ); + TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "MESSAGE_QUEUE_FLUSH" ); + TEXT_IO.PUT( "TA1 - " ); + UNSIGNED32_IO.PUT( COUNT, WIDTH => 3, BASE => 10 ); + TEXT_IO.PUT_LINE( " messages were flushed from Q 3" ); + + TEXT_IO.PUT_LINE( + "TA1 - message_queue_send - until all message buffers consumed" + ); + loop + + RTEMS.MESSAGE_QUEUE.SEND( + SPTEST.QUEUE_ID( 3 ), + BUFFER_POINTER, + 16, + STATUS + ); + + exit when RTEMS.ARE_STATUSES_EQUAL( STATUS, RTEMS.TOO_MANY ); + + TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "MESSAGE_QUEUE_SEND" ); + + end loop; + + TEXT_IO.PUT_LINE( + "TA1 - message_queue_send - all message buffers consumed" + ); + + TEXT_IO.PUT_LINE( "TA1 - message_queue_flush - Q 3" ); + RTEMS.MESSAGE_QUEUE.FLUSH( SPTEST.QUEUE_ID( 3 ), COUNT, STATUS ); + TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "MESSAGE_QUEUE_FLUSH" ); + TEXT_IO.PUT( "TA1 - " ); + UNSIGNED32_IO.PUT( COUNT, WIDTH => 3, BASE => 10 ); + TEXT_IO.PUT_LINE( " messages were flushed from Q 3" ); + +TEST_SUPPORT.PAUSE; + + TEXT_IO.PUT_LINE( "TA1 - create message queue of 20 bytes on queue 1" ); + RTEMS.MESSAGE_QUEUE.CREATE( + SPTEST.QUEUE_NAME( 1 ), + 100, + 20, + RTEMS.DEFAULT_ATTRIBUTES, + SPTEST.QUEUE_ID( 1 ), + STATUS + ); + TEST_SUPPORT.DIRECTIVE_FAILED( + STATUS, "MESSAGE_QUEUE_CREATE of Q1; 20 bytes each" + ); + RTEMS.MESSAGE_QUEUE.SEND( + SPTEST.QUEUE_ID( 1 ), BIG_SEND_BUFFER_POINTER, 40, STATUS + ); + TEST_SUPPORT.FATAL_DIRECTIVE_STATUS( + STATUS, RTEMS.INVALID_SIZE, "expected INVALID_SIZE" + ); + + TEXT_IO.PUT_LINE( "TA1 - message_queue_delete - delete queue 1" ); + RTEMS.MESSAGE_QUEUE.DELETE( SPTEST.QUEUE_ID( 1 ), STATUS ); + TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "MESSAGE_QUEUE_DELETE" ); + +TEST_SUPPORT.PAUSE; + + TEXT_IO.PUT_LINE( "TA1 - message_queue_create - variable sizes " ); + for QUEUE_SIZE in 1 .. 1029 loop + RTEMS.MESSAGE_QUEUE.CREATE( + SPTEST.QUEUE_NAME( 1 ), + 2, -- just 2 msgs each + RTEMS.UNSIGNED32( QUEUE_SIZE ), + RTEMS.DEFAULT_ATTRIBUTES, + QUEUE_ID( 1 ), + STATUS + ); + if STATUS /= RTEMS.SUCCESSFUL then + TEXT_IO.PUT( "TA1 - msq que size: " ); + UNSIGNED32_IO.PUT( + RTEMS.UNSIGNED32( QUEUE_SIZE ), WIDTH => 3, BASE => 10 + ); + TEXT_IO.NEW_LINE; + TEST_SUPPORT.DIRECTIVE_FAILED( + STATUS, "message_queue_create of Q1" + ); + end if; + + RTEMS.MESSAGE_QUEUE.DELETE( SPTEST.QUEUE_ID( 1 ), STATUS ); + TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "message_queue_delete" ); + end loop; + + TEXT_IO.PUT_LINE( + "TA1 - message_queue_create and send - variable sizes " + ); + for QUEUE_SIZE in 1 .. 1029 loop + + RTEMS.MESSAGE_QUEUE.CREATE( + SPTEST.QUEUE_NAME( 1 ), + 2, -- just 2 msgs each + RTEMS.UNSIGNED32( QUEUE_SIZE ), + RTEMS.DEFAULT_ATTRIBUTES, + SPTEST.QUEUE_ID( 1 ), + STATUS + ); + TEST_SUPPORT.DIRECTIVE_FAILED(status, "message_queue_create of Q1"); + + BIG_SEND_BUFFER := (others => CHARACTER'POS( 'A' )); + BIG_RECEIVE_BUFFER := (others => CHARACTER'POS( 'Z' )); + + -- send a msg too big + RTEMS.MESSAGE_QUEUE.SEND( + SPTEST.QUEUE_ID( 1 ), + BIG_SEND_BUFFER_POINTER, + RTEMS.UNSIGNED32( QUEUE_SIZE + 1 ), + STATUS + ); + TEST_SUPPORT.FATAL_DIRECTIVE_STATUS( + STATUS, RTEMS.INVALID_SIZE, "message_queue_send too large" + ); + + -- send a msg that is just right + RTEMS.MESSAGE_QUEUE.SEND( + SPTEST.QUEUE_ID( 1 ), + BIG_SEND_BUFFER_POINTER, + RTEMS.UNSIGNED32( QUEUE_SIZE ), + STATUS + ); + TEST_SUPPORT.DIRECTIVE_FAILED( + STATUS, "message_queue_send exact size" + ); + + -- now read and verify the message just sent + SIZE := INTERFACES.UNSIGNED_32(QUEUE_SIZE); + RTEMS.MESSAGE_QUEUE.RECEIVE( + SPTEST.QUEUE_ID( 1 ), + BIG_RECEIVE_BUFFER_POINTER, + RTEMS.DEFAULT_OPTIONS, + 1 * TEST_SUPPORT.TICKS_PER_SECOND, + SIZE, + STATUS + ); + TEST_SUPPORT.DIRECTIVE_FAILED( + STATUS, "message_queue_receive exact size" + ); + if SIZE /= RTEMS.UNSIGNED32( QUEUE_SIZE ) then + TEXT_IO.PUT( + "TA1 - exact size size match failed for queue_size = " + ); + UNSIGNED32_IO.PUT( + RTEMS.UNSIGNED32( QUEUE_SIZE ), WIDTH => 3, BASE => 10 + ); + TEXT_IO.NEW_LINE; + end if; + + if (BIG_SEND_BUFFER( BIG_SEND_BUFFER'FIRST .. Integer( SIZE )) /= + BIG_RECEIVE_BUFFER( BIG_RECEIVE_BUFFER'FIRST .. Integer( SIZE ))) + then + TEXT_IO.PUT_LINE("TA1 - exact size data match failed"); + end if; + + for I in Integer( SIZE + 1 ) .. BIG_RECEIVE_BUFFER'LAST loop + if BIG_RECEIVE_BUFFER( I ) /= CHARACTER'POS( 'Z' ) then + TEXT_IO.PUT_LINE("TA1 - exact size overrun match failed"); + end if; + end loop; + + -- all done with this one; delete it + RTEMS.MESSAGE_QUEUE.DELETE( SPTEST.QUEUE_ID( 1 ), STATUS ); + TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "message_queue_delete" ); + end loop; + + TEXT_IO.PUT_LINE( "*** END OF TEST 13 ***" ); + RTEMS.SHUTDOWN_EXECUTIVE( 0 ); + + end TASK_1; + +-- +-- TASK_2 +-- + + procedure TASK_2 ( + ARGUMENT : in RTEMS.TASKS.ARGUMENT + ) is + pragma Unreferenced(ARGUMENT); + BUFFER : SPTEST.BUFFER; + BUFFER_POINTER : RTEMS.ADDRESS; + PREVIOUS_PRIORITY : RTEMS.TASKS.PRIORITY; + MESSAGE_SIZE : RTEMS.UNSIGNED32 := 0; + STATUS : RTEMS.STATUS_CODES; + begin + + BUFFER_POINTER := BUFFER'ADDRESS; + + TEXT_IO.PUT_LINE( + "TA2 - message_queue_receive - receive from queue 1 - NO_WAIT" + ); + RTEMS.MESSAGE_QUEUE.RECEIVE( + SPTEST.QUEUE_ID( 1 ), + BUFFER_POINTER, + RTEMS.NO_WAIT, + RTEMS.NO_TIMEOUT, + MESSAGE_SIZE, + STATUS + ); + TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "MESSAGE_QUEUE_RECEIVE" ); + TEXT_IO.PUT( "TA2 - buffer received: " ); + SPTEST.PUT_BUFFER( BUFFER ); + TEXT_IO.NEW_LINE; + + TEXT_IO.PUT_LINE( + "TA2 - message_queue_receive - receive from queue 1 - WAIT FOREVER" + ); + RTEMS.MESSAGE_QUEUE.RECEIVE( + SPTEST.QUEUE_ID( 1 ), + BUFFER_POINTER, + RTEMS.DEFAULT_OPTIONS, + RTEMS.NO_TIMEOUT, + MESSAGE_SIZE, + STATUS + ); + TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "MESSAGE_QUEUE_RECEIVE" ); + TEXT_IO.PUT( "TA2 - buffer received: " ); + SPTEST.PUT_BUFFER( BUFFER ); + TEXT_IO.NEW_LINE; + + TEXT_IO.PUT_LINE( + "TA2 - message_queue_receive - receive from queue 1 - WAIT FOREVER" + ); + RTEMS.MESSAGE_QUEUE.RECEIVE( + SPTEST.QUEUE_ID( 1 ), + BUFFER_POINTER, + RTEMS.DEFAULT_OPTIONS, + RTEMS.NO_TIMEOUT, + MESSAGE_SIZE, + STATUS + ); + TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "MESSAGE_QUEUE_RECEIVE" ); + TEXT_IO.PUT( "TA2 - buffer received: " ); + SPTEST.PUT_BUFFER( BUFFER ); + TEXT_IO.NEW_LINE; + + TEXT_IO.PUT_LINE( + "TA2 - task_set_priority - make self highest priority task" + ); + RTEMS.TASKS.SET_PRIORITY( + RTEMS.SELF, + 3, + PREVIOUS_PRIORITY, + STATUS + ); + TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "TASK_SET_PRIORITY" ); + + TEXT_IO.PUT_LINE( + "TA2 - message_queue_receive - receive from queue 2 - WAIT FOREVER" + ); + RTEMS.MESSAGE_QUEUE.RECEIVE( + SPTEST.QUEUE_ID( 2 ), + BUFFER_POINTER, + RTEMS.DEFAULT_OPTIONS, + RTEMS.NO_TIMEOUT, + MESSAGE_SIZE, + STATUS + ); + TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "MESSAGE_QUEUE_RECEIVE" ); + TEXT_IO.PUT( "TA2 - buffer received: " ); + SPTEST.PUT_BUFFER( BUFFER ); + TEXT_IO.NEW_LINE; + + SPTEST.FILL_BUFFER( "BUFFER 2 TO Q 2 ", BUFFER ); + TEXT_IO.PUT_LINE( "TA2 - message_queue_send - BUFFER 2 TO Q 2" ); + RTEMS.MESSAGE_QUEUE.SEND( + SPTEST.QUEUE_ID( 2 ), + BUFFER_POINTER, + 16, + STATUS + ); + TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "MESSAGE_QUEUE_SEND" ); + + TEXT_IO.PUT_LINE( + "TA2 - message_queue_receive - receive from queue 1 - 10 second timeout" + ); + RTEMS.MESSAGE_QUEUE.RECEIVE( + SPTEST.QUEUE_ID( 1 ), + BUFFER_POINTER, + RTEMS.DEFAULT_OPTIONS, + 10 * TEST_SUPPORT.TICKS_PER_SECOND, + MESSAGE_SIZE, + STATUS + ); + TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "MESSAGE_QUEUE_RECEIVE" ); + TEXT_IO.PUT( "TA2 - buffer received: " ); + SPTEST.PUT_BUFFER( BUFFER ); + TEXT_IO.NEW_LINE; + + TEXT_IO.PUT_LINE( + "TA2 - message_queue_receive - receive from queue 3 - WAIT FOREVER" + ); + RTEMS.MESSAGE_QUEUE.RECEIVE( + SPTEST.QUEUE_ID( 3 ), + BUFFER_POINTER, + RTEMS.DEFAULT_OPTIONS, + RTEMS.NO_TIMEOUT, + MESSAGE_SIZE, + STATUS + ); + TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "MESSAGE_QUEUE_RECEIVE" ); + TEXT_IO.PUT( "TA2 - buffer received: " ); + SPTEST.PUT_BUFFER( BUFFER ); + TEXT_IO.NEW_LINE; + + end TASK_2; + +-- +-- TASK_3 +-- + + procedure TASK_3 ( + ARGUMENT : in RTEMS.TASKS.ARGUMENT + ) is + pragma Unreferenced(ARGUMENT); + BUFFER : SPTEST.BUFFER; + BUFFER_POINTER : RTEMS.ADDRESS; + COUNT : RTEMS.UNSIGNED32; + MESSAGE_SIZE : RTEMS.UNSIGNED32 := 0; + STATUS : RTEMS.STATUS_CODES; + begin + + BUFFER_POINTER := BUFFER'ADDRESS; + + TEXT_IO.PUT_LINE( + "TA3 - message_queue_receive - receive from queue 2 - WAIT FOREVER" + ); + RTEMS.MESSAGE_QUEUE.RECEIVE( + SPTEST.QUEUE_ID( 2 ), + BUFFER_POINTER, + RTEMS.DEFAULT_OPTIONS, + RTEMS.NO_TIMEOUT, + MESSAGE_SIZE, + STATUS + ); + TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "MESSAGE_QUEUE_RECEIVE" ); + TEXT_IO.PUT( "TA3 - buffer received: " ); + SPTEST.PUT_BUFFER( BUFFER ); + TEXT_IO.NEW_LINE; + + SPTEST.FILL_BUFFER( "BUFFER 3 TO Q 1 ", BUFFER ); + TEXT_IO.PUT_LINE( "TA3 - message_queue_broadcast - BUFFER 3 TO Q 1" ); + RTEMS.MESSAGE_QUEUE.BROADCAST( + SPTEST.QUEUE_ID( 1 ), + BUFFER_POINTER, + 16, + COUNT, + STATUS + ); + TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "MESSAGE_QUEUE_BROADCAST" ); + TEXT_IO.PUT( "TA3 - number of tasks awakened = " ); + UNSIGNED32_IO.PUT( COUNT, WIDTH => 3, BASE => 10 ); + TEXT_IO.NEW_LINE; + + TEXT_IO.PUT_LINE( + "TA3 - message_queue_receive - receive from queue 3 - WAIT FOREVER" + ); + RTEMS.MESSAGE_QUEUE.RECEIVE( + SPTEST.QUEUE_ID( 3 ), + BUFFER_POINTER, + RTEMS.DEFAULT_OPTIONS, + RTEMS.NO_TIMEOUT, + MESSAGE_SIZE, + STATUS + ); + TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "MESSAGE_QUEUE_RECEIVE" ); + TEXT_IO.PUT( "TA3 - buffer received: " ); + SPTEST.PUT_BUFFER( BUFFER ); + TEXT_IO.NEW_LINE; + + TEXT_IO.PUT_LINE( "TA3 - task_delete - delete self" ); + RTEMS.TASKS.DELETE( RTEMS.SELF, STATUS ); + TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "TASK_DELETE OF SELF" ); + + end TASK_3; + +end SPTEST; |