summaryrefslogtreecommitdiffstats
path: root/testsuites/ada/mptests/mp14/mptest.adb
diff options
context:
space:
mode:
Diffstat (limited to 'testsuites/ada/mptests/mp14/mptest.adb')
-rw-r--r--testsuites/ada/mptests/mp14/mptest.adb766
1 files changed, 766 insertions, 0 deletions
diff --git a/testsuites/ada/mptests/mp14/mptest.adb b/testsuites/ada/mptests/mp14/mptest.adb
new file mode 100644
index 0000000000..c795dc28bd
--- /dev/null
+++ b/testsuites/ada/mptests/mp14/mptest.adb
@@ -0,0 +1,766 @@
+--
+-- MPTEST / BODY
+--
+-- DESCRIPTION:
+--
+-- This package is the implementation for Test 14 of the RTEMS
+-- Multiprocessor Test Suite.
+--
+-- DEPENDENCIES:
+--
+--
+--
+-- COPYRIGHT (c) 1989-2011.
+-- On-Line Applications Research Corporation (OAR).
+--
+-- The license and distribution terms for this file may in
+-- the file LICENSE in this distribution or at
+-- http://www.rtems.org/license/LICENSE.
+--
+
+with INTERFACES; use INTERFACES;
+with INTERFACES.C;
+with RTEMS;
+with RTEMS.EVENT;
+with RTEMS.MESSAGE_QUEUE;
+with RTEMS.PARTITION;
+with RTEMS.SEMAPHORE;
+with RTEMS.TASKS;
+with RTEMS.TIMER;
+with TEST_SUPPORT;
+with TEXT_IO;
+with UNSIGNED32_IO;
+
+with System.Storage_Elements; use System.Storage_Elements;
+
+package body MPTEST is
+
+--
+-- STOP_TEST_TSR
+--
+
+ procedure STOP_TEST_TSR (
+ IGNORED_ID : in RTEMS.ID;
+ IGNORED_ADDRESS : in RTEMS.ADDRESS
+ ) is
+ begin
+
+ MPTEST.STOP_TEST := TRUE;
+
+ end STOP_TEST_TSR;
+
+--
+-- EXIT_TEST
+--
+
+ procedure EXIT_TEST is
+ OLD_MODE : RTEMS.MODE;
+ STATUS : RTEMS.STATUS_CODES;
+ procedure BSP_MPCI_PRINT_STATISTICS;
+ pragma Import (C, BSP_MPCI_PRINT_STATISTICS, "MPCI_Print_statistics" );
+ begin
+
+ RTEMS.TASKS.MODE(RTEMS.NO_PREEMPT, RTEMS.PREEMPT_MASK, OLD_MODE, STATUS);
+ TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "TASK_MODE" );
+
+ BSP_MPCI_PRINT_STATISTICS;
+
+ RTEMS.SHUTDOWN_EXECUTIVE( 0 );
+
+ end EXIT_TEST;
+
+--
+-- INIT
+--
+
+ procedure INIT (
+ ARGUMENT : in RTEMS.TASKS.ARGUMENT
+ ) is
+ INDEX : RTEMS.UNSIGNED32;
+ STATUS : RTEMS.STATUS_CODES;
+ PREVIOUS_PRIORITY : RTEMS.TASKS.PRIORITY;
+ begin
+
+ TEXT_IO.NEW_LINE( 2 );
+ TEXT_IO.PUT( "*** TEST 14 -- NODE " );
+ UNSIGNED32_IO.PUT(
+ TEST_SUPPORT.NODE,
+ WIDTH => 1
+ );
+ TEXT_IO.PUT_LINE( " ***" );
+
+ MPTEST.STOP_TIMER_NAME := RTEMS.BUILD_NAME( 'S', 'T', 'O', 'P' );
+
+ MPTEST.STOP_TEST := FALSE;
+
+ RTEMS.TIMER.CREATE(
+ MPTEST.STOP_TIMER_NAME,
+ MPTEST.STOP_TIMER_ID,
+ STATUS
+ );
+ TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "TIMER_CREATE" );
+
+ RTEMS.TIMER.FIRE_AFTER(
+ MPTEST.STOP_TIMER_ID,
+ TEST_SUPPORT.MAXIMUM_LONG_TEST_DURATION *
+ TEST_SUPPORT.TICKS_PER_SECOND,
+ MPTEST.STOP_TEST_TSR'ACCESS,
+ RTEMS.NULL_ADDRESS,
+ STATUS
+ );
+ TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "TIMER_FIRE_AFTER" );
+
+ MPTEST.EVENT_TASK_NAME( 1 ) := RTEMS.BUILD_NAME( '1', '1', '1', ' ' );
+ MPTEST.EVENT_TASK_NAME( 2 ) := RTEMS.BUILD_NAME( '2', '2', '2', ' ' );
+
+ MPTEST.QUEUE_TASK_NAME( 1 ) := RTEMS.BUILD_NAME( 'M', 'T', '1', ' ' );
+ MPTEST.QUEUE_TASK_NAME( 2 ) := RTEMS.BUILD_NAME( 'M', 'T', '2', ' ' );
+
+ MPTEST.PARTITION_TASK_NAME( 1 ) :=
+ RTEMS.BUILD_NAME( 'P', 'T', '1', ' ' );
+ MPTEST.PARTITION_TASK_NAME( 2 ) :=
+ RTEMS.BUILD_NAME( 'P', 'T', '2', ' ' );
+
+ MPTEST.SEMAPHORE_TASK_NAME( 1 ) :=
+ RTEMS.BUILD_NAME( 'S', 'M', '1', ' ' );
+ MPTEST.SEMAPHORE_TASK_NAME( 2 ) :=
+ RTEMS.BUILD_NAME( 'S', 'M', '2', ' ' );
+
+ MPTEST.SEMAPHORE_NAME( 1 ) := RTEMS.BUILD_NAME( 'S', 'E', 'M', ' ' );
+
+ MPTEST.QUEUE_NAME( 1 ) := RTEMS.BUILD_NAME( 'M', 'S', 'G', ' ' );
+
+ MPTEST.PARTITION_NAME( 1 ) := RTEMS.BUILD_NAME( 'P', 'A', 'R', ' ' );
+
+ MPTEST.TIMER_NAME( 1 ) := RTEMS.BUILD_NAME( 'T', 'M', 'R', ' ' );
+
+ for INDEX in MPTEST.BUFFERS'FIRST .. MPTEST.BUFFERS'LAST
+ loop
+
+ MPTEST.BUFFERS( INDEX ) :=
+ MPTEST.BUFFER_AREAS( INDEX )'ADDRESS;
+
+ end loop;
+
+ if TEST_SUPPORT.NODE = 1 then
+
+ TEXT_IO.PUT_LINE( "Creating Semaphore (Global)" );
+ RTEMS.SEMAPHORE.CREATE(
+ MPTEST.SEMAPHORE_NAME( 1 ),
+ 1,
+ RTEMS.GLOBAL,
+ MPTEST.SEMAPHORE_ID( 1 ),
+ STATUS
+ );
+ TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "SEMAPHORE_CREATE" );
+
+ TEXT_IO.PUT_LINE( "Creating Message Queue (Global)" );
+ RTEMS.MESSAGE_QUEUE.CREATE(
+ MPTEST.QUEUE_NAME( 1 ),
+ 1,
+ RTEMS.GLOBAL,
+ MPTEST.QUEUE_ID( 1 ),
+ STATUS
+ );
+ TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "MESSAGE_QUEUE_CREATE" );
+
+ TEXT_IO.PUT_LINE( "Creating Partition (Global)" );
+ RTEMS.PARTITION.CREATE(
+ MPTEST.PARTITION_NAME( 1 ),
+ MPTEST.PARTITION_AREA( 0 )'ADDRESS,
+ 16#8000#,
+ 16#3000#,
+ RTEMS.GLOBAL,
+ MPTEST.PARTITION_ID( 1 ),
+ STATUS
+ );
+ TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "PARTITION_CREATE" );
+
+ end if;
+
+ TEXT_IO.PUT_LINE( "Creating Event task (Global)" );
+ RTEMS.TASKS.CREATE(
+ MPTEST.EVENT_TASK_NAME(
+ TEST_SUPPORT.NODE
+ ),
+ 2,
+ 2048,
+ RTEMS.TIMESLICE,
+ RTEMS.GLOBAL,
+ MPTEST.EVENT_TASK_ID( 1 ),
+ STATUS
+ );
+ TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "TASK_CREATE" );
+
+ TEXT_IO.PUT_LINE( "Starting Event task (Global)" );
+ RTEMS.TASKS.START(
+ MPTEST.EVENT_TASK_ID( 1 ),
+ MPTEST.TEST_TASK'ACCESS,
+ 0,
+ STATUS
+ );
+ TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "TASK_START" );
+
+ TEXT_IO.PUT_LINE( "Creating Semaphore task (Global)" );
+ RTEMS.TASKS.CREATE(
+ MPTEST.SEMAPHORE_TASK_NAME(
+ TEST_SUPPORT.NODE
+ ),
+ 2,
+ 2048,
+ RTEMS.TIMESLICE,
+ RTEMS.GLOBAL,
+ MPTEST.SEMAPHORE_TASK_ID( 1 ),
+ STATUS
+ );
+ TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "TASK_CREATE" );
+
+ TEXT_IO.PUT_LINE( "Starting Semaphore task (Global)" );
+ RTEMS.TASKS.START(
+ MPTEST.SEMAPHORE_TASK_ID( 1 ),
+ MPTEST.SEMAPHORE_TASK'ACCESS,
+ 0,
+ STATUS
+ );
+ TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "TASK_START" );
+
+ TEXT_IO.PUT_LINE( "Creating Message Queue task (Global)" );
+ RTEMS.TASKS.CREATE(
+ MPTEST.QUEUE_TASK_NAME(
+ TEST_SUPPORT.NODE
+ ),
+ 2,
+ 2048,
+ RTEMS.TIMESLICE,
+ RTEMS.GLOBAL,
+ MPTEST.QUEUE_TASK_ID( 1 ),
+ STATUS
+ );
+ TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "TASK_CREATE" );
+
+ TEXT_IO.PUT_LINE( "Starting Message Queue task (Global)" );
+ RTEMS.TASKS.START(
+ MPTEST.QUEUE_TASK_ID( 1 ),
+ MPTEST.MESSAGE_QUEUE_TASK'ACCESS,
+ 1, -- index of buffer
+ STATUS
+ );
+ TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "TASK_START" );
+
+ TEXT_IO.PUT_LINE( "Creating Partition task (Global)" );
+ RTEMS.TASKS.CREATE(
+ MPTEST.PARTITION_TASK_NAME(
+ TEST_SUPPORT.NODE
+ ),
+ 2,
+ 2048,
+ RTEMS.TIMESLICE,
+ RTEMS.GLOBAL,
+ MPTEST.PARTITION_TASK_ID( 1 ),
+ STATUS
+ );
+ TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "TASK_CREATE" );
+
+ TEXT_IO.PUT_LINE( "Starting Partition task (Global)" );
+ RTEMS.TASKS.START(
+ MPTEST.PARTITION_TASK_ID( 1 ),
+ MPTEST.PARTITION_TASK'ACCESS,
+ 0,
+ STATUS
+ );
+ TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "TASK_START" );
+
+ RTEMS.TASKS.SET_PRIORITY( RTEMS.SELF, 2, PREVIOUS_PRIORITY, STATUS );
+ TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "TASK_SET_PRIORITY" );
+
+ MPTEST.DELAYED_EVENTS_TASK( 1 );
+
+ end INIT;
+
+--
+-- DELAYED_SEND_EVENT
+--
+-- DESCRIPTION:
+--
+-- This subprogram is a timer service routine which sends an
+-- event set to a waiting task.
+--
+
+ procedure DELAYED_SEND_EVENT (
+ TIMER_ID : in RTEMS.ID;
+ IGNORED_ADDRESS : in RTEMS.ADDRESS
+ ) is
+ STATUS : RTEMS.STATUS_CODES;
+ begin
+
+ RTEMS.EVENT.SEND(
+ MPTEST.TASK_ID( RTEMS.GET_INDEX( TIMER_ID ) ),
+ RTEMS.EVENT_16,
+ STATUS
+ );
+ TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "EVENT_SEND" );
+
+ end DELAYED_SEND_EVENT;
+
+--
+-- TEST_TASK
+--
+-- DESCRIPTION:
+--
+-- This is one of the test tasks.
+--
+
+ procedure TEST_TASK (
+ ARGUMENT : in RTEMS.TASKS.ARGUMENT
+ ) is
+ REMOTE_NODE : RTEMS.UNSIGNED32;
+ REMOTE_TID : RTEMS.ID;
+ COUNT : RTEMS.UNSIGNED32;
+ EVENT_OUT : RTEMS.EVENT_SET;
+ STATUS : RTEMS.STATUS_CODES;
+ begin
+
+ if TEST_SUPPORT.NODE = 1 then
+ REMOTE_NODE := 2;
+ else
+ REMOTE_NODE := 1;
+ end if;
+
+ TEXT_IO.PUT_LINE( "About to go to sleep!" );
+ RTEMS.TASKS.WAKE_AFTER( 1 * TEST_SUPPORT.TICKS_PER_SECOND, STATUS );
+ TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "TASK_WAKE_AFTER" );
+ TEXT_IO.PUT_LINE( "Waking up!" );
+
+ TEXT_IO.PUT( "Remote task's name is : " );
+ TEST_SUPPORT.PUT_NAME( MPTEST.EVENT_TASK_NAME( REMOTE_NODE ), TRUE );
+
+ TEXT_IO.PUT_LINE( "Getting TID of remote task" );
+
+ loop
+
+ RTEMS.TASKS.IDENT(
+ MPTEST.EVENT_TASK_NAME( REMOTE_NODE ),
+ RTEMS.SEARCH_ALL_NODES,
+ REMOTE_TID,
+ STATUS
+ );
+
+ exit when RTEMS.IS_STATUS_SUCCESSFUL( STATUS );
+
+ TEXT_IO.PUT_LINE( "task_ident" );
+
+ end loop;
+
+ if TEST_SUPPORT.NODE = 1 then
+ TEXT_IO.PUT_LINE( "Sending events to remote task" );
+
+ loop
+ exit when MPTEST.STOP_TEST = TRUE;
+
+ for COUNT in 1 .. MPTEST.EVENT_TASK_DOT_COUNT
+ loop
+ RTEMS.EVENT.SEND(
+ REMOTE_TID,
+ RTEMS.EVENT_16,
+ STATUS
+ );
+ TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "EVENT_SEND" );
+
+ exit when MPTEST.STOP_TEST = TRUE;
+
+ end loop;
+
+ TEST_SUPPORT.PUT_DOT( "e" );
+
+ end loop;
+
+ end if;
+
+ TEXT_IO.PUT_LINE( "Receiving events from remote task" );
+
+ loop
+ exit when MPTEST.STOP_TEST = TRUE;
+
+ for COUNT in 1 .. MPTEST.EVENT_TASK_DOT_COUNT
+ loop
+ exit when MPTEST.STOP_TEST = TRUE;
+
+ RTEMS.EVENT.RECEIVE(
+ RTEMS.EVENT_16,
+ RTEMS.DEFAULT_OPTIONS,
+ RTEMS.NO_TIMEOUT,
+ EVENT_OUT,
+ STATUS
+ );
+ TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "EVENT_RECEIVE" );
+
+ end loop;
+
+ TEST_SUPPORT.PUT_DOT( "e" );
+
+ end loop;
+
+ MPTEST.EXIT_TEST;
+
+ end TEST_TASK;
+
+--
+-- DELAYED_EVENTS_TASK
+--
+-- DESCRIPTION:
+--
+-- This is one of the test tasks.
+--
+
+ procedure DELAYED_EVENTS_TASK (
+ ARGUMENT : in RTEMS.TASKS.ARGUMENT
+ ) is
+ COUNT : RTEMS.UNSIGNED32;
+ PREVIOUS_MODE : RTEMS.MODE;
+ EVENTS_OUT : RTEMS.EVENT_SET;
+ STATUS : RTEMS.STATUS_CODES;
+ begin
+
+ RTEMS.TASKS.MODE(
+ RTEMS.PREEMPT + RTEMS.TIMESLICE,
+ RTEMS.PREEMPT_MASK + RTEMS.TIMESLICE_MASK,
+ PREVIOUS_MODE,
+ STATUS
+ );
+ TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "TASK_MODE" );
+
+ RTEMS.TIMER.CREATE(
+ MPTEST.TIMER_NAME( 1 ),
+ MPTEST.TIMER_ID( 1 ),
+ STATUS
+ );
+ TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "TIMER_CREATE" );
+
+ RTEMS.TASKS.IDENT(
+ RTEMS.SELF,
+ RTEMS.SEARCH_ALL_NODES,
+ MPTEST.TASK_ID( RTEMS.GET_INDEX( MPTEST.TIMER_ID( 1 ) ) ),
+ STATUS
+ );
+ TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "TASK_IDENTS" );
+
+ loop
+
+ for COUNT in 1 .. MPTEST.DELAYED_EVENT_DOT_COUNT
+ loop
+ RTEMS.TIMER.FIRE_AFTER(
+ MPTEST.TIMER_ID( 1 ),
+ 1,
+ MPTEST.DELAYED_SEND_EVENT'ACCESS,
+ RTEMS.NULL_ADDRESS,
+ STATUS
+ );
+ TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "TIMER_FIRE_AFTER" );
+
+ RTEMS.EVENT.RECEIVE(
+ RTEMS.EVENT_16,
+ RTEMS.DEFAULT_OPTIONS,
+ RTEMS.NO_TIMEOUT,
+ EVENTS_OUT,
+ STATUS
+ );
+ TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "EVENT_RECEIVE" );
+
+ end loop;
+
+ TEST_SUPPORT.PUT_DOT( "." );
+
+ end loop;
+
+ MPTEST.EXIT_TEST;
+
+ end DELAYED_EVENTS_TASK;
+
+--
+-- MESSAGE_QUEUE_TASK
+--
+-- DESCRIPTION:
+--
+-- This is one of the test tasks.
+--
+
+ procedure MESSAGE_QUEUE_TASK (
+ INDEX : in RTEMS.TASKS.ARGUMENT
+ ) is
+ COUNT : RTEMS.UNSIGNED32;
+ YIELD_COUNT : RTEMS.UNSIGNED32;
+ OVERFLOW_COUNT : RTEMS.UNSIGNED32_POINTER;
+ BUFFER_COUNT : RTEMS.UNSIGNED32_POINTER;
+ STATUS : RTEMS.STATUS_CODES;
+ begin
+
+ MPTEST.BUFFERS( INDEX ).FIELD1 := 0;
+ MPTEST.BUFFERS( INDEX ).FIELD2 := 0;
+ MPTEST.BUFFERS( INDEX ).FIELD3 := 0;
+ MPTEST.BUFFERS( INDEX ).FIELD4 := 0;
+
+ TEXT_IO.PUT_LINE( "Getting ID of message queue" );
+
+ loop
+
+ RTEMS.MESSAGE_QUEUE.IDENT(
+ MPTEST.QUEUE_NAME( 1 ),
+ RTEMS.SEARCH_ALL_NODES,
+ MPTEST.QUEUE_ID( 1 ),
+ STATUS
+ );
+ exit when RTEMS.IS_STATUS_SUCCESSFUL( STATUS );
+
+ TEXT_IO.PUT_LINE( "message_queue_ident FAILED!!" );
+
+ end loop;
+
+ if TEST_SUPPORT.NODE = 1 then
+
+ RTEMS.MESSAGE_QUEUE.SEND(
+ MPTEST.QUEUE_ID( 1 ),
+ MPTEST.BUFFERS( INDEX ),
+ STATUS
+ );
+ TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "MESSAGE_QUEUE_SEND" );
+
+ OVERFLOW_COUNT := RTEMS.TO_UNSIGNED32_POINTER(
+ MPTEST.BUFFERS( INDEX ).FIELD1'ADDRESS
+ );
+
+ BUFFER_COUNT := RTEMS.TO_UNSIGNED32_POINTER(
+ MPTEST.BUFFERS( INDEX ).FIELD2'ADDRESS
+ );
+
+ else
+
+ OVERFLOW_COUNT := RTEMS.TO_UNSIGNED32_POINTER(
+ MPTEST.BUFFERS( INDEX ).FIELD3'ADDRESS
+ );
+
+ BUFFER_COUNT := RTEMS.TO_UNSIGNED32_POINTER(
+ MPTEST.BUFFERS( INDEX ).FIELD4'ADDRESS
+ );
+
+ end if;
+
+ loop
+
+ exit when MPTEST.STOP_TEST = TRUE;
+
+ YIELD_COUNT := 100;
+
+ for COUNT in 1 .. MPTEST.MESSAGE_DOT_COUNT
+ loop
+
+ exit when MPTEST.STOP_TEST = TRUE;
+
+ RTEMS.MESSAGE_QUEUE.RECEIVE(
+ MPTEST.QUEUE_ID( 1 ),
+ MPTEST.BUFFERS( INDEX ),
+ RTEMS.DEFAULT_OPTIONS,
+ RTEMS.NO_TIMEOUT,
+ STATUS
+ );
+ TEST_SUPPORT.DIRECTIVE_FAILED(
+ STATUS,
+ "MESSAGE_QUEUE_RECEIVE"
+ );
+
+ if BUFFER_COUNT.ALL = RTEMS.UNSIGNED32'LAST then
+ BUFFER_COUNT.ALL := 0;
+ OVERFLOW_COUNT.ALL := OVERFLOW_COUNT.ALL + 1;
+ else
+ BUFFER_COUNT.ALL := BUFFER_COUNT.ALL + 1;
+ end if;
+
+ RTEMS.MESSAGE_QUEUE.SEND(
+ MPTEST.QUEUE_ID( 1 ),
+ MPTEST.BUFFERS( INDEX ),
+ STATUS
+ );
+ TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "MESSAGE_QUEUE_SEND" );
+
+ if MPTEST.STOP_TEST = FALSE then
+ if TEST_SUPPORT.NODE = 1 then
+
+ YIELD_COUNT := YIELD_COUNT - 1;
+
+ if YIELD_COUNT = 0 then
+
+ RTEMS.TASKS.WAKE_AFTER( RTEMS.YIELD_PROCESSOR, STATUS );
+ TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "YIELD" );
+
+ YIELD_COUNT := 100;
+
+ end if;
+
+ end if;
+
+ end if;
+
+ end loop;
+
+ TEST_SUPPORT.PUT_DOT( "m" );
+
+ end loop;
+
+ MPTEST.EXIT_TEST;
+
+ end MESSAGE_QUEUE_TASK;
+
+--
+-- PARTITION_TASK
+--
+-- DESCRIPTION:
+--
+-- This is one of the test tasks.
+--
+
+ procedure PARTITION_TASK (
+ IGNORED : in RTEMS.TASKS.ARGUMENT
+ ) is
+ COUNT : RTEMS.UNSIGNED32;
+ BUFFER : RTEMS.ADDRESS;
+ STATUS : RTEMS.STATUS_CODES;
+ begin
+
+ TEXT_IO.PUT_LINE( "Getting ID of partition" );
+
+ loop
+
+ RTEMS.PARTITION.IDENT(
+ MPTEST.PARTITION_NAME( 1 ),
+ RTEMS.SEARCH_ALL_NODES,
+ MPTEST.PARTITION_ID( 1 ),
+ STATUS
+ );
+ exit when RTEMS.IS_STATUS_SUCCESSFUL( STATUS );
+
+ TEXT_IO.PUT_LINE( "partition_ident FAILED!!" );
+
+ end loop;
+
+ loop
+
+ exit when MPTEST.STOP_TEST = TRUE;
+
+ for COUNT in 1 .. MPTEST.PARTITION_DOT_COUNT
+ loop
+
+ exit when MPTEST.STOP_TEST = TRUE;
+
+ RTEMS.PARTITION.GET_BUFFER(
+ MPTEST.PARTITION_ID( 1 ),
+ BUFFER,
+ STATUS
+ );
+ TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "PARTITION_GET_BUFFER" );
+
+ RTEMS.PARTITION.RETURN_BUFFER(
+ MPTEST.PARTITION_ID( 1 ),
+ BUFFER,
+ STATUS
+ );
+ TEST_SUPPORT.DIRECTIVE_FAILED(
+ STATUS,
+ "PARTITION_RETURN_BUFFER"
+ );
+
+ if TEST_SUPPORT.NODE = 1 then
+
+ RTEMS.TASKS.WAKE_AFTER( RTEMS.YIELD_PROCESSOR, STATUS );
+ TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "YIELD" );
+
+ end if;
+
+ end loop;
+
+ TEST_SUPPORT.PUT_DOT( "p" );
+
+ end loop;
+
+ MPTEST.EXIT_TEST;
+
+ end PARTITION_TASK;
+
+--
+-- SEMAPHORE_TASK
+--
+-- DESCRIPTION:
+--
+-- This is one of the test tasks.
+--
+
+ procedure SEMAPHORE_TASK (
+ ARGUMENT : in RTEMS.TASKS.ARGUMENT
+ ) is
+ COUNT : RTEMS.UNSIGNED32;
+ YIELD_COUNT : RTEMS.UNSIGNED32;
+ STATUS : RTEMS.STATUS_CODES;
+ begin
+
+ TEXT_IO.PUT_LINE( "Getting ID of semaphore" );
+
+ loop
+
+ RTEMS.SEMAPHORE.IDENT(
+ MPTEST.SEMAPHORE_NAME( 1 ),
+ RTEMS.SEARCH_ALL_NODES,
+ MPTEST.SEMAPHORE_ID( 1 ),
+ STATUS
+ );
+ exit when RTEMS.IS_STATUS_SUCCESSFUL( STATUS );
+
+ TEXT_IO.PUT_LINE( "semaphore_ident FAILED!!" );
+
+ end loop;
+
+ loop
+
+ YIELD_COUNT := 100;
+
+ exit when MPTEST.STOP_TEST = TRUE;
+
+ for COUNT in 1 .. MPTEST.SEMAPHORE_DOT_COUNT
+ loop
+
+ exit when MPTEST.STOP_TEST = TRUE;
+
+ RTEMS.SEMAPHORE.OBTAIN(
+ MPTEST.SEMAPHORE_ID( 1 ),
+ RTEMS.DEFAULT_OPTIONS,
+ RTEMS.NO_TIMEOUT,
+ STATUS
+ );
+ TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "SEMAPHORE_OBTAIN" );
+
+ RTEMS.SEMAPHORE.RELEASE( MPTEST.SEMAPHORE_ID( 1 ), STATUS );
+ TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "SEMAPHORE_RELEASE" );
+
+ if TEST_SUPPORT.NODE = 1 then
+
+ YIELD_COUNT := YIELD_COUNT - 1;
+
+ if YIELD_COUNT = 0 then
+
+ RTEMS.TASKS.WAKE_AFTER( RTEMS.YIELD_PROCESSOR, STATUS );
+ TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "YIELD" );
+
+ YIELD_COUNT := 100;
+
+ end if;
+
+ end if;
+
+ end loop;
+
+ TEST_SUPPORT.PUT_DOT( "s" );
+
+ end loop;
+
+ MPTEST.EXIT_TEST;
+
+ end SEMAPHORE_TASK;
+
+end MPTEST;