Back to home page

LXR

 
 

    


Warning, /testsuites/ada/mptests/mp05/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 5 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.FATAL;
0042 with RTEMS.SIGNAL;
0043 with RTEMS.TIMER;
0044 with TEST_SUPPORT;
0045 with TEXT_IO;
0046 with UNSIGNED32_IO;
0047 
0048 package body MPTEST is
0049 
0050 --
0051 --  INIT
0052 --
0053 
0054    procedure INIT (
0055       ARGUMENT : in     RTEMS.TASKS.ARGUMENT
0056    ) is
0057       pragma Unreferenced(ARGUMENT);
0058       STATUS : RTEMS.STATUS_CODES;
0059    begin
0060 
0061       TEXT_IO.NEW_LINE( 2 );
0062       TEST_SUPPORT.ADA_TEST_BEGIN;
0063       TEXT_IO.PUT( "*** NODE " );
0064       UNSIGNED32_IO.PUT(
0065          TEST_SUPPORT.NODE,
0066          WIDTH => 1
0067       );
0068       TEXT_IO.PUT_LINE( " ***" );
0069 
0070       MPTEST.TASK_NAME( 1 ) := RTEMS.BUILD_NAME(  '1', '1', '1', ' ' );
0071       MPTEST.TASK_NAME( 2 ) := RTEMS.BUILD_NAME(  '2', '2', '2', ' ' );
0072 
0073       TEXT_IO.PUT_LINE( "Creating Test_task (Global)" );
0074 
0075       RTEMS.TASKS.CREATE( 
0076          MPTEST.TASK_NAME( TEST_SUPPORT.NODE ), 
0077          1,
0078          2048, 
0079          RTEMS.TIMESLICE,
0080          RTEMS.GLOBAL,
0081          MPTEST.TASK_ID( 1 ),
0082          STATUS
0083       );
0084       TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "TASK_CREATE" );
0085 
0086       TEXT_IO.PUT_LINE( "Starting Test_task (Global)" );
0087 
0088       RTEMS.TASKS.START(
0089          MPTEST.TASK_ID( 1 ),
0090          MPTEST.TEST_TASK'ACCESS,
0091          0,
0092          STATUS
0093       );
0094       TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "TASK_START" );
0095 
0096       MPTEST.TIMER_NAME( 1 ) := RTEMS.BUILD_NAME(  'T', 'M', '1', ' ' );
0097       MPTEST.TIMER_NAME( 2 ) := RTEMS.BUILD_NAME(  'T', 'M', '2', ' ' );
0098 
0099       RTEMS.TIMER.CREATE(
0100          MPTEST.TIMER_NAME( TEST_SUPPORT.NODE ),
0101          MPTEST.TIMER_ID( 1 ),
0102          STATUS
0103       );
0104       TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "TIMER_CREATE" );
0105 
0106       TEXT_IO.PUT_LINE( "Deleting initialization task" );
0107 
0108       RTEMS.TASKS.DELETE( RTEMS.SELF, STATUS );
0109       TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "TASK_DELETE OF SELF" );
0110 
0111    end INIT;
0112 
0113 --
0114 --  PROCESS_ASR
0115 --
0116 
0117    procedure PROCESS_ASR (
0118       SIGNAL : in     RTEMS.SIGNAL_SET
0119    )
0120    is 
0121    begin
0122 
0123       if SIGNAL /= MPTEST.EXPECTED_SIGNAL then
0124 
0125          TEXT_IO.PUT( "ERROR: I was expecting signal 0x" );
0126          UNSIGNED32_IO.PUT( EXPECTED_SIGNAL, BASE => 16 );
0127          TEXT_IO.PUT( " got 0x" );
0128          UNSIGNED32_IO.PUT( SIGNAL, BASE => 16 );
0129          TEXT_IO.NEW_LINE;
0130 
0131          RTEMS.FATAL.ERROR_OCCURRED( 16#000F_0000# );
0132 
0133       end if;
0134 
0135       MPTEST.SIGNAL_CAUGHT := TRUE;
0136 
0137    end PROCESS_ASR;
0138 
0139 --
0140 --  STOP_TEST_TSR
0141 --
0142 
0143    procedure STOP_TEST_TSR (
0144       IGNORED_ID      : in     RTEMS.ID;
0145       IGNORED_ADDRESS : in     RTEMS.ADDRESS
0146    ) is
0147    begin
0148 
0149       MPTEST.STOP_TEST := TRUE;
0150 
0151    end STOP_TEST_TSR;
0152 
0153 --
0154 --  TEST_TASK
0155 --
0156 
0157    procedure TEST_TASK (
0158       ARGUMENT : in     RTEMS.TASKS.ARGUMENT
0159    ) is
0160       pragma Unreferenced(ARGUMENT);
0161       STATUS  : RTEMS.STATUS_CODES;
0162    begin
0163 
0164       MPTEST.STOP_TEST := FALSE;
0165 
0166       MPTEST.SIGNAL_CAUGHT := FALSE;
0167       MPTEST.SIGNAL_COUNT  := 0;
0168 
0169       TEXT_IO.PUT_LINE( "signal_catch: initializing signal catcher" );
0170       RTEMS.SIGNAL.CATCH( 
0171          MPTEST.PROCESS_ASR'ACCESS, 
0172          RTEMS.NO_ASR + RTEMS.NO_PREEMPT,
0173          STATUS
0174       );
0175       TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "SIGNAL_CATCH" );
0176 
0177       if TEST_SUPPORT.NODE = 1 then
0178          MPTEST.REMOTE_NODE     := 2;
0179          MPTEST.REMOTE_SIGNAL   := RTEMS.SIGNAL_18;
0180          MPTEST.EXPECTED_SIGNAL := RTEMS.SIGNAL_17;
0181       else
0182          MPTEST.REMOTE_NODE     := 1;
0183          MPTEST.REMOTE_SIGNAL   := RTEMS.SIGNAL_17;
0184          MPTEST.EXPECTED_SIGNAL := RTEMS.SIGNAL_18;
0185       end if;
0186 
0187       TEXT_IO.PUT( "Remote task's name is : " );
0188       TEST_SUPPORT.PUT_NAME( MPTEST.TASK_NAME( MPTEST.REMOTE_NODE ), TRUE );
0189 
0190       TEXT_IO.PUT_LINE( "Getting TID of remote task" );
0191       loop
0192 
0193          RTEMS.TASKS.IDENT( 
0194             MPTEST.TASK_NAME( MPTEST.REMOTE_NODE ),
0195             RTEMS.SEARCH_ALL_NODES,
0196             MPTEST.REMOTE_TID,
0197             STATUS
0198          );
0199 
0200          exit when RTEMS.IS_STATUS_SUCCESSFUL( STATUS );
0201 
0202       end loop;
0203 
0204       RTEMS.TIMER.FIRE_AFTER(
0205          MPTEST.TIMER_ID( 1 ),
0206          3 * TEST_SUPPORT.TICKS_PER_SECOND,
0207          MPTEST.STOP_TEST_TSR'ACCESS,
0208          RTEMS.NULL_ADDRESS,
0209          STATUS
0210       );
0211       TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "TIMER_FIRE_AFTER" );
0212 
0213       if TEST_SUPPORT.NODE = 1 then
0214 
0215          TEXT_IO.PUT_LINE( "Sending signal to remote task" );
0216          loop
0217             RTEMS.SIGNAL.SEND(
0218                MPTEST.REMOTE_TID,
0219                MPTEST.REMOTE_SIGNAL,
0220                STATUS
0221             );
0222 
0223             exit when RTEMS.IS_STATUS_SUCCESSFUL( STATUS );
0224 
0225             exit when not RTEMS.ARE_STATUSES_EQUAL(STATUS, RTEMS.NOT_DEFINED);
0226    
0227          end loop;
0228          TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "SIGNAL_SEND" );
0229 
0230       end if;
0231 
0232       loop
0233  
0234          exit when MPTEST.STOP_TEST;
0235 
0236          if MPTEST.SIGNAL_CAUGHT then
0237 
0238             MPTEST.SIGNAL_CAUGHT := FALSE;
0239             MPTEST.SIGNAL_COUNT  := MPTEST.SIGNAL_COUNT + 1;
0240 
0241             if MPTEST.SIGNAL_COUNT >= MPTEST.SIGNALS_PER_DOT then
0242 
0243                MPTEST.SIGNAL_COUNT := 0;
0244 
0245                TEST_SUPPORT.PUT_DOT( "." );
0246 
0247             end if;
0248 
0249             RTEMS.SIGNAL.SEND(
0250                MPTEST.REMOTE_TID,
0251                MPTEST.REMOTE_SIGNAL,
0252                STATUS
0253             );
0254             TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "SIGNAL_SEND" );
0255 
0256          end if;
0257 
0258       end loop;
0259 
0260       TEXT_IO.NEW_LINE;
0261       TEST_SUPPORT.ADA_TEST_END;
0262 
0263       RTEMS.SHUTDOWN_EXECUTIVE( 0 );
0264 
0265    end TEST_TASK;
0266 
0267 end MPTEST;