source: rtems/c/src/ada-tests/mptests/mp02/mptest.adb @ 8fbe2e6

4.115
Last change on this file since 8fbe2e6 was c499856, checked in by Chris Johns <chrisj@…>, on 03/20/14 at 21:10:47

Change all references of rtems.com to rtems.org.

  • Property mode set to 100644
File size: 5.2 KB
Line 
1--
2--  MPTEST / BODY
3--
4--  DESCRIPTION:
5--
6--  This package is the implementation for Test 2 of the RTEMS
7--  Multiprocessor Test Suite.
8--
9--  DEPENDENCIES:
10--
11-- 
12--
13--  COPYRIGHT (c) 1989-2011.
14--  On-Line Applications Research Corporation (OAR).
15--
16--  The license and distribution terms for this file may in
17--  the file LICENSE in this distribution or at
18--  http://www.rtems.org/license/LICENSE.
19--
20
21with INTERFACES; use INTERFACES;
22with RTEMS;
23with RTEMS.TASKS;
24with TEST_SUPPORT;
25with TEXT_IO;
26with UNSIGNED32_IO;
27
28package body MPTEST is
29
30--
31--  INIT
32--
33
34   procedure INIT (
35      ARGUMENT : in     RTEMS.TASKS.ARGUMENT
36   ) is
37      STATUS : RTEMS.STATUS_CODES;
38   begin
39
40      TEXT_IO.NEW_LINE( 2 );
41      TEXT_IO.PUT( "*** TEST 2 -- NODE " );
42      UNSIGNED32_IO.PUT(
43         TEST_SUPPORT.NODE,
44         WIDTH => 1
45      );
46      TEXT_IO.PUT_LINE( " ***" );
47
48      MPTEST.TASK_NAME( 1 ) := RTEMS.BUILD_NAME(  '1', '1', '1', ' ' );
49      MPTEST.TASK_NAME( 2 ) := RTEMS.BUILD_NAME(  '2', '2', '2', ' ' );
50
51      TEXT_IO.PUT_LINE( "Creating test task (Global)" );
52
53      RTEMS.TASKS.CREATE(
54         MPTEST.TASK_NAME( TEST_SUPPORT.NODE ),
55         1,
56         2048,
57         RTEMS.NO_PREEMPT,
58         RTEMS.GLOBAL,
59         MPTEST.TASK_ID( 1 ),
60         STATUS
61      );
62      TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "TASK_CREATE" );
63
64      RTEMS.TASKS.START(
65         MPTEST.TASK_ID( 1 ),
66         MPTEST.TEST_TASK'ACCESS,
67         0,
68         STATUS
69      );
70      TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "TASK_START" );
71
72      RTEMS.TASKS.DELETE( RTEMS.SELF, STATUS );
73      TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "TASK_DELETE OF SELF" );
74
75   end INIT;
76
77--
78--  TEST_TASK
79--
80
81   procedure TEST_TASK (
82      ARGUMENT : in     RTEMS.TASKS.ARGUMENT
83   ) is
84      TID         : RTEMS.ID;
85      TEST_TID    : RTEMS.ID;
86      REMOTE_TID  : RTEMS.ID;
87      REMOTE_NODE : RTEMS.UNSIGNED32;
88      NOTE        : RTEMS.UNSIGNED32;
89      STATUS      : RTEMS.STATUS_CODES;
90   begin
91
92      RTEMS.TASKS.IDENT( RTEMS.SELF, RTEMS.SEARCH_ALL_NODES, TID, STATUS );
93      TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "TASK_IDENT OF SELF" );
94   
95      if TEST_SUPPORT.NODE = 1 then
96         REMOTE_NODE := 2;
97      else
98         REMOTE_NODE := 1;
99      end if;
100   
101      TEXT_IO.PUT_LINE( "Getting TID of remote task (all nodes)" );
102
103      loop
104
105         RTEMS.TASKS.IDENT(
106            MPTEST.TASK_NAME( REMOTE_NODE ),
107            RTEMS.SEARCH_ALL_NODES,
108            REMOTE_TID,
109            STATUS
110         );
111
112         exit when RTEMS.IS_STATUS_SUCCESSFUL( STATUS );
113
114      end loop;
115
116      --
117      --  We just got this ID above so looping is not necessary.
118      --
119
120      TEXT_IO.PUT_LINE( "Getting TID of remote task (1 node)" );
121      RTEMS.TASKS.IDENT(
122         MPTEST.TASK_NAME( REMOTE_NODE ),
123         REMOTE_NODE,
124         TEST_TID,
125         STATUS
126      );
127      TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "TASK_IDENT" );
128
129      if TEST_TID /= REMOTE_TID then
130         TEXT_IO.PUT_LINE( "task_ident tid's do not match!!" );
131         RTEMS.SHUTDOWN_EXECUTIVE( 0 );
132      end if;
133
134      RTEMS.TASKS.DELETE( REMOTE_TID, STATUS );
135      TEST_SUPPORT.FATAL_DIRECTIVE_STATUS(
136         STATUS,
137         RTEMS.ILLEGAL_ON_REMOTE_OBJECT,
138         "task_delete of remote task"
139      );
140      TEXT_IO.PUT_LINE(
141         "task_delete of remote task returned the correct error"
142      );
143         
144      RTEMS.TASKS.START( REMOTE_TID, MPTEST.TEST_TASK'ACCESS, 0, STATUS );
145      TEST_SUPPORT.FATAL_DIRECTIVE_STATUS(
146         STATUS,
147         RTEMS.ILLEGAL_ON_REMOTE_OBJECT,
148         "task_start of remote task"
149      );
150      TEXT_IO.PUT_LINE(
151         "task_start of remote task returned the correct error"
152      );
153         
154      RTEMS.TASKS.RESTART( REMOTE_TID, 0, STATUS );
155      TEST_SUPPORT.FATAL_DIRECTIVE_STATUS(
156         STATUS,
157         RTEMS.ILLEGAL_ON_REMOTE_OBJECT,
158         "task_restart of remote task"
159      );
160      TEXT_IO.PUT_LINE(
161         "task_restart of remote task returned the correct error"
162      );
163         
164   
165      TEXT_IO.PUT( "Setting notepad " );
166      UNSIGNED32_IO.PUT( RTEMS.GET_NODE( TID ), WIDTH=>1 );
167      TEXT_IO.PUT( " of the remote task to " );
168      UNSIGNED32_IO.PUT( RTEMS.GET_NODE( TID ), WIDTH=>1 );
169      TEXT_IO.NEW_LINE;
170      RTEMS.TASKS.SET_NOTE(
171         REMOTE_TID,
172         RTEMS.GET_NODE( TID ),
173         RTEMS.GET_NODE( TID ),
174         STATUS
175      );
176      TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "TASK_SET_NOTE" );
177
178      TEXT_IO.PUT_LINE( "Getting a notepad of the remote task" );
179      RTEMS.TASKS.GET_NOTE(
180         REMOTE_TID,
181         RTEMS.GET_NODE( TID ),
182         NOTE,
183         STATUS
184      );
185      TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "TASK_GET_NOTE" );
186
187      if NOTE = RTEMS.GET_NODE( TID ) then
188         TEXT_IO.PUT_LINE( "Remote notepad set and read correctly" );
189      else
190         TEXT_IO.PUT(
191            "FAILURE!!! Remote notepad was not set and read correctly ("
192         );
193         UNSIGNED32_IO.PUT( NOTE );
194         TEXT_IO.PUT( ", " );
195         UNSIGNED32_IO.PUT( RTEMS.GET_NODE( TID ) );
196         TEXT_IO.PUT_LINE( ")" );
197
198      end if;
199
200      RTEMS.TASKS.DELETE( REMOTE_TID, STATUS );
201      TEXT_IO.PUT_LINE( "*** END OF TEST 2 ***" );
202
203      RTEMS.SHUTDOWN_EXECUTIVE( 0 );
204
205   end TEST_TASK;
206
207end MPTEST;
Note: See TracBrowser for help on using the repository browser.