Back to home page

LXR

 
 

    


Warning, /testsuites/ada/mptests/mp09/mptest.adb is written in an unsupported language. File is not indexed.

0001 -- SPDX-License-Identifier: BSD-2-Clause
0002 
0003 --
0004 --  MPTEST / BODY
0005 --
0006 --  DESCRIPTION:
0007 --
0008 --  This package is the implementation for Test 9 of the RTEMS
0009 --  Multiprocessor 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.MESSAGE_QUEUE;
0042 with TEST_SUPPORT;
0043 with TEXT_IO;
0044 with UNSIGNED32_IO;
0045 
0046 package body MPTEST is
0047 
0048 --
0049 --  INIT
0050 --
0051 
0052    procedure INIT (
0053       ARGUMENT : in     RTEMS.TASKS.ARGUMENT
0054    ) is
0055       pragma Unreferenced(ARGUMENT);
0056       STATUS : RTEMS.STATUS_CODES;
0057    begin
0058 
0059       TEXT_IO.NEW_LINE( 2 );
0060       TEST_SUPPORT.ADA_TEST_BEGIN;
0061       TEXT_IO.PUT( "*** NODE " );
0062       UNSIGNED32_IO.PUT(
0063          TEST_SUPPORT.NODE,
0064          WIDTH => 1
0065       );
0066       TEXT_IO.PUT_LINE( " ***" );
0067 
0068       MPTEST.RECEIVE_BUFFER := MPTEST.RECEIVE_BUFFER_AREA'ADDRESS;
0069 
0070       MPTEST.BUFFER_1 := MPTEST.BUFFER_AREA_1'ADDRESS;
0071 
0072       MPTEST.BUFFER_2 := MPTEST.BUFFER_AREA_2'ADDRESS;
0073 
0074       MPTEST.BUFFER_3 := MPTEST.BUFFER_AREA_3'ADDRESS;
0075 
0076       MPTEST.BUFFER_4 := MPTEST.BUFFER_AREA_4'ADDRESS;
0077 
0078       MPTEST.FILL_BUFFER( "123456789012345 ", MPTEST.BUFFER_AREA_1 );
0079       MPTEST.FILL_BUFFER( "abcdefghijklmno ", MPTEST.BUFFER_AREA_2 );
0080       MPTEST.FILL_BUFFER( "ABCDEFGHIJKLMNO ", MPTEST.BUFFER_AREA_3 );
0081       MPTEST.FILL_BUFFER( "PQRSTUVWXYZ(){} ", MPTEST.BUFFER_AREA_4 );
0082 
0083       MPTEST.TASK_NAME( 1 ) := RTEMS.BUILD_NAME(  '1', '1', '1', ' ' );
0084       MPTEST.TASK_NAME( 2 ) := RTEMS.BUILD_NAME(  '2', '2', '2', ' ' );
0085 
0086       MPTEST.QUEUE_NAME( 1 ) := RTEMS.BUILD_NAME(  'M', 'S', 'G', ' ' );
0087 
0088       if TEST_SUPPORT.NODE = 1 then
0089 
0090          TEXT_IO.PUT_LINE( "Creating Message Queue (Global)" );
0091          RTEMS.MESSAGE_QUEUE.CREATE(
0092             MPTEST.QUEUE_NAME( 1 ),
0093             3,
0094             3,
0095             RTEMS.GLOBAL,
0096             MPTEST.QUEUE_ID( 1 ),
0097             STATUS
0098          );
0099          TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "MESSAGE_QUEUE_CREATE" );
0100 
0101       end if;
0102 
0103       TEXT_IO.PUT_LINE( "Creating Test_task (local)" );
0104       RTEMS.TASKS.CREATE(
0105          MPTEST.TASK_NAME( TEST_SUPPORT.NODE ),
0106          TEST_SUPPORT.NODE,
0107          2048,
0108          RTEMS.TIMESLICE,
0109          RTEMS.DEFAULT_ATTRIBUTES,
0110          MPTEST.TASK_ID( 1 ),
0111          STATUS
0112       );
0113       TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "TASK_CREATE" );
0114 
0115       TEXT_IO.PUT_LINE( "Starting Test_task (local)" );
0116       RTEMS.TASKS.START(
0117          MPTEST.TASK_ID( 1 ),
0118          MPTEST.TEST_TASK'ACCESS,
0119          0,
0120          STATUS
0121       );
0122       TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "TASK_START" );
0123 
0124       TEXT_IO.PUT_LINE( "Deleting initialization task" );
0125       RTEMS.TASKS.DELETE( RTEMS.SELF, STATUS );
0126       TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "TASK_DELETE OF SELF" );
0127 
0128    end INIT;
0129 
0130 --
0131 --  SEND_MESSAGES
0132 --
0133 
0134    procedure SEND_MESSAGES is
0135       BROADCAST_COUNT     : RTEMS.UNSIGNED32;
0136       STATUS              : RTEMS.STATUS_CODES;
0137    begin
0138 
0139       TEXT_IO.PUT( "message_queue_send : " );
0140       MPTEST.PUT_BUFFER( MPTEST.BUFFER_AREA_1 );
0141       TEXT_IO.NEW_LINE;
0142 
0143       RTEMS.MESSAGE_QUEUE.SEND(
0144          MPTEST.QUEUE_ID( 1 ),
0145          MPTEST.BUFFER_1,
0146          16,
0147          STATUS
0148       );
0149       TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "MESSAGE_QUEUE_SEND" );
0150 
0151       TEXT_IO.PUT_LINE( "Delaying for a second" );
0152       RTEMS.TASKS.WAKE_AFTER(
0153          1 * TEST_SUPPORT.TICKS_PER_SECOND,
0154          STATUS
0155       );
0156       TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "TASK_WAKE_AFTER" );
0157 
0158       TEXT_IO.PUT( "message_queue_urgent : " );
0159       MPTEST.PUT_BUFFER( MPTEST.BUFFER_AREA_2 );
0160       TEXT_IO.NEW_LINE;
0161 
0162       RTEMS.MESSAGE_QUEUE.URGENT(
0163          MPTEST.QUEUE_ID( 1 ),
0164          MPTEST.BUFFER_2,
0165          16,
0166          STATUS
0167       );
0168       TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "MESSAGE_QUEUE_URGENT" );
0169 
0170       TEXT_IO.PUT_LINE( "Delaying for a second" );
0171       RTEMS.TASKS.WAKE_AFTER(
0172          1 * TEST_SUPPORT.TICKS_PER_SECOND,
0173          STATUS
0174       );
0175       TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "TASK_WAKE_AFTER" );
0176 
0177       TEXT_IO.PUT( "message_queue_broadcast : " );
0178       MPTEST.PUT_BUFFER( MPTEST.BUFFER_AREA_3 );
0179       TEXT_IO.NEW_LINE;
0180 
0181       RTEMS.MESSAGE_QUEUE.BROADCAST(
0182          MPTEST.QUEUE_ID( 1 ),
0183          MPTEST.BUFFER_3,
0184          16,
0185          BROADCAST_COUNT,
0186          STATUS
0187       );
0188       TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "MESSAGE_QUEUE_BROADCAST" );
0189 
0190       TEXT_IO.PUT_LINE( "Delaying for a second" );
0191       RTEMS.TASKS.WAKE_AFTER(
0192          1 * TEST_SUPPORT.TICKS_PER_SECOND,
0193          STATUS
0194       );
0195       TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "TASK_WAKE_AFTER" );
0196 
0197    end SEND_MESSAGES;
0198 
0199 --
0200 --  RECEIVE_MESSAGES
0201 --
0202 
0203    procedure RECEIVE_MESSAGES is
0204       STATUS              : RTEMS.STATUS_CODES;
0205       MESSAGE_SIZE        : RTEMS.SIZE := 0;
0206    begin
0207 
0208       for INDEX in 1 .. 3
0209       loop
0210 
0211          TEXT_IO.PUT_LINE( "Receiving message ..." );
0212          RTEMS.MESSAGE_QUEUE.RECEIVE(
0213             MPTEST.QUEUE_ID( 1 ),
0214             MPTEST.RECEIVE_BUFFER,
0215             RTEMS.DEFAULT_OPTIONS,
0216             RTEMS.NO_TIMEOUT,
0217             MESSAGE_SIZE,
0218             STATUS
0219          );
0220          TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "MESSAGE_QUEUE_RECEIVE" );
0221 
0222          TEXT_IO.PUT( "Received : " );
0223          MPTEST.PUT_BUFFER( MPTEST.RECEIVE_BUFFER_AREA );
0224          TEXT_IO.NEW_LINE;
0225 
0226       end loop;
0227 
0228       TEXT_IO.PUT_LINE( "Receiver delaying for a second" );
0229 
0230       RTEMS.TASKS.WAKE_AFTER( 1 * TEST_SUPPORT.TICKS_PER_SECOND, STATUS );
0231       TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "TASK_WAKE_AFTER" );
0232 
0233    end RECEIVE_MESSAGES;
0234 
0235 --
0236 --  FILL_BUFFER
0237 --
0238 
0239 --
0240 -- Depends on tricks to make the copy work.
0241 --
0242 
0243    procedure FILL_BUFFER (
0244       SOURCE : in     STRING;
0245       BUFFER :    out MPTEST.BUFFER
0246    ) is
0247    begin
0248 
0249       BUFFER.FIELD1 := RTEMS.BUILD_NAME(
0250          SOURCE( SOURCE'FIRST ),
0251          SOURCE( SOURCE'FIRST + 1 ),
0252          SOURCE( SOURCE'FIRST + 2 ),
0253          SOURCE( SOURCE'FIRST + 3 )
0254       );
0255 
0256       BUFFER.FIELD2 := RTEMS.BUILD_NAME(
0257          SOURCE( SOURCE'FIRST + 4 ),
0258          SOURCE( SOURCE'FIRST + 5 ),
0259          SOURCE( SOURCE'FIRST + 6 ),
0260          SOURCE( SOURCE'FIRST + 7 )
0261       );
0262 
0263       BUFFER.FIELD3 := RTEMS.BUILD_NAME(
0264          SOURCE( SOURCE'FIRST + 8 ),
0265          SOURCE( SOURCE'FIRST + 9 ),
0266          SOURCE( SOURCE'FIRST + 10 ),
0267          SOURCE( SOURCE'FIRST + 11 )
0268       );
0269 
0270       BUFFER.FIELD4 := RTEMS.BUILD_NAME(
0271          SOURCE( SOURCE'FIRST + 12 ),
0272          SOURCE( SOURCE'FIRST + 13 ),
0273          SOURCE( SOURCE'FIRST + 14 ),
0274          SOURCE( SOURCE'FIRST + 15 )
0275       );
0276 
0277    end FILL_BUFFER;
0278 
0279 --
0280 --  PUT_BUFFER
0281 --
0282 
0283 --
0284 -- Depends on tricks to make the output work.
0285 --
0286 
0287    procedure PUT_BUFFER (
0288       BUFFER : in     MPTEST.BUFFER
0289    ) is
0290    begin
0291 
0292       TEST_SUPPORT.PUT_NAME( BUFFER.FIELD1, FALSE );
0293       TEST_SUPPORT.PUT_NAME( BUFFER.FIELD2, FALSE );
0294       TEST_SUPPORT.PUT_NAME( BUFFER.FIELD3, FALSE );
0295       TEST_SUPPORT.PUT_NAME( BUFFER.FIELD4, FALSE );
0296 
0297    end PUT_BUFFER;
0298 
0299 --
0300 --  TEST_TASK
0301 --
0302 
0303    procedure TEST_TASK (
0304       ARGUMENT : in     RTEMS.TASKS.ARGUMENT
0305    ) is
0306       pragma Unreferenced(ARGUMENT);
0307       COUNT        : RTEMS.UNSIGNED32;
0308       STATUS       : RTEMS.STATUS_CODES;
0309       MESSAGE_SIZE : RTEMS.SIZE := 0;
0310    begin
0311 
0312       RTEMS.TASKS.WAKE_AFTER( 1 * TEST_SUPPORT.TICKS_PER_SECOND, STATUS );
0313       TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "TASK_WAKE_AFTER" );
0314 
0315       TEXT_IO.PUT_LINE( "Getting QID of message queue" );
0316 
0317       loop
0318 
0319          RTEMS.MESSAGE_QUEUE.IDENT(
0320             MPTEST.QUEUE_NAME( 1 ),
0321             RTEMS.SEARCH_ALL_NODES,
0322             MPTEST.QUEUE_ID( 1 ),
0323             STATUS
0324          );
0325 
0326          exit when RTEMS.IS_STATUS_SUCCESSFUL( STATUS );
0327 
0328       end loop;
0329 
0330       if TEST_SUPPORT.NODE = 2 then
0331 
0332          RTEMS.MESSAGE_QUEUE.DELETE( MPTEST.QUEUE_ID( 1 ), STATUS );
0333 
0334          TEST_SUPPORT.FATAL_DIRECTIVE_STATUS(
0335             STATUS,
0336             RTEMS.ILLEGAL_ON_REMOTE_OBJECT,
0337             "MESSAGE_QUEUE_DELETE"
0338          );
0339 
0340          TEXT_IO.PUT_LINE(
0341          "message_queue_delete correctly returned ILLEGAL_ON_REMOTE_OBJECT"
0342          );
0343 
0344          MPTEST.SEND_MESSAGES;
0345 
0346          MPTEST.RECEIVE_MESSAGES;
0347 
0348          TEXT_IO.PUT_LINE( "Flushing remote empty queue" );
0349          RTEMS.MESSAGE_QUEUE.FLUSH( MPTEST.QUEUE_ID( 1 ), COUNT, STATUS );
0350          TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "MESSAGE_QUEUE_FLUSH" );
0351          UNSIGNED32_IO.PUT( COUNT, WIDTH => 1 );
0352          TEXT_IO.PUT_LINE(
0353             " messages were flushed from remote empty queue"
0354          );
0355 
0356          TEXT_IO.PUT_LINE(
0357             "Send messages to be flushed from remote queue"
0358          );
0359          RTEMS.MESSAGE_QUEUE.SEND(
0360             MPTEST.QUEUE_ID( 1 ),
0361             MPTEST.BUFFER_1,
0362             16,
0363             STATUS
0364          );
0365          TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "MESSAGE_QUEUE_SEND" );
0366 
0367          TEXT_IO.PUT_LINE( "Flushing remote queue" );
0368          RTEMS.MESSAGE_QUEUE.FLUSH( MPTEST.QUEUE_ID( 1 ), COUNT, STATUS );
0369          TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "MESSAGE_QUEUE_FLUSH" );
0370          UNSIGNED32_IO.PUT( COUNT, WIDTH => 1 );
0371          TEXT_IO.PUT_LINE(
0372             " messages were flushed from the remote queue"
0373          );
0374 
0375          TEXT_IO.PUT_LINE( "Waiting for message queue to be deleted" );
0376          RTEMS.MESSAGE_QUEUE.RECEIVE(
0377             MPTEST.QUEUE_ID( 1 ),
0378             MPTEST.RECEIVE_BUFFER,
0379             RTEMS.DEFAULT_OPTIONS,
0380             RTEMS.NO_TIMEOUT,
0381             MESSAGE_SIZE,
0382             STATUS
0383          );
0384          TEST_SUPPORT.FATAL_DIRECTIVE_STATUS(
0385             STATUS,
0386             RTEMS.OBJECT_WAS_DELETED,
0387             "MESSAGE_QUEUE_FLUSH"
0388          );
0389 
0390       else
0391 
0392          MPTEST.RECEIVE_MESSAGES;
0393 
0394          MPTEST.SEND_MESSAGES;
0395 
0396          RTEMS.TASKS.WAKE_AFTER(
0397             5 * TEST_SUPPORT.TICKS_PER_SECOND,
0398             STATUS
0399          );
0400          TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "TASK_WAKE_AFTER" );
0401 
0402          RTEMS.MESSAGE_QUEUE.DELETE( MPTEST.QUEUE_ID( 1 ), STATUS );
0403          TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "MESSAGE_QUEUE_DELETE" );
0404 
0405       end if;
0406 
0407       TEST_SUPPORT.ADA_TEST_END;
0408 
0409       RTEMS.SHUTDOWN_EXECUTIVE( 0 );
0410 
0411    end TEST_TASK;
0412 
0413 end MPTEST;