Back to home page

LXR

 
 

    


Warning, /testsuites/ada/sptests/sp13/sptest.adb is written in an unsupported language. File is not indexed.

0001 -- SPDX-License-Identifier: BSD-2-Clause
0002 
0003 --
0004 --  SPTEST / BODY
0005 --
0006 --  DESCRIPTION:
0007 --
0008 --  This package is the implementation of Test 13 of the RTEMS
0009 --  Single Processor Test Suite.
0010 --
0011 --  DEPENDENCIES: 
0012 --
0013 --  
0014 --
0015 --  COPYRIGHT (c) 1989-2011.
0016 --  On-Line Applications Research Corporation (OAR).
0017 --
0018 --  Redistribution and use in source and binary forms, with or without
0019 --  modification, are permitted provided that the following conditions
0020 --  are met:
0021 --  1. Redistributions of source code must retain the above copyright
0022 --     notice, this list of conditions and the following disclaimer.
0023 --  2. Redistributions in binary form must reproduce the above copyright
0024 --     notice, this list of conditions and the following disclaimer in the
0025 --     documentation and/or other materials provided with the distribution.
0026 --
0027 --  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
0028 --  AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
0029 --  IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
0030 --  ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
0031 --  LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
0032 --  CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
0033 --  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
0034 --  INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
0035 --  CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
0036 --  ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
0037 --  POSSIBILITY OF SUCH DAMAGE.
0038 --
0039 
0040 with INTERFACES; use INTERFACES;
0041 with RTEMS;
0042 with RTEMS.MESSAGE_QUEUE;
0043 with TEST_SUPPORT;
0044 with TEXT_IO;
0045 with UNSIGNED32_IO;
0046 use type RTEMS.STATUS_CODES;
0047 use type RTEMS.Size;
0048 
0049 package body SPTEST is
0050 
0051    type BIG_BUFFER_TYPE is array (1 .. 2048) of RTEMS.UNSIGNED8;
0052 
0053 
0054 -- 
0055 --  INIT
0056 --
0057 
0058    procedure INIT (
0059       ARGUMENT : in     RTEMS.TASKS.ARGUMENT
0060    ) is
0061       pragma Unreferenced(ARGUMENT);
0062       STATUS : RTEMS.STATUS_CODES;
0063    begin
0064 
0065       TEXT_IO.NEW_LINE( 2 );
0066       TEST_SUPPORT.ADA_TEST_BEGIN;
0067 
0068       SPTEST.TASK_NAME( 1 ) := RTEMS.BUILD_NAME(  'T', 'A', '1', ' ' );
0069       SPTEST.TASK_NAME( 2 ) := RTEMS.BUILD_NAME(  'T', 'A', '2', ' ' );
0070       SPTEST.TASK_NAME( 3 ) := RTEMS.BUILD_NAME(  'T', 'A', '3', ' ' );
0071 
0072       RTEMS.TASKS.CREATE( 
0073          SPTEST.TASK_NAME( 1 ), 
0074          4, 
0075          2048, 
0076          RTEMS.DEFAULT_MODES,
0077          RTEMS.DEFAULT_ATTRIBUTES,
0078          SPTEST.TASK_ID( 1 ),
0079          STATUS
0080       );
0081       TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "TASK_CREATE OF TA1" );
0082 
0083       RTEMS.TASKS.CREATE( 
0084          SPTEST.TASK_NAME( 2 ), 
0085          4, 
0086          2048, 
0087          RTEMS.DEFAULT_MODES,
0088          RTEMS.DEFAULT_ATTRIBUTES,
0089          SPTEST.TASK_ID( 2 ),
0090          STATUS
0091       );
0092       TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "TASK_CREATE OF TA2" );
0093 
0094       RTEMS.TASKS.CREATE( 
0095          SPTEST.TASK_NAME( 3 ), 
0096          4, 
0097          2048, 
0098          RTEMS.DEFAULT_MODES,
0099          RTEMS.DEFAULT_ATTRIBUTES,
0100          SPTEST.TASK_ID( 3 ),
0101          STATUS
0102       );
0103       TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "TASK_CREATE OF TA3" );
0104 
0105       RTEMS.TASKS.START(
0106          SPTEST.TASK_ID( 1 ),
0107          SPTEST.TASK_1'ACCESS,
0108          0,
0109          STATUS
0110       );
0111       TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "TASK_START OF TA1" );
0112 
0113       RTEMS.TASKS.START(
0114          SPTEST.TASK_ID( 2 ),
0115          SPTEST.TASK_2'ACCESS,
0116          0,
0117          STATUS
0118       );
0119       TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "TASK_START OF TA2" );
0120 
0121       RTEMS.TASKS.START(
0122          SPTEST.TASK_ID( 3 ),
0123          SPTEST.TASK_3'ACCESS,
0124          0,
0125          STATUS
0126       );
0127       TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "TASK_START OF TA3" );
0128 
0129       SPTEST.QUEUE_NAME( 1 ) := RTEMS.BUILD_NAME(  'Q', '1', ' ', ' ' );
0130       SPTEST.QUEUE_NAME( 2 ) := RTEMS.BUILD_NAME(  'Q', '2', ' ', ' ' );
0131       SPTEST.QUEUE_NAME( 3 ) := RTEMS.BUILD_NAME(  'Q', '3', ' ', ' ' );
0132 
0133       RTEMS.MESSAGE_QUEUE.CREATE(
0134          SPTEST.QUEUE_NAME( 1 ),
0135          100,
0136          16,
0137          RTEMS.DEFAULT_ATTRIBUTES,
0138          SPTEST.QUEUE_ID( 1 ),
0139          STATUS
0140       );
0141       TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "QUEUE_CREATE OF Q1" );
0142 
0143       RTEMS.MESSAGE_QUEUE.CREATE(
0144          SPTEST.QUEUE_NAME( 2 ),
0145          10,
0146          16,
0147          RTEMS.PRIORITY,
0148          SPTEST.QUEUE_ID( 2 ),
0149          STATUS
0150       );
0151       TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "QUEUE_CREATE OF Q2" );
0152 
0153       RTEMS.MESSAGE_QUEUE.CREATE(
0154          SPTEST.QUEUE_NAME( 3 ),
0155          100,
0156          16,
0157          RTEMS.DEFAULT_ATTRIBUTES,
0158          SPTEST.QUEUE_ID( 3 ),
0159          STATUS
0160       );
0161       TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "QUEUE_CREATE OF Q3" );
0162 
0163       RTEMS.TASKS.DELETE( RTEMS.SELF, STATUS );
0164       TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "TASK_DELETE OF SELF" );
0165 
0166    end INIT;
0167 
0168 -- 
0169 --  FILL_BUFFER
0170 --
0171 
0172 --
0173 -- Depends on tricks to make the copy work.
0174 --
0175 
0176    procedure FILL_BUFFER (
0177       SOURCE : in     STRING;
0178       BUFFER :    out SPTEST.BUFFER
0179    ) is
0180    begin
0181 
0182       BUFFER.FIELD1 := RTEMS.BUILD_NAME(
0183          SOURCE( SOURCE'FIRST ),
0184          SOURCE( SOURCE'FIRST + 1 ),
0185          SOURCE( SOURCE'FIRST + 2 ),
0186          SOURCE( SOURCE'FIRST + 3 )
0187       );
0188 
0189       BUFFER.FIELD2 := RTEMS.BUILD_NAME(
0190          SOURCE( SOURCE'FIRST + 4 ),
0191          SOURCE( SOURCE'FIRST + 5 ),
0192          SOURCE( SOURCE'FIRST + 6 ),
0193          SOURCE( SOURCE'FIRST + 7 )
0194       );
0195 
0196       BUFFER.FIELD3 := RTEMS.BUILD_NAME(
0197          SOURCE( SOURCE'FIRST + 8 ),
0198          SOURCE( SOURCE'FIRST + 9 ),
0199          SOURCE( SOURCE'FIRST + 10 ),
0200          SOURCE( SOURCE'FIRST + 11 )
0201       );
0202 
0203       BUFFER.FIELD4 := RTEMS.BUILD_NAME(
0204          SOURCE( SOURCE'FIRST + 12 ),
0205          SOURCE( SOURCE'FIRST + 13 ),
0206          SOURCE( SOURCE'FIRST + 14 ),
0207          SOURCE( SOURCE'FIRST + 15 )
0208       );
0209 
0210    end FILL_BUFFER;
0211 
0212 -- 
0213 --  PUT_BUFFER
0214 --
0215 
0216 --
0217 -- Depends on tricks to make the output work.
0218 --
0219 
0220    procedure PUT_BUFFER (
0221       BUFFER : in     SPTEST.BUFFER
0222    ) is
0223    begin
0224 
0225       TEST_SUPPORT.PUT_NAME( BUFFER.FIELD1, FALSE );
0226       TEST_SUPPORT.PUT_NAME( BUFFER.FIELD2, FALSE );
0227       TEST_SUPPORT.PUT_NAME( BUFFER.FIELD3, FALSE );
0228       TEST_SUPPORT.PUT_NAME( BUFFER.FIELD4, FALSE );
0229       
0230    end PUT_BUFFER;
0231 
0232 -- 
0233 --  TASK_1
0234 --
0235 
0236    procedure TASK_1 (
0237       ARGUMENT : in     RTEMS.TASKS.ARGUMENT
0238    ) is
0239       pragma Unreferenced(ARGUMENT);
0240       QID                        : RTEMS.ID;
0241       BIG_SEND_BUFFER            : BIG_BUFFER_TYPE;
0242       BIG_SEND_BUFFER_POINTER    : constant RTEMS.ADDRESS
0243                                       := BIG_SEND_BUFFER'ADDRESS;
0244       BIG_RECEIVE_BUFFER         : BIG_BUFFER_TYPE;
0245       BIG_RECEIVE_BUFFER_POINTER : constant RTEMS.ADDRESS
0246                                       := BIG_RECEIVE_BUFFER'ADDRESS;
0247       BUFFER                     : SPTEST.BUFFER;
0248       BUFFER_POINTER             : constant RTEMS.ADDRESS := BUFFER'ADDRESS;
0249       COUNT                      : RTEMS.UNSIGNED32;
0250       MESSAGE_SIZE               : RTEMS.Size := 0;
0251       STATUS                     : RTEMS.STATUS_CODES;
0252       SIZE                       : RTEMS.Size := 0;
0253    begin
0254 
0255       RTEMS.MESSAGE_QUEUE.IDENT( 
0256          SPTEST.QUEUE_NAME( 1 ), 
0257          RTEMS.SEARCH_ALL_NODES, 
0258          QID, 
0259          STATUS 
0260       );
0261       TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "MESSAGE_QUEUE_IDENT" );
0262       TEXT_IO.PUT( "TA1 - message_queue_ident - qid => " );
0263       UNSIGNED32_IO.PUT( QID, WIDTH => 8, BASE => 16 );
0264       TEXT_IO.NEW_LINE;
0265 
0266       SPTEST.FILL_BUFFER( "BUFFER 1 TO Q 1 ", BUFFER );
0267       TEXT_IO.PUT_LINE( "TA1 - message_queue_send - BUFFER 1 TO Q 1" );
0268       RTEMS.MESSAGE_QUEUE.SEND( 
0269          SPTEST.QUEUE_ID( 1 ), 
0270          BUFFER_POINTER, 
0271          16,
0272          STATUS 
0273       );
0274       TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "MESSAGE_QUEUE_SEND" );
0275    
0276       SPTEST.FILL_BUFFER( "BUFFER 2 TO Q 1 ", BUFFER );
0277       TEXT_IO.PUT_LINE( "TA1 - message_queue_send - BUFFER 2 TO Q 1" );
0278       RTEMS.MESSAGE_QUEUE.SEND( 
0279          SPTEST.QUEUE_ID( 1 ), 
0280          BUFFER_POINTER, 
0281          16,
0282          STATUS 
0283       );
0284       TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "MESSAGE_QUEUE_SEND" );
0285 
0286       TEXT_IO.PUT_LINE( "TA1 - task_wake_after - sleep 5 seconds" );
0287       RTEMS.TASKS.WAKE_AFTER( 5 * TEST_SUPPORT.TICKS_PER_SECOND, STATUS );
0288       TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "TASK_WAKE_AFTER" );
0289           
0290       SPTEST.FILL_BUFFER( "BUFFER 3 TO Q 1 ", BUFFER );
0291       TEXT_IO.PUT_LINE( "TA1 - message_queue_send - BUFFER 3 TO Q 1" );
0292       RTEMS.MESSAGE_QUEUE.SEND( 
0293          SPTEST.QUEUE_ID( 1 ), 
0294          BUFFER_POINTER, 
0295          16,
0296          STATUS 
0297       );
0298       TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "MESSAGE_QUEUE_SEND" );
0299 
0300       TEXT_IO.PUT_LINE( "TA1 - task_wake_after - sleep 5 seconds" );
0301       RTEMS.TASKS.WAKE_AFTER( 5 * TEST_SUPPORT.TICKS_PER_SECOND, STATUS );
0302       TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "TASK_WAKE_AFTER" );
0303           
0304 TEST_SUPPORT.PAUSE;
0305 
0306       SPTEST.FILL_BUFFER( "BUFFER 1 TO Q 2 ", BUFFER );
0307       TEXT_IO.PUT_LINE( "TA1 - message_queue_send - BUFFER 1 TO Q 2" );
0308       RTEMS.MESSAGE_QUEUE.SEND( 
0309          SPTEST.QUEUE_ID( 2 ), 
0310          BUFFER_POINTER, 
0311          16,
0312          STATUS 
0313       );
0314       TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "MESSAGE_QUEUE_SEND" );
0315 
0316       TEXT_IO.PUT( 
0317          "TA1 - message_queue_receive - receive from queue 1 - "
0318       );
0319       TEXT_IO.PUT_LINE( "10 second timeout" );
0320       RTEMS.MESSAGE_QUEUE.RECEIVE(
0321          SPTEST.QUEUE_ID( 1 ),
0322          BUFFER_POINTER,
0323          RTEMS.DEFAULT_OPTIONS,
0324          10 * TEST_SUPPORT.TICKS_PER_SECOND,
0325          MESSAGE_SIZE,
0326          STATUS
0327       );
0328       TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "MESSAGE_QUEUE_RECEIVE" );
0329       TEXT_IO.PUT( "TA1 - buffer received: " );
0330       SPTEST.PUT_BUFFER( BUFFER );
0331       TEXT_IO.NEW_LINE;
0332 
0333       TEXT_IO.PUT_LINE( "TA1 - task_delete - delete TA2" );
0334       RTEMS.TASKS.DELETE( SPTEST.TASK_ID( 2 ), STATUS );
0335       TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "TASK_DELETE" );
0336 
0337       SPTEST.FILL_BUFFER( "BUFFER 1 TO Q 3 ", BUFFER );
0338       TEXT_IO.PUT_LINE( "TA1 - message_queue_send - BUFFER 1 TO Q 3" );
0339       RTEMS.MESSAGE_QUEUE.SEND( 
0340          SPTEST.QUEUE_ID( 3 ), 
0341          BUFFER_POINTER, 
0342          16,
0343          STATUS 
0344       );
0345       TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "MESSAGE_QUEUE_SEND" );
0346 
0347       TEXT_IO.PUT_LINE( "TA1 - task_wake_after - sleep 5 seconds" );
0348       RTEMS.TASKS.WAKE_AFTER( 5 * TEST_SUPPORT.TICKS_PER_SECOND, STATUS );
0349       TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "TASK_WAKE_AFTER" );
0350           
0351 TEST_SUPPORT.PAUSE;
0352 
0353       SPTEST.FILL_BUFFER( "BUFFER 2 TO Q 3 ", BUFFER );
0354       TEXT_IO.PUT_LINE( "TA1 - message_queue_send - BUFFER 2 TO Q 3" );
0355       RTEMS.MESSAGE_QUEUE.SEND( 
0356          SPTEST.QUEUE_ID( 3 ), 
0357          BUFFER_POINTER, 
0358          16,
0359          STATUS 
0360       );
0361       TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "MESSAGE_QUEUE_SEND" );
0362 
0363       SPTEST.FILL_BUFFER( "BUFFER 3 TO Q 3 ", BUFFER );
0364       TEXT_IO.PUT_LINE( "TA1 - message_queue_send - BUFFER 3 TO Q 3" );
0365       RTEMS.MESSAGE_QUEUE.SEND( 
0366          SPTEST.QUEUE_ID( 3 ), 
0367          BUFFER_POINTER, 
0368          16,
0369          STATUS 
0370       );
0371       TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "MESSAGE_QUEUE_SEND" );
0372 
0373       SPTEST.FILL_BUFFER( "BUFFER 4 TO Q 3 ", BUFFER );
0374       TEXT_IO.PUT_LINE( "TA1 - message_queue_send - BUFFER 4 TO Q 3" );
0375       RTEMS.MESSAGE_QUEUE.SEND( 
0376          SPTEST.QUEUE_ID( 3 ), 
0377          BUFFER_POINTER, 
0378          16,
0379          STATUS 
0380       );
0381       TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "MESSAGE_QUEUE_SEND" );
0382 
0383       SPTEST.FILL_BUFFER( "BUFFER 5 TO Q 3 ", BUFFER );
0384       TEXT_IO.PUT_LINE( "TA1 - message_queue_urgent - BUFFER 5 TO Q 3" );
0385       RTEMS.MESSAGE_QUEUE.URGENT( 
0386          SPTEST.QUEUE_ID( 3 ), 
0387          BUFFER_POINTER, 
0388          16,
0389          STATUS 
0390       );
0391       TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "MESSAGE_QUEUE_URGENT" );
0392 
0393       for TIMES in 1 .. 4 
0394       loop
0395          TEXT_IO.PUT( 
0396             "TA1 - message_queue_receive - receive from queue 3 - "
0397          );
0398          TEXT_IO.PUT_LINE( "WAIT FOREVER" );
0399          RTEMS.MESSAGE_QUEUE.RECEIVE(
0400             SPTEST.QUEUE_ID( 3 ),
0401             BUFFER_POINTER,
0402             RTEMS.DEFAULT_OPTIONS,
0403             RTEMS.NO_TIMEOUT,
0404             MESSAGE_SIZE,
0405             STATUS
0406          );
0407          TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "MESSAGE_QUEUE_RECEIVE" );
0408          TEXT_IO.PUT( "TA1 - buffer received: " );
0409          SPTEST.PUT_BUFFER( BUFFER );
0410          TEXT_IO.NEW_LINE;
0411       end loop;
0412 
0413       SPTEST.FILL_BUFFER( "BUFFER 3 TO Q 2 ", BUFFER );
0414       TEXT_IO.PUT_LINE( "TA1 - message_queue_urgent - BUFFER 3 TO Q 2" );
0415       RTEMS.MESSAGE_QUEUE.URGENT( 
0416          SPTEST.QUEUE_ID( 2 ), 
0417          BUFFER_POINTER, 
0418          16,
0419          STATUS 
0420       );
0421       TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "MESSAGE_QUEUE_URGENT" );
0422 
0423       TEXT_IO.PUT( 
0424         "TA1 - message_queue_receive - receive from queue 2 - " 
0425       );
0426       TEXT_IO.PUT_LINE( "WAIT FOREVER" );
0427       RTEMS.MESSAGE_QUEUE.RECEIVE(
0428          SPTEST.QUEUE_ID( 2 ),
0429          BUFFER_POINTER,
0430          RTEMS.DEFAULT_OPTIONS,
0431          RTEMS.NO_TIMEOUT,
0432          MESSAGE_SIZE,
0433          STATUS
0434       );
0435       TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "MESSAGE_QUEUE_RECEIVE" );
0436       TEXT_IO.PUT( "TA1 - buffer received: " );
0437       SPTEST.PUT_BUFFER( BUFFER );
0438       TEXT_IO.NEW_LINE;
0439 
0440 TEST_SUPPORT.PAUSE;
0441 
0442       TEXT_IO.PUT_LINE( "TA1 - message_queue_delete - delete queue 1" );
0443       RTEMS.MESSAGE_QUEUE.DELETE( SPTEST.QUEUE_ID( 1 ), STATUS );
0444       TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "MESSAGE_QUEUE_DELETE" );
0445    
0446       SPTEST.FILL_BUFFER( "BUFFER 3 TO Q 2 ", BUFFER );
0447       TEXT_IO.PUT_LINE( "TA1 - message_queue_urgent - BUFFER 3 TO Q 2" );
0448       RTEMS.MESSAGE_QUEUE.URGENT( 
0449          SPTEST.QUEUE_ID( 2 ), 
0450          BUFFER_POINTER, 
0451          16,
0452          STATUS 
0453       );
0454       TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "MESSAGE_QUEUE_URGENT" );
0455 
0456       TEXT_IO.PUT_LINE( "TA1 - message_queue_delete - delete queue 2" );
0457       RTEMS.MESSAGE_QUEUE.DELETE( SPTEST.QUEUE_ID( 2 ), STATUS );
0458       TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "MESSAGE_QUEUE_DELETE" );
0459    
0460       TEXT_IO.PUT_LINE( "TA1 - message_queue_get_number_pending - check Q 3" );
0461       RTEMS.MESSAGE_QUEUE.GET_NUMBER_PENDING(
0462          SPTEST.QUEUE_ID( 3 ), COUNT, STATUS
0463       );
0464       TEST_SUPPORT.DIRECTIVE_FAILED(
0465          STATUS, "MESSAGE_QUEUE_GET_NUMBER_PENDING"
0466       );
0467       TEXT_IO.PUT( "TA1 - " );
0468       UNSIGNED32_IO.PUT( COUNT, WIDTH => 3, BASE => 10 );
0469       TEXT_IO.PUT_LINE( " messages are pending on Q 3" );
0470    
0471       TEXT_IO.PUT_LINE( "TA1 - message_queue_flush - empty Q 3" );
0472       RTEMS.MESSAGE_QUEUE.FLUSH( SPTEST.QUEUE_ID( 3 ), COUNT, STATUS );
0473       TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "MESSAGE_QUEUE_FLUSH" );
0474       TEXT_IO.PUT( "TA1 - " );
0475       UNSIGNED32_IO.PUT( COUNT, WIDTH => 3, BASE => 10 );
0476       TEXT_IO.PUT_LINE( " messages were flushed from Q 3" );
0477      
0478       SPTEST.FILL_BUFFER( "BUFFER 1 TO Q 3 ", BUFFER );
0479       TEXT_IO.PUT_LINE( "TA1 - message_queue_send - BUFFER 1 TO Q 3" );
0480       RTEMS.MESSAGE_QUEUE.SEND( 
0481          SPTEST.QUEUE_ID( 3 ), 
0482          BUFFER_POINTER, 
0483          16,
0484          STATUS 
0485       );
0486       TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "MESSAGE_QUEUE_SEND" );
0487 
0488       SPTEST.FILL_BUFFER( "BUFFER 2 TO Q 3 ", BUFFER );
0489       TEXT_IO.PUT_LINE( "TA1 - message_queue_send - BUFFER 2 TO Q 3" );
0490       RTEMS.MESSAGE_QUEUE.SEND( 
0491          SPTEST.QUEUE_ID( 3 ), 
0492          BUFFER_POINTER, 
0493          16,
0494          STATUS 
0495       );
0496       TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "MESSAGE_QUEUE_SEND" );
0497 
0498       -- this broadcast should have no effect on the queue
0499       SPTEST.FIlL_BUFFER( "NO BUFFER TO Q1 ", BUFFER );
0500       TEXT_IO.PUT_LINE( "TA1 - message_queue_broadcast - NO BUFFER TO Q1" );
0501       RTEMS.MESSAGE_QUEUE.BROADCAST(
0502          SPTEST.QUEUE_ID( 1 ),
0503          BUFFER_POINTER,
0504          16,
0505          COUNT,
0506          STATUS
0507       );
0508       TEXT_IO.PUT( "TA1 - number of tasks awakened = " );
0509       UNSIGNED32_IO.PUT( COUNT, WIDTH => 3, BASE => 10 );
0510       TEXT_IO.NEW_LINE;
0511    
0512       TEXT_IO.PUT_LINE( "TA1 - message_queue_get_number_pending - check Q 3" );
0513       RTEMS.MESSAGE_QUEUE.GET_NUMBER_PENDING(
0514          SPTEST.QUEUE_ID( 3 ), COUNT, STATUS
0515       );
0516       TEST_SUPPORT.DIRECTIVE_FAILED(
0517          STATUS, "MESSAGE_QUEUE_GET_NUMBER_PENDING"
0518       );
0519       TEXT_IO.PUT( "TA1 - " );
0520       UNSIGNED32_IO.PUT( COUNT, WIDTH => 3, BASE => 10 );
0521       TEXT_IO.PUT_LINE( " messages are pending on Q 3" );
0522 
0523       SPTEST.FILL_BUFFER( "BUFFER 3 TO Q 3 ", BUFFER );
0524       TEXT_IO.PUT_LINE( "TA1 - message_queue_send - BUFFER 3 TO Q 3" );
0525       RTEMS.MESSAGE_QUEUE.SEND( 
0526          SPTEST.QUEUE_ID( 3 ), 
0527          BUFFER_POINTER, 
0528          16,
0529          STATUS 
0530       );
0531       TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "MESSAGE_QUEUE_SEND" );
0532 
0533       TEXT_IO.PUT_LINE( "TA1 - message_queue_flush - Q 3" );
0534       RTEMS.MESSAGE_QUEUE.FLUSH( SPTEST.QUEUE_ID( 3 ), COUNT, STATUS );
0535       TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "MESSAGE_QUEUE_FLUSH" );
0536       TEXT_IO.PUT( "TA1 - " );
0537       UNSIGNED32_IO.PUT( COUNT, WIDTH => 3, BASE => 10 );
0538       TEXT_IO.PUT_LINE( " messages were flushed from Q 3" );
0539      
0540       TEXT_IO.PUT_LINE( 
0541          "TA1 - message_queue_send - until all message buffers consumed"
0542       );
0543       loop
0544 
0545          RTEMS.MESSAGE_QUEUE.SEND( 
0546             SPTEST.QUEUE_ID( 3 ), 
0547             BUFFER_POINTER, 
0548             16,
0549             STATUS 
0550          );
0551          
0552          exit when RTEMS.ARE_STATUSES_EQUAL( STATUS, RTEMS.TOO_MANY );
0553 
0554          TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "MESSAGE_QUEUE_SEND" );
0555          
0556       end loop;
0557 
0558       TEXT_IO.PUT_LINE( 
0559          "TA1 - message_queue_send - all message buffers consumed"
0560       );
0561 
0562       TEXT_IO.PUT_LINE( "TA1 - message_queue_flush - Q 3" );
0563       RTEMS.MESSAGE_QUEUE.FLUSH( SPTEST.QUEUE_ID( 3 ), COUNT, STATUS );
0564       TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "MESSAGE_QUEUE_FLUSH" );
0565       TEXT_IO.PUT( "TA1 - " );
0566       UNSIGNED32_IO.PUT( COUNT, WIDTH => 3, BASE => 10 );
0567       TEXT_IO.PUT_LINE( " messages were flushed from Q 3" );
0568 
0569 TEST_SUPPORT.PAUSE;
0570      
0571       TEXT_IO.PUT_LINE( "TA1 - create message queue of 20 bytes on queue 1" );
0572       RTEMS.MESSAGE_QUEUE.CREATE(
0573          SPTEST.QUEUE_NAME( 1 ),
0574          100,
0575          20,
0576          RTEMS.DEFAULT_ATTRIBUTES,
0577          SPTEST.QUEUE_ID( 1 ),
0578          STATUS
0579       );
0580       TEST_SUPPORT.DIRECTIVE_FAILED(
0581          STATUS, "MESSAGE_QUEUE_CREATE of Q1; 20 bytes each"
0582       );
0583       RTEMS.MESSAGE_QUEUE.SEND(
0584          SPTEST.QUEUE_ID( 1 ), BIG_SEND_BUFFER_POINTER, 40, STATUS
0585       );
0586       TEST_SUPPORT.FATAL_DIRECTIVE_STATUS(
0587          STATUS, RTEMS.INVALID_SIZE, "expected INVALID_SIZE"
0588       );
0589 
0590       TEXT_IO.PUT_LINE( "TA1 - message_queue_delete - delete queue 1" );
0591       RTEMS.MESSAGE_QUEUE.DELETE( SPTEST.QUEUE_ID( 1 ), STATUS );
0592       TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "MESSAGE_QUEUE_DELETE" );
0593 
0594 TEST_SUPPORT.PAUSE;
0595 
0596       TEXT_IO.PUT_LINE( "TA1 - message_queue_create - variable sizes " );
0597       for QUEUE_SIZE in 1 .. 1029 loop
0598           RTEMS.MESSAGE_QUEUE.CREATE(
0599               SPTEST.QUEUE_NAME( 1 ),
0600               2,            -- just 2 msgs each
0601               RTEMS.Size( QUEUE_SIZE ),
0602               RTEMS.DEFAULT_ATTRIBUTES,
0603               QUEUE_ID( 1 ),
0604               STATUS
0605           );
0606           if STATUS /= RTEMS.SUCCESSFUL then
0607               TEXT_IO.PUT( "TA1 - msq que size: " );
0608               UNSIGNED32_IO.PUT(
0609                  RTEMS.UNSIGNED32( QUEUE_SIZE ), WIDTH => 3, BASE => 10
0610               );
0611               TEXT_IO.NEW_LINE;
0612               TEST_SUPPORT.DIRECTIVE_FAILED(
0613                  STATUS, "message_queue_create of Q1"
0614               );
0615           end if;
0616 
0617           RTEMS.MESSAGE_QUEUE.DELETE( SPTEST.QUEUE_ID( 1 ), STATUS );
0618           TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "message_queue_delete" );
0619       end loop;
0620 
0621       TEXT_IO.PUT_LINE(
0622          "TA1 - message_queue_create and send - variable sizes "
0623       );
0624       for QUEUE_SIZE in 1 .. 1029 loop
0625 
0626           RTEMS.MESSAGE_QUEUE.CREATE(
0627               SPTEST.QUEUE_NAME( 1 ),
0628               2,            -- just 2 msgs each
0629               RTEMS.Size( QUEUE_SIZE ),
0630               RTEMS.DEFAULT_ATTRIBUTES,
0631               SPTEST.QUEUE_ID( 1 ),
0632               STATUS
0633           );
0634           TEST_SUPPORT.DIRECTIVE_FAILED(status, "message_queue_create of Q1");
0635 
0636           BIG_SEND_BUFFER := (others => CHARACTER'POS( 'A' ));
0637           BIG_RECEIVE_BUFFER := (others => CHARACTER'POS( 'Z' ));
0638 
0639           -- send a msg too big
0640           RTEMS.MESSAGE_QUEUE.SEND(
0641              SPTEST.QUEUE_ID( 1 ),
0642              BIG_SEND_BUFFER_POINTER,
0643              RTEMS.Size( QUEUE_SIZE + 1 ),
0644              STATUS
0645           );
0646           TEST_SUPPORT.FATAL_DIRECTIVE_STATUS(
0647              STATUS, RTEMS.INVALID_SIZE, "message_queue_send too large"
0648           );
0649 
0650           -- send a msg that is just right
0651           RTEMS.MESSAGE_QUEUE.SEND(
0652              SPTEST.QUEUE_ID( 1 ),
0653              BIG_SEND_BUFFER_POINTER,
0654              RTEMS.Size( QUEUE_SIZE ),
0655              STATUS
0656           );
0657           TEST_SUPPORT.DIRECTIVE_FAILED(
0658              STATUS, "message_queue_send exact size"
0659           );
0660 
0661           -- now read and verify the message just sent
0662           SIZE := RTEMS.Size(QUEUE_SIZE);
0663           RTEMS.MESSAGE_QUEUE.RECEIVE(
0664              SPTEST.QUEUE_ID( 1 ),
0665              BIG_RECEIVE_BUFFER_POINTER,
0666              RTEMS.DEFAULT_OPTIONS,
0667              1 * TEST_SUPPORT.TICKS_PER_SECOND,
0668              SIZE,
0669              STATUS
0670           );
0671           TEST_SUPPORT.DIRECTIVE_FAILED(
0672              STATUS, "message_queue_receive exact size"
0673           );
0674           if SIZE /= RTEMS.Size( QUEUE_SIZE ) then
0675               TEXT_IO.PUT(
0676                  "TA1 - exact size size match failed for queue_size = "
0677               );
0678               UNSIGNED32_IO.PUT(
0679                  RTEMS.UNSIGNED32( QUEUE_SIZE ), WIDTH => 3, BASE => 10
0680               );
0681               TEXT_IO.NEW_LINE;
0682           end if;
0683 
0684           if (BIG_SEND_BUFFER( BIG_SEND_BUFFER'FIRST .. Integer( SIZE )) /=
0685             BIG_RECEIVE_BUFFER( BIG_RECEIVE_BUFFER'FIRST .. Integer( SIZE )))
0686           then
0687               TEXT_IO.PUT_LINE("TA1 - exact size data match failed");
0688           end if;
0689 
0690           for I in Integer( SIZE + 1 ) .. BIG_RECEIVE_BUFFER'LAST loop
0691               if BIG_RECEIVE_BUFFER( I ) /= CHARACTER'POS( 'Z' ) then
0692                   TEXT_IO.PUT_LINE("TA1 - exact size overrun match failed");
0693               end if;
0694           end loop;
0695 
0696           -- all done with this one; delete it
0697           RTEMS.MESSAGE_QUEUE.DELETE( SPTEST.QUEUE_ID( 1 ), STATUS );
0698           TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "message_queue_delete" );
0699       end loop;
0700 
0701       TEST_SUPPORT.ADA_TEST_END;
0702       RTEMS.SHUTDOWN_EXECUTIVE( 0 );
0703 
0704    end TASK_1;
0705 
0706 -- 
0707 --  TASK_2
0708 --
0709 
0710    procedure TASK_2 (
0711       ARGUMENT : in     RTEMS.TASKS.ARGUMENT
0712    ) is
0713       pragma Unreferenced(ARGUMENT);
0714       BUFFER            : SPTEST.BUFFER;
0715       BUFFER_POINTER    : RTEMS.ADDRESS;
0716       PREVIOUS_PRIORITY : RTEMS.TASKS.PRIORITY;
0717       MESSAGE_SIZE      : RTEMS.Size := 0;
0718       STATUS            : RTEMS.STATUS_CODES;
0719    begin
0720 
0721       BUFFER_POINTER := BUFFER'ADDRESS;
0722 
0723       TEXT_IO.PUT_LINE( 
0724          "TA2 - message_queue_receive - receive from queue 1 - NO_WAIT"
0725       );
0726       RTEMS.MESSAGE_QUEUE.RECEIVE(
0727          SPTEST.QUEUE_ID( 1 ),
0728          BUFFER_POINTER,
0729          RTEMS.NO_WAIT,
0730          RTEMS.NO_TIMEOUT,
0731          MESSAGE_SIZE,
0732          STATUS
0733       );
0734       TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "MESSAGE_QUEUE_RECEIVE" );
0735       TEXT_IO.PUT( "TA2 - buffer received: " );
0736       SPTEST.PUT_BUFFER( BUFFER );
0737       TEXT_IO.NEW_LINE;
0738 
0739       TEXT_IO.PUT_LINE( 
0740          "TA2 - message_queue_receive - receive from queue 1 - WAIT FOREVER"
0741       );
0742       RTEMS.MESSAGE_QUEUE.RECEIVE(
0743          SPTEST.QUEUE_ID( 1 ),
0744          BUFFER_POINTER,
0745          RTEMS.DEFAULT_OPTIONS,
0746          RTEMS.NO_TIMEOUT,
0747          MESSAGE_SIZE,
0748          STATUS
0749       );
0750       TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "MESSAGE_QUEUE_RECEIVE" );
0751       TEXT_IO.PUT( "TA2 - buffer received: " );
0752       SPTEST.PUT_BUFFER( BUFFER );
0753       TEXT_IO.NEW_LINE;
0754 
0755       TEXT_IO.PUT_LINE( 
0756          "TA2 - message_queue_receive - receive from queue 1 - WAIT FOREVER"
0757       );
0758       RTEMS.MESSAGE_QUEUE.RECEIVE(
0759          SPTEST.QUEUE_ID( 1 ),
0760          BUFFER_POINTER,
0761          RTEMS.DEFAULT_OPTIONS,
0762          RTEMS.NO_TIMEOUT,
0763          MESSAGE_SIZE,
0764          STATUS
0765       );
0766       TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "MESSAGE_QUEUE_RECEIVE" );
0767       TEXT_IO.PUT( "TA2 - buffer received: " );
0768       SPTEST.PUT_BUFFER( BUFFER );
0769       TEXT_IO.NEW_LINE;
0770 
0771       TEXT_IO.PUT_LINE( 
0772          "TA2 - task_set_priority - make self highest priority task"
0773       );
0774       RTEMS.TASKS.SET_PRIORITY(
0775          RTEMS.SELF,
0776          3,
0777          PREVIOUS_PRIORITY,
0778          STATUS
0779       );
0780       TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "TASK_SET_PRIORITY" );
0781 
0782       TEXT_IO.PUT_LINE( 
0783          "TA2 - message_queue_receive - receive from queue 2 - WAIT FOREVER"
0784       );
0785       RTEMS.MESSAGE_QUEUE.RECEIVE(
0786          SPTEST.QUEUE_ID( 2 ),
0787          BUFFER_POINTER,
0788          RTEMS.DEFAULT_OPTIONS,
0789          RTEMS.NO_TIMEOUT,
0790          MESSAGE_SIZE,
0791          STATUS
0792       );
0793       TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "MESSAGE_QUEUE_RECEIVE" );
0794       TEXT_IO.PUT( "TA2 - buffer received: " );
0795       SPTEST.PUT_BUFFER( BUFFER );
0796       TEXT_IO.NEW_LINE;
0797 
0798       SPTEST.FILL_BUFFER( "BUFFER 2 TO Q 2 ", BUFFER );
0799       TEXT_IO.PUT_LINE( "TA2 - message_queue_send - BUFFER 2 TO Q 2" );
0800       RTEMS.MESSAGE_QUEUE.SEND( 
0801          SPTEST.QUEUE_ID( 2 ), 
0802          BUFFER_POINTER, 
0803          16,
0804          STATUS 
0805       );
0806       TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "MESSAGE_QUEUE_SEND" );
0807    
0808       TEXT_IO.PUT_LINE( 
0809     "TA2 - message_queue_receive - receive from queue 1 - 10 second timeout"
0810       );
0811       RTEMS.MESSAGE_QUEUE.RECEIVE(
0812          SPTEST.QUEUE_ID( 1 ),
0813          BUFFER_POINTER,
0814          RTEMS.DEFAULT_OPTIONS,
0815          10 * TEST_SUPPORT.TICKS_PER_SECOND,
0816          MESSAGE_SIZE,
0817          STATUS
0818       );
0819       TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "MESSAGE_QUEUE_RECEIVE" );
0820       TEXT_IO.PUT( "TA2 - buffer received: " );
0821       SPTEST.PUT_BUFFER( BUFFER );
0822       TEXT_IO.NEW_LINE;
0823 
0824       TEXT_IO.PUT_LINE( 
0825          "TA2 - message_queue_receive - receive from queue 3 - WAIT FOREVER"
0826       );
0827       RTEMS.MESSAGE_QUEUE.RECEIVE(
0828          SPTEST.QUEUE_ID( 3 ),
0829          BUFFER_POINTER,
0830          RTEMS.DEFAULT_OPTIONS,
0831          RTEMS.NO_TIMEOUT,
0832          MESSAGE_SIZE,
0833          STATUS
0834       );
0835       TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "MESSAGE_QUEUE_RECEIVE" );
0836       TEXT_IO.PUT( "TA2 - buffer received: " );
0837       SPTEST.PUT_BUFFER( BUFFER );
0838       TEXT_IO.NEW_LINE;
0839 
0840    end TASK_2;
0841 
0842 -- 
0843 --  TASK_3
0844 --
0845 
0846    procedure TASK_3 (
0847       ARGUMENT : in     RTEMS.TASKS.ARGUMENT
0848    ) is
0849       pragma Unreferenced(ARGUMENT);
0850       BUFFER         : SPTEST.BUFFER;
0851       BUFFER_POINTER : RTEMS.ADDRESS;
0852       COUNT          : RTEMS.UNSIGNED32;
0853       MESSAGE_SIZE   : RTEMS.Size := 0;
0854       STATUS         : RTEMS.STATUS_CODES;
0855    begin
0856 
0857       BUFFER_POINTER := BUFFER'ADDRESS;
0858 
0859       TEXT_IO.PUT_LINE( 
0860          "TA3 - message_queue_receive - receive from queue 2 - WAIT FOREVER"
0861       );
0862       RTEMS.MESSAGE_QUEUE.RECEIVE(
0863          SPTEST.QUEUE_ID( 2 ),
0864          BUFFER_POINTER,
0865          RTEMS.DEFAULT_OPTIONS,
0866          RTEMS.NO_TIMEOUT,
0867          MESSAGE_SIZE,
0868          STATUS
0869       );
0870       TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "MESSAGE_QUEUE_RECEIVE" );
0871       TEXT_IO.PUT( "TA3 - buffer received: " );
0872       SPTEST.PUT_BUFFER( BUFFER );
0873       TEXT_IO.NEW_LINE;
0874 
0875       SPTEST.FILL_BUFFER( "BUFFER 3 TO Q 1 ", BUFFER );
0876       TEXT_IO.PUT_LINE( "TA3 - message_queue_broadcast - BUFFER 3 TO Q 1" );
0877       RTEMS.MESSAGE_QUEUE.BROADCAST( 
0878          SPTEST.QUEUE_ID( 1 ), 
0879          BUFFER_POINTER, 
0880          16,
0881          COUNT,
0882          STATUS 
0883       );
0884       TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "MESSAGE_QUEUE_BROADCAST" );
0885       TEXT_IO.PUT( "TA3 - number of tasks awakened = " );
0886       UNSIGNED32_IO.PUT( COUNT, WIDTH => 3, BASE => 10 );
0887       TEXT_IO.NEW_LINE;
0888      
0889       TEXT_IO.PUT_LINE( 
0890          "TA3 - message_queue_receive - receive from queue 3 - WAIT FOREVER"
0891       );
0892       RTEMS.MESSAGE_QUEUE.RECEIVE(
0893          SPTEST.QUEUE_ID( 3 ),
0894          BUFFER_POINTER,
0895          RTEMS.DEFAULT_OPTIONS,
0896          RTEMS.NO_TIMEOUT,
0897          MESSAGE_SIZE,
0898          STATUS
0899       );
0900       TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "MESSAGE_QUEUE_RECEIVE" );
0901       TEXT_IO.PUT( "TA3 - buffer received: " );
0902       SPTEST.PUT_BUFFER( BUFFER );
0903       TEXT_IO.NEW_LINE;
0904 
0905       TEXT_IO.PUT_LINE( "TA3 - task_delete - delete self" );
0906       RTEMS.TASKS.DELETE( RTEMS.SELF, STATUS );
0907       TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "TASK_DELETE OF SELF" );
0908 
0909    end TASK_3;
0910 
0911 end SPTEST;