Warning, /testsuites/ada/mptests/mp13/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 13 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 RTEMS.SEMAPHORE;
0043 with TEST_SUPPORT;
0044 with TEXT_IO;
0045 with UNSIGNED32_IO;
0046
0047 package body MPTEST is
0048
0049 --
0050 -- INIT
0051 --
0052
0053 procedure INIT (
0054 ARGUMENT : in RTEMS.TASKS.ARGUMENT
0055 ) is
0056 pragma Unreferenced(ARGUMENT);
0057 STATUS : RTEMS.STATUS_CODES;
0058 begin
0059
0060 TEXT_IO.NEW_LINE( 2 );
0061 TEST_SUPPORT.ADA_TEST_BEGIN;
0062 TEXT_IO.PUT( "*** NODE " );
0063 UNSIGNED32_IO.PUT(
0064 TEST_SUPPORT.NODE,
0065 WIDTH => 1
0066 );
0067 TEXT_IO.PUT_LINE( " ***" );
0068
0069 MPTEST.TASK_NAME( 1 ) := RTEMS.BUILD_NAME( '1', '1', '1', ' ' );
0070 MPTEST.TASK_NAME( 2 ) := RTEMS.BUILD_NAME( '2', '2', '2', ' ' );
0071
0072 MPTEST.QUEUE_NAME( 1 ) := RTEMS.BUILD_NAME( 'M', 'S', 'G', ' ' );
0073
0074 MPTEST.SEMAPHORE_NAME( 1 ) := RTEMS.BUILD_NAME( 'S', 'E', 'M', ' ' );
0075
0076 if TEST_SUPPORT.NODE = 1 then
0077
0078 TEXT_IO.PUT_LINE( "Creating Message Queue (Global)" );
0079 RTEMS.MESSAGE_QUEUE.CREATE(
0080 MPTEST.QUEUE_NAME( 1 ),
0081 3,
0082 3,
0083 RTEMS.GLOBAL,
0084 MPTEST.QUEUE_ID( 1 ),
0085 STATUS
0086 );
0087 TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "MESSAGE_QUEUE_CREATE" );
0088
0089 TEXT_IO.PUT_LINE( "Creating Semaphore (Global)" );
0090 RTEMS.SEMAPHORE.CREATE(
0091 MPTEST.SEMAPHORE_NAME( 1 ),
0092 1,
0093 RTEMS.GLOBAL + RTEMS.PRIORITY,
0094 RTEMS.TASKS.NO_PRIORITY,
0095 MPTEST.SEMAPHORE_ID( 1 ),
0096 STATUS
0097 );
0098 TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "SEMAPHORE_CREATE" );
0099
0100 RTEMS.SEMAPHORE.OBTAIN(
0101 MPTEST.SEMAPHORE_ID( 1 ),
0102 RTEMS.DEFAULT_OPTIONS,
0103 RTEMS.NO_TIMEOUT,
0104 STATUS
0105 );
0106 TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "SEMAPHORE_OBTAIN" );
0107
0108 end if;
0109
0110 TEXT_IO.PUT_LINE( "Creating Test_task 1 (local)" );
0111 RTEMS.TASKS.CREATE(
0112 MPTEST.TASK_NAME( 1 ),
0113 1,
0114 2048,
0115 RTEMS.TIMESLICE,
0116 RTEMS.DEFAULT_ATTRIBUTES,
0117 MPTEST.TASK_ID( 1 ),
0118 STATUS
0119 );
0120 TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "TASK_CREATE" );
0121
0122 TEXT_IO.PUT_LINE( "Starting Test_task 1 (local)" );
0123 RTEMS.TASKS.START(
0124 MPTEST.TASK_ID( 1 ),
0125 MPTEST.TEST_TASK_1'ACCESS,
0126 0,
0127 STATUS
0128 );
0129 TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "TASK_START" );
0130
0131 TEXT_IO.PUT_LINE( "Creating Test_task 2 (local)" );
0132 RTEMS.TASKS.CREATE(
0133 MPTEST.TASK_NAME( 2 ),
0134 1,
0135 2048,
0136 RTEMS.TIMESLICE,
0137 RTEMS.DEFAULT_ATTRIBUTES,
0138 MPTEST.TASK_ID( 2 ),
0139 STATUS
0140 );
0141 TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "TASK_CREATE" );
0142
0143 TEXT_IO.PUT_LINE( "Starting Test_task 2 (local)" );
0144 RTEMS.TASKS.START(
0145 MPTEST.TASK_ID( 2 ),
0146 MPTEST.TEST_TASK_2'ACCESS,
0147 0,
0148 STATUS
0149 );
0150 TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "TASK_START" );
0151
0152 if TEST_SUPPORT.NODE = 1 then
0153
0154 RTEMS.TASKS.WAKE_AFTER( 5 * TEST_SUPPORT.TICKS_PER_SECOND, STATUS );
0155 TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "TASK_WAKE_AFTER" );
0156
0157 TEST_SUPPORT.ADA_TEST_END;
0158
0159 RTEMS.SHUTDOWN_EXECUTIVE( 0 );
0160
0161 end if;
0162
0163 TEXT_IO.PUT_LINE( "Deleting initialization task" );
0164 RTEMS.TASKS.DELETE( RTEMS.SELF, STATUS );
0165 TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "TASK_DELETE OF SELF" );
0166
0167 end INIT;
0168
0169 --
0170 -- TEST_TASK_1
0171 --
0172
0173 procedure TEST_TASK_1 (
0174 ARGUMENT : in RTEMS.TASKS.ARGUMENT
0175 ) is
0176 pragma Unreferenced(ARGUMENT);
0177 RECEIVE_BUFFER_AREA : MPTEST.BUFFER;
0178 RECEIVE_BUFFER : RTEMS.ADDRESS;
0179 STATUS : RTEMS.STATUS_CODES;
0180 MESSAGE_SIZE : RTEMS.SIZE := 0;
0181 begin
0182
0183 RECEIVE_BUFFER := RECEIVE_BUFFER_AREA'ADDRESS;
0184
0185 TEXT_IO.PUT_LINE( "Getting QID of message queue" );
0186
0187 loop
0188
0189 RTEMS.MESSAGE_QUEUE.IDENT(
0190 MPTEST.QUEUE_NAME( 1 ),
0191 RTEMS.SEARCH_ALL_NODES,
0192 MPTEST.QUEUE_ID( 1 ),
0193 STATUS
0194 );
0195
0196 exit when RTEMS.IS_STATUS_SUCCESSFUL( STATUS );
0197
0198 end loop;
0199
0200 if TEST_SUPPORT.NODE = 1 then
0201
0202 TEXT_IO.PUT_LINE( "Receiving message ..." );
0203 RTEMS.MESSAGE_QUEUE.RECEIVE(
0204 MPTEST.QUEUE_ID( 1 ),
0205 RECEIVE_BUFFER,
0206 RTEMS.DEFAULT_OPTIONS,
0207 RTEMS.NO_TIMEOUT,
0208 MESSAGE_SIZE,
0209 STATUS
0210 );
0211 TEXT_IO.PUT_LINE( "How did I get back from here???" );
0212 TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "MESSAGE_QUEUE_RECEIVE" );
0213
0214 end if;
0215
0216 RTEMS.TASKS.WAKE_AFTER( TEST_SUPPORT.TICKS_PER_SECOND, STATUS );
0217 TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "TASK_WAKE_AFTER" );
0218
0219 TEXT_IO.PUT_LINE( "Receiving message ..." );
0220 RTEMS.MESSAGE_QUEUE.RECEIVE(
0221 MPTEST.QUEUE_ID( 1 ),
0222 RECEIVE_BUFFER,
0223 RTEMS.DEFAULT_OPTIONS,
0224 2 * TEST_SUPPORT.TICKS_PER_SECOND,
0225 MESSAGE_SIZE,
0226 STATUS
0227 );
0228 TEST_SUPPORT.FATAL_DIRECTIVE_STATUS(
0229 STATUS,
0230 RTEMS.TIMEOUT,
0231 "MESSAGE_QUEUE_RECEIVE"
0232 );
0233 TEST_SUPPORT.FATAL_DIRECTIVE_STATUS(
0234 STATUS,
0235 RTEMS.TIMEOUT,
0236 "MESSAGE_QUEUE_OBTAIN"
0237 );
0238
0239 TEXT_IO.PUT_LINE(
0240 "message_queue_receive correctly returned TIMEOUT"
0241 );
0242
0243 TEXT_IO.PUT_LINE( "Deleting self" );
0244 RTEMS.TASKS.DELETE( RTEMS.SELF, STATUS );
0245 TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "TASK_DELETE OF SELF" );
0246
0247 end TEST_TASK_1;
0248
0249 --
0250 -- TEST_TASK_2
0251 --
0252
0253 procedure TEST_TASK_2 (
0254 ARGUMENT : in RTEMS.TASKS.ARGUMENT
0255 ) is
0256 pragma Unreferenced(ARGUMENT);
0257 STATUS : RTEMS.STATUS_CODES;
0258 begin
0259
0260 TEXT_IO.PUT_LINE( "Getting SMID of semaphore" );
0261
0262 loop
0263
0264 RTEMS.SEMAPHORE.IDENT(
0265 MPTEST.SEMAPHORE_NAME( 1 ),
0266 RTEMS.SEARCH_ALL_NODES,
0267 MPTEST.SEMAPHORE_ID( 1 ),
0268 STATUS
0269 );
0270
0271 exit when RTEMS.IS_STATUS_SUCCESSFUL( STATUS );
0272
0273 end loop;
0274
0275 if TEST_SUPPORT.NODE = 1 then
0276
0277 RTEMS.TASKS.WAKE_AFTER( TEST_SUPPORT.TICKS_PER_SECOND, STATUS );
0278 TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "TASK_WAKE_AFTER" );
0279
0280 TEXT_IO.PUT_LINE( "Releasing semaphore ..." );
0281 RTEMS.SEMAPHORE.RELEASE( MPTEST.SEMAPHORE_ID( 1 ), STATUS );
0282 TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "SEMAPHORE_RELEASE" );
0283
0284 RTEMS.TASKS.WAKE_AFTER( TEST_SUPPORT.TICKS_PER_SECOND / 2, STATUS );
0285 TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "TASK_WAKE_AFTER" );
0286
0287 TEXT_IO.PUT_LINE( "Getting semaphore ..." );
0288 RTEMS.SEMAPHORE.OBTAIN(
0289 MPTEST.SEMAPHORE_ID( 1 ),
0290 RTEMS.DEFAULT_OPTIONS,
0291 RTEMS.NO_TIMEOUT,
0292 STATUS
0293 );
0294 TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "SEMAPHORE_OBTAIN" );
0295
0296 TEXT_IO.PUT_LINE( "Getting semaphore ..." );
0297 RTEMS.SEMAPHORE.OBTAIN(
0298 MPTEST.SEMAPHORE_ID( 1 ),
0299 RTEMS.DEFAULT_OPTIONS,
0300 RTEMS.NO_TIMEOUT,
0301 STATUS
0302 );
0303 TEXT_IO.PUT_LINE( "How did I get back from here???" );
0304 TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "SEMAPHORE_OBTAIN" );
0305
0306 end if;
0307
0308 RTEMS.TASKS.WAKE_AFTER( TEST_SUPPORT.TICKS_PER_SECOND / 2, STATUS );
0309 TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "TASK_WAKE_AFTER" );
0310
0311 TEXT_IO.PUT_LINE( "Getting semaphore ..." );
0312 RTEMS.SEMAPHORE.OBTAIN(
0313 MPTEST.SEMAPHORE_ID( 1 ),
0314 RTEMS.DEFAULT_OPTIONS,
0315 RTEMS.NO_TIMEOUT,
0316 STATUS
0317 );
0318 TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "SEMAPHORE_OBTAIN" );
0319
0320 TEXT_IO.PUT_LINE( "Releasing semaphore ..." );
0321 RTEMS.SEMAPHORE.RELEASE( MPTEST.SEMAPHORE_ID( 1 ), STATUS );
0322 TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "SEMAPHORE_RELEASE" );
0323
0324 RTEMS.TASKS.WAKE_AFTER( TEST_SUPPORT.TICKS_PER_SECOND, STATUS );
0325 TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "TASK_WAKE_AFTER" );
0326
0327 TEXT_IO.PUT_LINE( "Getting semaphore ..." );
0328 RTEMS.SEMAPHORE.OBTAIN(
0329 MPTEST.SEMAPHORE_ID( 1 ),
0330 RTEMS.DEFAULT_OPTIONS,
0331 2 * TEST_SUPPORT.TICKS_PER_SECOND,
0332 STATUS
0333 );
0334 TEST_SUPPORT.FATAL_DIRECTIVE_STATUS(
0335 STATUS,
0336 RTEMS.TIMEOUT,
0337 "SEMAPHORE_OBTAIN"
0338 );
0339 TEXT_IO.PUT_LINE( "semaphore_obtain correctly returned TIMEOUT" );
0340
0341 TEST_SUPPORT.ADA_TEST_END;
0342
0343 RTEMS.SHUTDOWN_EXECUTIVE( 0 );
0344
0345 end TEST_TASK_2;
0346
0347 end MPTEST;