Back to home page

LXR

 
 

    


Warning, /testsuites/ada/mptests/mp14/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 14 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.EVENT;
0042 with RTEMS.MESSAGE_QUEUE;
0043 with RTEMS.PARTITION;
0044 with RTEMS.SEMAPHORE;
0045 with RTEMS.TIMER;
0046 with TEST_SUPPORT;
0047 with TEXT_IO;
0048 with UNSIGNED32_IO;
0049 
0050 package body MPTEST is
0051 
0052 --
0053 --  STOP_TEST_TSR
0054 --
0055  
0056    procedure STOP_TEST_TSR (
0057       IGNORED_ID      : in     RTEMS.ID;
0058       IGNORED_ADDRESS : in     RTEMS.ADDRESS
0059    ) is
0060    begin
0061  
0062       MPTEST.STOP_TEST := TRUE;
0063  
0064    end STOP_TEST_TSR;
0065  
0066 --
0067 --  EXIT_TEST
0068 --
0069  
0070    procedure EXIT_TEST is
0071       OLD_MODE : RTEMS.MODE;
0072       STATUS   : RTEMS.STATUS_CODES;
0073    begin
0074  
0075       RTEMS.TASKS.MODE(RTEMS.NO_PREEMPT, RTEMS.PREEMPT_MASK, OLD_MODE, STATUS);
0076       TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "TASK_MODE" );
0077 
0078       RTEMS.SHUTDOWN_EXECUTIVE( 0 );
0079  
0080    end EXIT_TEST;
0081  
0082 --
0083 --  INIT
0084 --
0085 
0086    procedure INIT (
0087       ARGUMENT : in     RTEMS.TASKS.ARGUMENT
0088    ) is
0089       pragma Unreferenced(ARGUMENT);
0090       STATUS            : RTEMS.STATUS_CODES;
0091       PREVIOUS_PRIORITY : RTEMS.TASKS.PRIORITY;
0092    begin
0093 
0094       TEXT_IO.NEW_LINE( 2 );
0095       TEST_SUPPORT.ADA_TEST_BEGIN;
0096       TEXT_IO.PUT( "*** NODE " );
0097       UNSIGNED32_IO.PUT(
0098          TEST_SUPPORT.NODE,
0099          WIDTH => 1
0100       );
0101       TEXT_IO.PUT_LINE( " ***" );
0102 
0103       MPTEST.STOP_TIMER_NAME := RTEMS.BUILD_NAME( 'S', 'T', 'O', 'P' );
0104 
0105       MPTEST.STOP_TEST := FALSE;
0106 
0107       RTEMS.TIMER.CREATE(
0108          MPTEST.STOP_TIMER_NAME,
0109          MPTEST.STOP_TIMER_ID,
0110          STATUS
0111       );
0112       TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "TIMER_CREATE" );
0113 
0114       RTEMS.TIMER.FIRE_AFTER(
0115          MPTEST.STOP_TIMER_ID,
0116          TEST_SUPPORT.MAXIMUM_LONG_TEST_DURATION *
0117             TEST_SUPPORT.TICKS_PER_SECOND,
0118          MPTEST.STOP_TEST_TSR'ACCESS,
0119          RTEMS.NULL_ADDRESS,
0120          STATUS
0121       );
0122       TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "TIMER_FIRE_AFTER" );
0123  
0124       MPTEST.EVENT_TASK_NAME( 1 ) := RTEMS.BUILD_NAME(  '1', '1', '1', ' ' );
0125       MPTEST.EVENT_TASK_NAME( 2 ) := RTEMS.BUILD_NAME(  '2', '2', '2', ' ' );
0126 
0127       MPTEST.QUEUE_TASK_NAME( 1 ) := RTEMS.BUILD_NAME(  'M', 'T', '1', ' ' );
0128       MPTEST.QUEUE_TASK_NAME( 2 ) := RTEMS.BUILD_NAME(  'M', 'T', '2', ' ' );
0129 
0130       MPTEST.PARTITION_TASK_NAME( 1 ) := 
0131          RTEMS.BUILD_NAME(  'P', 'T', '1', ' ' );
0132       MPTEST.PARTITION_TASK_NAME( 2 ) := 
0133          RTEMS.BUILD_NAME(  'P', 'T', '2', ' ' );
0134 
0135       MPTEST.SEMAPHORE_TASK_NAME( 1 ) := 
0136          RTEMS.BUILD_NAME(  'S', 'M', '1', ' ' );
0137       MPTEST.SEMAPHORE_TASK_NAME( 2 ) := 
0138          RTEMS.BUILD_NAME(  'S', 'M', '2', ' ' );
0139 
0140       MPTEST.SEMAPHORE_NAME( 1 ) := RTEMS.BUILD_NAME(  'S', 'E', 'M', ' ' );
0141 
0142       MPTEST.QUEUE_NAME( 1 ) := RTEMS.BUILD_NAME(  'M', 'S', 'G', ' ' );
0143 
0144       MPTEST.PARTITION_NAME( 1 ) := RTEMS.BUILD_NAME(  'P', 'A', 'R', ' ' );
0145 
0146       MPTEST.TIMER_NAME( 1 ) := RTEMS.BUILD_NAME(  'T', 'M', 'R', ' ' );
0147 
0148       for INDEX in MPTEST.BUFFERS'FIRST .. MPTEST.BUFFERS'LAST
0149       loop
0150 
0151          MPTEST.BUFFERS( INDEX ) :=
0152             MPTEST.BUFFER_AREAS( INDEX )'ADDRESS;
0153 
0154       end loop;
0155 
0156       if TEST_SUPPORT.NODE = 1 then
0157 
0158          TEXT_IO.PUT_LINE( "Creating Semaphore (Global)" );
0159          RTEMS.SEMAPHORE.CREATE(
0160             MPTEST.SEMAPHORE_NAME( 1 ),
0161             1,
0162             RTEMS.GLOBAL,
0163             RTEMS.TASKS.NO_PRIORITY,
0164             MPTEST.SEMAPHORE_ID( 1 ),
0165             STATUS
0166          );
0167          TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "SEMAPHORE_CREATE" );
0168 
0169          TEXT_IO.PUT_LINE( "Creating Message Queue (Global)" );
0170          RTEMS.MESSAGE_QUEUE.CREATE(
0171             MPTEST.QUEUE_NAME( 1 ),
0172             1,
0173             1,
0174             RTEMS.GLOBAL,
0175             MPTEST.QUEUE_ID( 1 ),
0176             STATUS
0177          );
0178          TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "MESSAGE_QUEUE_CREATE" );
0179 
0180          TEXT_IO.PUT_LINE( "Creating Partition (Global)" );
0181          RTEMS.PARTITION.CREATE(
0182             MPTEST.PARTITION_NAME( 1 ),
0183             MPTEST.PARTITION_AREA( 0 )'ADDRESS,
0184             16#8000#,
0185             16#3000#,
0186             RTEMS.GLOBAL,
0187             MPTEST.PARTITION_ID( 1 ),
0188             STATUS
0189          );
0190          TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "PARTITION_CREATE" );
0191 
0192       end if;
0193 
0194       TEXT_IO.PUT_LINE( "Creating Event task (Global)" );
0195       RTEMS.TASKS.CREATE(
0196          MPTEST.EVENT_TASK_NAME(
0197             TEST_SUPPORT.NODE
0198          ),
0199          2,
0200          2048,
0201          RTEMS.TIMESLICE,
0202          RTEMS.GLOBAL,
0203          MPTEST.EVENT_TASK_ID( 1 ),
0204          STATUS
0205       ); 
0206       TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "TASK_CREATE" );
0207 
0208       TEXT_IO.PUT_LINE( "Starting Event task (Global)" );
0209       RTEMS.TASKS.START(
0210          MPTEST.EVENT_TASK_ID( 1 ),
0211          MPTEST.TEST_TASK'ACCESS,
0212          0,
0213          STATUS
0214       ); 
0215       TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "TASK_START" );
0216 
0217       TEXT_IO.PUT_LINE( "Creating Semaphore task (Global)" );
0218       RTEMS.TASKS.CREATE(
0219          MPTEST.SEMAPHORE_TASK_NAME(
0220             TEST_SUPPORT.NODE
0221          ),
0222          2,
0223          2048,
0224          RTEMS.TIMESLICE,
0225          RTEMS.GLOBAL,
0226          MPTEST.SEMAPHORE_TASK_ID( 1 ),
0227          STATUS
0228       ); 
0229       TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "TASK_CREATE" );
0230 
0231       TEXT_IO.PUT_LINE( "Starting Semaphore task (Global)" );
0232       RTEMS.TASKS.START(
0233          MPTEST.SEMAPHORE_TASK_ID( 1 ),
0234          MPTEST.SEMAPHORE_TASK'ACCESS,
0235          0,
0236          STATUS
0237       ); 
0238       TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "TASK_START" );
0239 
0240       TEXT_IO.PUT_LINE( "Creating Message Queue task (Global)" );
0241       RTEMS.TASKS.CREATE(
0242          MPTEST.QUEUE_TASK_NAME(
0243             TEST_SUPPORT.NODE
0244          ),
0245          2,
0246          2048,
0247          RTEMS.TIMESLICE,
0248          RTEMS.GLOBAL,
0249          MPTEST.QUEUE_TASK_ID( 1 ),
0250          STATUS
0251       ); 
0252       TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "TASK_CREATE" );
0253 
0254       TEXT_IO.PUT_LINE( "Starting Message Queue task (Global)" );
0255       RTEMS.TASKS.START(
0256          MPTEST.QUEUE_TASK_ID( 1 ),
0257          MPTEST.MESSAGE_QUEUE_TASK'ACCESS,
0258          1,                          -- index of buffer
0259          STATUS
0260       ); 
0261       TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "TASK_START" );
0262 
0263       TEXT_IO.PUT_LINE( "Creating Partition task (Global)" );
0264       RTEMS.TASKS.CREATE(
0265          MPTEST.PARTITION_TASK_NAME(
0266             TEST_SUPPORT.NODE 
0267          ),
0268          2,
0269          2048,
0270          RTEMS.TIMESLICE,
0271          RTEMS.GLOBAL,
0272          MPTEST.PARTITION_TASK_ID( 1 ),
0273          STATUS
0274       ); 
0275       TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "TASK_CREATE" );
0276 
0277       TEXT_IO.PUT_LINE( "Starting Partition task (Global)" );
0278       RTEMS.TASKS.START(
0279          MPTEST.PARTITION_TASK_ID( 1 ),
0280          MPTEST.PARTITION_TASK'ACCESS,
0281          0,
0282          STATUS
0283       ); 
0284       TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "TASK_START" );
0285     
0286       RTEMS.TASKS.SET_PRIORITY( RTEMS.SELF, 2, PREVIOUS_PRIORITY, STATUS );
0287       TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "TASK_SET_PRIORITY" );
0288 
0289       MPTEST.DELAYED_EVENTS_TASK( 1 );
0290 
0291    end INIT;
0292 
0293 --
0294 --  DELAYED_SEND_EVENT
0295 --
0296 --  DESCRIPTION:
0297 --
0298 --  This subprogram is a timer service routine which sends an
0299 --  event set to a waiting task.
0300 --
0301 
0302    procedure DELAYED_SEND_EVENT (
0303       TIMER_ID        : in     RTEMS.ID;
0304       IGNORED_ADDRESS : in     RTEMS.ADDRESS
0305    ) is
0306       STATUS : RTEMS.STATUS_CODES;
0307    begin
0308 
0309       RTEMS.EVENT.SEND(
0310          MPTEST.TASK_ID( RTEMS.GET_INDEX( TIMER_ID ) ),
0311          RTEMS.EVENT_16,
0312          STATUS
0313       );
0314       TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "EVENT_SEND" );
0315 
0316    end DELAYED_SEND_EVENT;
0317  
0318 --
0319 --  TEST_TASK
0320 --
0321 --  DESCRIPTION:
0322 --
0323 --  This is one of the test tasks.
0324 --
0325  
0326    procedure TEST_TASK ( 
0327       ARGUMENT : in     RTEMS.TASKS.ARGUMENT
0328    ) is
0329       pragma Unreferenced(ARGUMENT);
0330       REMOTE_NODE : RTEMS.UNSIGNED32;
0331       REMOTE_TID  : RTEMS.ID;
0332       EVENT_OUT   : RTEMS.EVENT_SET;
0333       STATUS      : RTEMS.STATUS_CODES;
0334    begin
0335 
0336       if TEST_SUPPORT.NODE = 1 then
0337          REMOTE_NODE := 2;
0338       else
0339          REMOTE_NODE := 1;
0340       end if;
0341 
0342       TEXT_IO.PUT_LINE( "About to go to sleep!" );
0343       RTEMS.TASKS.WAKE_AFTER( 1 * TEST_SUPPORT.TICKS_PER_SECOND, STATUS );
0344       TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "TASK_WAKE_AFTER" );
0345       TEXT_IO.PUT_LINE( "Waking up!" );
0346  
0347       TEXT_IO.PUT( "Remote task's name is : " );
0348       TEST_SUPPORT.PUT_NAME( MPTEST.EVENT_TASK_NAME( REMOTE_NODE ), TRUE );
0349 
0350       TEXT_IO.PUT_LINE( "Getting TID of remote task" );
0351 
0352       loop
0353 
0354          RTEMS.TASKS.IDENT(
0355             MPTEST.EVENT_TASK_NAME( REMOTE_NODE ),
0356             RTEMS.SEARCH_ALL_NODES,
0357             REMOTE_TID,
0358             STATUS
0359          ); 
0360 
0361          exit when RTEMS.IS_STATUS_SUCCESSFUL( STATUS );
0362 
0363          TEXT_IO.PUT_LINE( "task_ident" );
0364 
0365       end loop;
0366 
0367       if TEST_SUPPORT.NODE = 1 then
0368          TEXT_IO.PUT_LINE( "Sending events to remote task" );
0369 
0370          loop
0371             exit when MPTEST.STOP_TEST;
0372 
0373             for COUNT in 1 .. MPTEST.EVENT_TASK_DOT_COUNT
0374             loop
0375                RTEMS.EVENT.SEND(
0376                   REMOTE_TID,
0377                   RTEMS.EVENT_16,
0378                   STATUS
0379                );
0380                TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "EVENT_SEND" );
0381 
0382                exit when MPTEST.STOP_TEST;
0383 
0384             end loop;
0385 
0386             TEST_SUPPORT.PUT_DOT( "e" );
0387   
0388          end loop;
0389 
0390       end if;
0391           
0392       TEXT_IO.PUT_LINE( "Receiving events from remote task" );
0393 
0394       loop
0395          exit when MPTEST.STOP_TEST;
0396 
0397          for COUNT in 1 .. MPTEST.EVENT_TASK_DOT_COUNT 
0398          loop 
0399             exit when MPTEST.STOP_TEST;
0400 
0401             RTEMS.EVENT.RECEIVE(
0402                RTEMS.EVENT_16,
0403                RTEMS.DEFAULT_OPTIONS,
0404                RTEMS.NO_TIMEOUT,
0405                EVENT_OUT,
0406                STATUS 
0407             );   
0408             TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "EVENT_RECEIVE" );
0409 
0410          end loop;
0411  
0412          TEST_SUPPORT.PUT_DOT( "e" );
0413  
0414       end loop;
0415 
0416       MPTEST.EXIT_TEST;
0417  
0418    end TEST_TASK;
0419  
0420 -- 
0421 --  DELAYED_EVENTS_TASK 
0422 -- 
0423 --  DESCRIPTION: 
0424 -- 
0425 --  This is one of the test tasks. 
0426 -- 
0427   
0428    procedure DELAYED_EVENTS_TASK (  
0429       ARGUMENT : in     RTEMS.TASKS.ARGUMENT 
0430    ) is
0431       pragma Unreferenced(ARGUMENT);
0432       PREVIOUS_MODE : RTEMS.MODE;
0433       EVENTS_OUT    : RTEMS.EVENT_SET;
0434       STATUS        : RTEMS.STATUS_CODES;
0435    begin
0436 
0437       RTEMS.TASKS.MODE(
0438          RTEMS.PREEMPT + RTEMS.TIMESLICE,
0439          RTEMS.PREEMPT_MASK + RTEMS.TIMESLICE_MASK,
0440          PREVIOUS_MODE,
0441          STATUS
0442       );
0443       TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "TASK_MODE" );
0444  
0445       RTEMS.TIMER.CREATE(
0446          MPTEST.TIMER_NAME( 1 ),
0447          MPTEST.TIMER_ID( 1 ),
0448          STATUS 
0449       );
0450       TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "TIMER_CREATE" );
0451 
0452       RTEMS.TASKS.IDENT(
0453          RTEMS.SELF,
0454          RTEMS.SEARCH_ALL_NODES,
0455          MPTEST.TASK_ID( RTEMS.GET_INDEX( MPTEST.TIMER_ID( 1 ) ) ),
0456          STATUS
0457       );
0458       TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "TASK_IDENTS" );
0459 
0460       loop
0461 
0462          for COUNT in 1 .. MPTEST.DELAYED_EVENT_DOT_COUNT 
0463          loop 
0464             RTEMS.TIMER.FIRE_AFTER(
0465                MPTEST.TIMER_ID( 1 ),
0466                1,
0467                MPTEST.DELAYED_SEND_EVENT'ACCESS,
0468                RTEMS.NULL_ADDRESS,
0469                STATUS 
0470             );
0471             TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "TIMER_FIRE_AFTER" );
0472 
0473             RTEMS.EVENT.RECEIVE(
0474                RTEMS.EVENT_16,
0475                RTEMS.DEFAULT_OPTIONS,
0476                RTEMS.NO_TIMEOUT,
0477                EVENTS_OUT,
0478                STATUS 
0479             );   
0480             TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "EVENT_RECEIVE" );
0481 
0482          end loop;
0483  
0484          TEST_SUPPORT.PUT_DOT( "." );
0485  
0486       end loop;
0487 
0488    end DELAYED_EVENTS_TASK; 
0489  
0490 -- 
0491 --  MESSAGE_QUEUE_TASK 
0492 -- 
0493 --  DESCRIPTION: 
0494 -- 
0495 --  This is one of the test tasks. 
0496 -- 
0497   
0498    procedure MESSAGE_QUEUE_TASK (  
0499       INDEX : in     RTEMS.TASKS.ARGUMENT 
0500    ) is
0501       YIELD_COUNT    : RTEMS.UNSIGNED32;
0502       OVERFLOW_COUNT : RTEMS.UNSIGNED32_POINTER;
0503       BUFFER_COUNT   : RTEMS.UNSIGNED32_POINTER;
0504       STATUS         : RTEMS.STATUS_CODES;
0505       MESSAGE_SIZE   : RTEMS.SIZE := 0;
0506    begin
0507 
0508       MPTEST.BUFFER_AREAS( INDEX ).FIELD1 := 0;
0509       MPTEST.BUFFER_AREAS( INDEX ).FIELD2 := 0;
0510       MPTEST.BUFFER_AREAS( INDEX ).FIELD3 := 0;
0511       MPTEST.BUFFER_AREAS( INDEX ).FIELD4 := 0;
0512 
0513       TEXT_IO.PUT_LINE( "Getting ID of message queue" );
0514 
0515       loop
0516 
0517          RTEMS.MESSAGE_QUEUE.IDENT(
0518             MPTEST.QUEUE_NAME( 1 ),
0519             RTEMS.SEARCH_ALL_NODES,
0520             MPTEST.QUEUE_ID( 1 ),
0521             STATUS
0522          );
0523          exit when RTEMS.IS_STATUS_SUCCESSFUL( STATUS );
0524 
0525          TEXT_IO.PUT_LINE( "message_queue_ident FAILED!!" );
0526 
0527       end loop;
0528 
0529       if TEST_SUPPORT.NODE = 1 then
0530 
0531          RTEMS.MESSAGE_QUEUE.SEND(
0532             MPTEST.QUEUE_ID( 1 ),
0533             MPTEST.BUFFERS( INDEX ),
0534             4,
0535             STATUS
0536          );
0537          TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "MESSAGE_QUEUE_SEND" );
0538 
0539          OVERFLOW_COUNT := MPTEST.BUFFER_AREAS( INDEX ).FIELD1'ACCESS;
0540                 
0541          BUFFER_COUNT := MPTEST.BUFFER_AREAS( INDEX ).FIELD2'ACCESS;
0542                 
0543       else
0544 
0545          OVERFLOW_COUNT := MPTEST.BUFFER_AREAS( INDEX ).FIELD3'ACCESS;
0546                 
0547          BUFFER_COUNT := MPTEST.BUFFER_AREAS( INDEX ).FIELD4'ACCESS;
0548 
0549       end if;
0550 
0551       loop
0552 
0553          exit when MPTEST.STOP_TEST;
0554 
0555          YIELD_COUNT := 100;
0556 
0557          for COUNT in 1 .. MPTEST.MESSAGE_DOT_COUNT
0558          loop
0559 
0560            exit when MPTEST.STOP_TEST;
0561 
0562             RTEMS.MESSAGE_QUEUE.RECEIVE(
0563                MPTEST.QUEUE_ID( 1 ),
0564                MPTEST.BUFFERS( INDEX ),
0565                RTEMS.DEFAULT_OPTIONS,
0566                RTEMS.NO_TIMEOUT,
0567                MESSAGE_SIZE,
0568                STATUS
0569             );
0570             TEST_SUPPORT.DIRECTIVE_FAILED( 
0571                STATUS, 
0572                "MESSAGE_QUEUE_RECEIVE" 
0573             );
0574 
0575             if BUFFER_COUNT.ALL = RTEMS.UNSIGNED32'LAST then
0576                BUFFER_COUNT.ALL   := 0;
0577                OVERFLOW_COUNT.ALL := OVERFLOW_COUNT.ALL + 1;
0578             else
0579                BUFFER_COUNT.ALL := BUFFER_COUNT.ALL + 1;
0580             end if;
0581 
0582             RTEMS.MESSAGE_QUEUE.SEND(
0583                MPTEST.QUEUE_ID( 1 ),
0584                MPTEST.BUFFERS( INDEX ),
0585                4,
0586                STATUS
0587             );
0588             TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "MESSAGE_QUEUE_SEND" );
0589 
0590             if MPTEST.STOP_TEST = FALSE then
0591                if TEST_SUPPORT.NODE = 1 then
0592 
0593                   YIELD_COUNT := YIELD_COUNT - 1;
0594 
0595                   if YIELD_COUNT = 0 then
0596 
0597                      RTEMS.TASKS.WAKE_AFTER( RTEMS.YIELD_PROCESSOR, STATUS );
0598                      TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "YIELD" );
0599 
0600                      YIELD_COUNT := 100;
0601 
0602                   end if;
0603 
0604                end if;
0605 
0606             end if;
0607          
0608          end loop;
0609 
0610          TEST_SUPPORT.PUT_DOT( "m" );
0611 
0612       end loop;
0613 
0614       MPTEST.EXIT_TEST;
0615 
0616    end MESSAGE_QUEUE_TASK;
0617  
0618 -- 
0619 --  PARTITION_TASK 
0620 --
0621 --  DESCRIPTION: 
0622 -- 
0623 --  This is one of the test tasks. 
0624 -- 
0625   
0626    procedure PARTITION_TASK (  
0627       IGNORED : in     RTEMS.TASKS.ARGUMENT 
0628    ) is
0629       BUFFER : RTEMS.ADDRESS;
0630       STATUS : RTEMS.STATUS_CODES;
0631    begin
0632 
0633       TEXT_IO.PUT_LINE( "Getting ID of partition" );
0634  
0635       loop
0636 
0637          RTEMS.PARTITION.IDENT(
0638             MPTEST.PARTITION_NAME( 1 ),
0639             RTEMS.SEARCH_ALL_NODES,
0640             MPTEST.PARTITION_ID( 1 ),
0641             STATUS
0642          );
0643          exit when RTEMS.IS_STATUS_SUCCESSFUL( STATUS );
0644 
0645          TEXT_IO.PUT_LINE( "partition_ident FAILED!!" );
0646 
0647       end loop;
0648 
0649       loop
0650 
0651          exit when MPTEST.STOP_TEST;
0652 
0653          for COUNT in 1 .. MPTEST.PARTITION_DOT_COUNT
0654          loop
0655 
0656             exit when MPTEST.STOP_TEST;
0657 
0658             RTEMS.PARTITION.GET_BUFFER(
0659                MPTEST.PARTITION_ID( 1 ),
0660                BUFFER,
0661                STATUS
0662             );
0663             TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "PARTITION_GET_BUFFER" );
0664 
0665             RTEMS.PARTITION.RETURN_BUFFER(
0666                MPTEST.PARTITION_ID( 1 ),
0667                BUFFER,
0668                STATUS
0669             );
0670             TEST_SUPPORT.DIRECTIVE_FAILED( 
0671                STATUS, 
0672                "PARTITION_RETURN_BUFFER" 
0673             );
0674 
0675             if TEST_SUPPORT.NODE = 1 then
0676 
0677                RTEMS.TASKS.WAKE_AFTER( RTEMS.YIELD_PROCESSOR, STATUS );
0678                TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "YIELD" );
0679 
0680             end if;
0681 
0682          end loop;
0683 
0684          TEST_SUPPORT.PUT_DOT( "p" );
0685 
0686       end loop;
0687 
0688       MPTEST.EXIT_TEST;
0689 
0690    end PARTITION_TASK; 
0691  
0692 -- 
0693 --  SEMAPHORE_TASK 
0694 -- 
0695 --  DESCRIPTION: 
0696 -- 
0697 --  This is one of the test tasks. 
0698 -- 
0699   
0700    procedure SEMAPHORE_TASK (  
0701       ARGUMENT : in     RTEMS.TASKS.ARGUMENT 
0702    ) is
0703       pragma Unreferenced(ARGUMENT);
0704       YIELD_COUNT    : RTEMS.UNSIGNED32;
0705       STATUS         : RTEMS.STATUS_CODES;
0706    begin
0707 
0708       TEXT_IO.PUT_LINE( "Getting ID of semaphore" );
0709 
0710       loop
0711 
0712          RTEMS.SEMAPHORE.IDENT(
0713             MPTEST.SEMAPHORE_NAME( 1 ),
0714             RTEMS.SEARCH_ALL_NODES,
0715             MPTEST.SEMAPHORE_ID( 1 ),
0716             STATUS
0717          );
0718          exit when RTEMS.IS_STATUS_SUCCESSFUL( STATUS );
0719 
0720          TEXT_IO.PUT_LINE( "semaphore_ident FAILED!!" );
0721 
0722       end loop;
0723 
0724       loop
0725 
0726          YIELD_COUNT := 100;
0727 
0728          exit when MPTEST.STOP_TEST;
0729 
0730          for COUNT in 1 .. MPTEST.SEMAPHORE_DOT_COUNT
0731          loop
0732 
0733             exit when MPTEST.STOP_TEST;
0734 
0735             RTEMS.SEMAPHORE.OBTAIN(
0736                MPTEST.SEMAPHORE_ID( 1 ),
0737                RTEMS.DEFAULT_OPTIONS,
0738                RTEMS.NO_TIMEOUT,
0739                STATUS
0740             );
0741             TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "SEMAPHORE_OBTAIN" );
0742 
0743             RTEMS.SEMAPHORE.RELEASE( MPTEST.SEMAPHORE_ID( 1 ), STATUS );
0744             TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "SEMAPHORE_RELEASE" );
0745 
0746             if TEST_SUPPORT.NODE = 1 then
0747 
0748                YIELD_COUNT := YIELD_COUNT - 1;
0749 
0750                if YIELD_COUNT = 0 then
0751 
0752                   RTEMS.TASKS.WAKE_AFTER( RTEMS.YIELD_PROCESSOR, STATUS );
0753                   TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "YIELD" );
0754 
0755                   YIELD_COUNT := 100;
0756 
0757                end if;
0758 
0759             end if;
0760          
0761          end loop;
0762 
0763          TEST_SUPPORT.PUT_DOT( "s" );
0764 
0765       end loop;
0766 
0767       MPTEST.EXIT_TEST;
0768 
0769    end SEMAPHORE_TASK; 
0770  
0771 end MPTEST;