source: rtems/testsuites/ada/sptests/sp13/sptest.adb @ bc96f3b4

Last change on this file since bc96f3b4 was bc96f3b4, checked in by Sebastian Huber <sebastian.huber@…>, on Jan 23, 2018 at 8:53:06 AM

ada: Introduce RTEMS.Size type

Some time ago the Classic API object size related parameters were
changed to use size_t. Reflect this in the Ada bindings.

Update #3082.

  • Property mode set to 100644
File size: 27.0 KB
Line 
1--
2--  SPTEST / BODY
3--
4--  DESCRIPTION:
5--
6--  This package is the implementation of Test 13 of the RTEMS
7--  Single Processor 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.MESSAGE_QUEUE;
24with TEST_SUPPORT;
25with TEXT_IO;
26with UNSIGNED32_IO;
27use type RTEMS.STATUS_CODES;
28use type RTEMS.Size;
29
30package body SPTEST is
31
32   type BIG_BUFFER_TYPE is array (1 .. 2048) of RTEMS.UNSIGNED8;
33
34
35--
36--  INIT
37--
38
39   procedure INIT (
40      ARGUMENT : in     RTEMS.TASKS.ARGUMENT
41   ) is
42      pragma Unreferenced(ARGUMENT);
43      STATUS : RTEMS.STATUS_CODES;
44   begin
45
46      TEXT_IO.NEW_LINE( 2 );
47      TEST_SUPPORT.ADA_TEST_BEGIN;
48
49      SPTEST.TASK_NAME( 1 ) := RTEMS.BUILD_NAME(  'T', 'A', '1', ' ' );
50      SPTEST.TASK_NAME( 2 ) := RTEMS.BUILD_NAME(  'T', 'A', '2', ' ' );
51      SPTEST.TASK_NAME( 3 ) := RTEMS.BUILD_NAME(  'T', 'A', '3', ' ' );
52
53      RTEMS.TASKS.CREATE( 
54         SPTEST.TASK_NAME( 1 ), 
55         4, 
56         2048, 
57         RTEMS.DEFAULT_MODES,
58         RTEMS.DEFAULT_ATTRIBUTES,
59         SPTEST.TASK_ID( 1 ),
60         STATUS
61      );
62      TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "TASK_CREATE OF TA1" );
63
64      RTEMS.TASKS.CREATE( 
65         SPTEST.TASK_NAME( 2 ), 
66         4, 
67         2048, 
68         RTEMS.DEFAULT_MODES,
69         RTEMS.DEFAULT_ATTRIBUTES,
70         SPTEST.TASK_ID( 2 ),
71         STATUS
72      );
73      TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "TASK_CREATE OF TA2" );
74
75      RTEMS.TASKS.CREATE( 
76         SPTEST.TASK_NAME( 3 ), 
77         4, 
78         2048, 
79         RTEMS.DEFAULT_MODES,
80         RTEMS.DEFAULT_ATTRIBUTES,
81         SPTEST.TASK_ID( 3 ),
82         STATUS
83      );
84      TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "TASK_CREATE OF TA3" );
85
86      RTEMS.TASKS.START(
87         SPTEST.TASK_ID( 1 ),
88         SPTEST.TASK_1'ACCESS,
89         0,
90         STATUS
91      );
92      TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "TASK_START OF TA1" );
93
94      RTEMS.TASKS.START(
95         SPTEST.TASK_ID( 2 ),
96         SPTEST.TASK_2'ACCESS,
97         0,
98         STATUS
99      );
100      TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "TASK_START OF TA2" );
101
102      RTEMS.TASKS.START(
103         SPTEST.TASK_ID( 3 ),
104         SPTEST.TASK_3'ACCESS,
105         0,
106         STATUS
107      );
108      TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "TASK_START OF TA3" );
109
110      SPTEST.QUEUE_NAME( 1 ) := RTEMS.BUILD_NAME(  'Q', '1', ' ', ' ' );
111      SPTEST.QUEUE_NAME( 2 ) := RTEMS.BUILD_NAME(  'Q', '2', ' ', ' ' );
112      SPTEST.QUEUE_NAME( 3 ) := RTEMS.BUILD_NAME(  'Q', '3', ' ', ' ' );
113
114      RTEMS.MESSAGE_QUEUE.CREATE(
115         SPTEST.QUEUE_NAME( 1 ),
116         100,
117         16,
118         RTEMS.DEFAULT_ATTRIBUTES,
119         SPTEST.QUEUE_ID( 1 ),
120         STATUS
121      );
122      TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "QUEUE_CREATE OF Q1" );
123
124      RTEMS.MESSAGE_QUEUE.CREATE(
125         SPTEST.QUEUE_NAME( 2 ),
126         10,
127         16,
128         RTEMS.PRIORITY,
129         SPTEST.QUEUE_ID( 2 ),
130         STATUS
131      );
132      TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "QUEUE_CREATE OF Q2" );
133
134      RTEMS.MESSAGE_QUEUE.CREATE(
135         SPTEST.QUEUE_NAME( 3 ),
136         100,
137         16,
138         RTEMS.DEFAULT_ATTRIBUTES,
139         SPTEST.QUEUE_ID( 3 ),
140         STATUS
141      );
142      TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "QUEUE_CREATE OF Q3" );
143
144      RTEMS.TASKS.DELETE( RTEMS.SELF, STATUS );
145      TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "TASK_DELETE OF SELF" );
146
147   end INIT;
148
149--
150--  FILL_BUFFER
151--
152
153--
154-- Depends on tricks to make the copy work.
155--
156
157   procedure FILL_BUFFER (
158      SOURCE : in     STRING;
159      BUFFER :    out SPTEST.BUFFER
160   ) is
161   begin
162
163      BUFFER.FIELD1 := RTEMS.BUILD_NAME(
164         SOURCE( SOURCE'FIRST ),
165         SOURCE( SOURCE'FIRST + 1 ),
166         SOURCE( SOURCE'FIRST + 2 ),
167         SOURCE( SOURCE'FIRST + 3 )
168      );
169
170      BUFFER.FIELD2 := RTEMS.BUILD_NAME(
171         SOURCE( SOURCE'FIRST + 4 ),
172         SOURCE( SOURCE'FIRST + 5 ),
173         SOURCE( SOURCE'FIRST + 6 ),
174         SOURCE( SOURCE'FIRST + 7 )
175      );
176
177      BUFFER.FIELD3 := RTEMS.BUILD_NAME(
178         SOURCE( SOURCE'FIRST + 8 ),
179         SOURCE( SOURCE'FIRST + 9 ),
180         SOURCE( SOURCE'FIRST + 10 ),
181         SOURCE( SOURCE'FIRST + 11 )
182      );
183
184      BUFFER.FIELD4 := RTEMS.BUILD_NAME(
185         SOURCE( SOURCE'FIRST + 12 ),
186         SOURCE( SOURCE'FIRST + 13 ),
187         SOURCE( SOURCE'FIRST + 14 ),
188         SOURCE( SOURCE'FIRST + 15 )
189      );
190
191   end FILL_BUFFER;
192
193--
194--  PUT_BUFFER
195--
196
197--
198-- Depends on tricks to make the output work.
199--
200
201   procedure PUT_BUFFER (
202      BUFFER : in     SPTEST.BUFFER
203   ) is
204   begin
205
206      TEST_SUPPORT.PUT_NAME( BUFFER.FIELD1, FALSE );
207      TEST_SUPPORT.PUT_NAME( BUFFER.FIELD2, FALSE );
208      TEST_SUPPORT.PUT_NAME( BUFFER.FIELD3, FALSE );
209      TEST_SUPPORT.PUT_NAME( BUFFER.FIELD4, FALSE );
210     
211   end PUT_BUFFER;
212
213--
214--  TASK_1
215--
216
217   procedure TASK_1 (
218      ARGUMENT : in     RTEMS.TASKS.ARGUMENT
219   ) is
220      pragma Unreferenced(ARGUMENT);
221      QID                        : RTEMS.ID;
222      BIG_SEND_BUFFER            : BIG_BUFFER_TYPE;
223      BIG_SEND_BUFFER_POINTER    : constant RTEMS.ADDRESS
224                                      := BIG_SEND_BUFFER'ADDRESS;
225      BIG_RECEIVE_BUFFER         : BIG_BUFFER_TYPE;
226      BIG_RECEIVE_BUFFER_POINTER : constant RTEMS.ADDRESS
227                                      := BIG_RECEIVE_BUFFER'ADDRESS;
228      BUFFER                     : SPTEST.BUFFER;
229      BUFFER_POINTER             : constant RTEMS.ADDRESS := BUFFER'ADDRESS;
230      COUNT                      : RTEMS.UNSIGNED32;
231      MESSAGE_SIZE               : RTEMS.Size := 0;
232      STATUS                     : RTEMS.STATUS_CODES;
233      SIZE                       : RTEMS.Size := 0;
234   begin
235
236      RTEMS.MESSAGE_QUEUE.IDENT( 
237         SPTEST.QUEUE_NAME( 1 ), 
238         RTEMS.SEARCH_ALL_NODES, 
239         QID, 
240         STATUS
241      );
242      TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "MESSAGE_QUEUE_IDENT" );
243      TEXT_IO.PUT( "TA1 - message_queue_ident - qid => " );
244      UNSIGNED32_IO.PUT( QID, WIDTH => 8, BASE => 16 );
245      TEXT_IO.NEW_LINE;
246
247      SPTEST.FILL_BUFFER( "BUFFER 1 TO Q 1 ", BUFFER );
248      TEXT_IO.PUT_LINE( "TA1 - message_queue_send - BUFFER 1 TO Q 1" );
249      RTEMS.MESSAGE_QUEUE.SEND( 
250         SPTEST.QUEUE_ID( 1 ), 
251         BUFFER_POINTER, 
252         16,
253         STATUS
254      );
255      TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "MESSAGE_QUEUE_SEND" );
256   
257      SPTEST.FILL_BUFFER( "BUFFER 2 TO Q 1 ", BUFFER );
258      TEXT_IO.PUT_LINE( "TA1 - message_queue_send - BUFFER 2 TO Q 1" );
259      RTEMS.MESSAGE_QUEUE.SEND( 
260         SPTEST.QUEUE_ID( 1 ), 
261         BUFFER_POINTER, 
262         16,
263         STATUS
264      );
265      TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "MESSAGE_QUEUE_SEND" );
266
267      TEXT_IO.PUT_LINE( "TA1 - task_wake_after - sleep 5 seconds" );
268      RTEMS.TASKS.WAKE_AFTER( 5 * TEST_SUPPORT.TICKS_PER_SECOND, STATUS );
269      TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "TASK_WAKE_AFTER" );
270         
271      SPTEST.FILL_BUFFER( "BUFFER 3 TO Q 1 ", BUFFER );
272      TEXT_IO.PUT_LINE( "TA1 - message_queue_send - BUFFER 3 TO Q 1" );
273      RTEMS.MESSAGE_QUEUE.SEND( 
274         SPTEST.QUEUE_ID( 1 ), 
275         BUFFER_POINTER, 
276         16,
277         STATUS
278      );
279      TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "MESSAGE_QUEUE_SEND" );
280
281      TEXT_IO.PUT_LINE( "TA1 - task_wake_after - sleep 5 seconds" );
282      RTEMS.TASKS.WAKE_AFTER( 5 * TEST_SUPPORT.TICKS_PER_SECOND, STATUS );
283      TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "TASK_WAKE_AFTER" );
284         
285TEST_SUPPORT.PAUSE;
286
287      SPTEST.FILL_BUFFER( "BUFFER 1 TO Q 2 ", BUFFER );
288      TEXT_IO.PUT_LINE( "TA1 - message_queue_send - BUFFER 1 TO Q 2" );
289      RTEMS.MESSAGE_QUEUE.SEND( 
290         SPTEST.QUEUE_ID( 2 ), 
291         BUFFER_POINTER, 
292         16,
293         STATUS
294      );
295      TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "MESSAGE_QUEUE_SEND" );
296
297      TEXT_IO.PUT( 
298         "TA1 - message_queue_receive - receive from queue 1 - "
299      );
300      TEXT_IO.PUT_LINE( "10 second timeout" );
301      RTEMS.MESSAGE_QUEUE.RECEIVE(
302         SPTEST.QUEUE_ID( 1 ),
303         BUFFER_POINTER,
304         RTEMS.DEFAULT_OPTIONS,
305         10 * TEST_SUPPORT.TICKS_PER_SECOND,
306         MESSAGE_SIZE,
307         STATUS
308      );
309      TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "MESSAGE_QUEUE_RECEIVE" );
310      TEXT_IO.PUT( "TA1 - buffer received: " );
311      SPTEST.PUT_BUFFER( BUFFER );
312      TEXT_IO.NEW_LINE;
313
314      TEXT_IO.PUT_LINE( "TA1 - task_delete - delete TA2" );
315      RTEMS.TASKS.DELETE( SPTEST.TASK_ID( 2 ), STATUS );
316      TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "TASK_DELETE" );
317
318      SPTEST.FILL_BUFFER( "BUFFER 1 TO Q 3 ", BUFFER );
319      TEXT_IO.PUT_LINE( "TA1 - message_queue_send - BUFFER 1 TO Q 3" );
320      RTEMS.MESSAGE_QUEUE.SEND( 
321         SPTEST.QUEUE_ID( 3 ), 
322         BUFFER_POINTER, 
323         16,
324         STATUS
325      );
326      TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "MESSAGE_QUEUE_SEND" );
327
328      TEXT_IO.PUT_LINE( "TA1 - task_wake_after - sleep 5 seconds" );
329      RTEMS.TASKS.WAKE_AFTER( 5 * TEST_SUPPORT.TICKS_PER_SECOND, STATUS );
330      TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "TASK_WAKE_AFTER" );
331         
332TEST_SUPPORT.PAUSE;
333
334      SPTEST.FILL_BUFFER( "BUFFER 2 TO Q 3 ", BUFFER );
335      TEXT_IO.PUT_LINE( "TA1 - message_queue_send - BUFFER 2 TO Q 3" );
336      RTEMS.MESSAGE_QUEUE.SEND( 
337         SPTEST.QUEUE_ID( 3 ), 
338         BUFFER_POINTER, 
339         16,
340         STATUS
341      );
342      TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "MESSAGE_QUEUE_SEND" );
343
344      SPTEST.FILL_BUFFER( "BUFFER 3 TO Q 3 ", BUFFER );
345      TEXT_IO.PUT_LINE( "TA1 - message_queue_send - BUFFER 3 TO Q 3" );
346      RTEMS.MESSAGE_QUEUE.SEND( 
347         SPTEST.QUEUE_ID( 3 ), 
348         BUFFER_POINTER, 
349         16,
350         STATUS
351      );
352      TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "MESSAGE_QUEUE_SEND" );
353
354      SPTEST.FILL_BUFFER( "BUFFER 4 TO Q 3 ", BUFFER );
355      TEXT_IO.PUT_LINE( "TA1 - message_queue_send - BUFFER 4 TO Q 3" );
356      RTEMS.MESSAGE_QUEUE.SEND( 
357         SPTEST.QUEUE_ID( 3 ), 
358         BUFFER_POINTER, 
359         16,
360         STATUS
361      );
362      TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "MESSAGE_QUEUE_SEND" );
363
364      SPTEST.FILL_BUFFER( "BUFFER 5 TO Q 3 ", BUFFER );
365      TEXT_IO.PUT_LINE( "TA1 - message_queue_urgent - BUFFER 5 TO Q 3" );
366      RTEMS.MESSAGE_QUEUE.URGENT( 
367         SPTEST.QUEUE_ID( 3 ), 
368         BUFFER_POINTER, 
369         16,
370         STATUS
371      );
372      TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "MESSAGE_QUEUE_URGENT" );
373
374      for TIMES in 1 .. 4 
375      loop
376         TEXT_IO.PUT( 
377            "TA1 - message_queue_receive - receive from queue 3 - "
378         );
379         TEXT_IO.PUT_LINE( "WAIT FOREVER" );
380         RTEMS.MESSAGE_QUEUE.RECEIVE(
381            SPTEST.QUEUE_ID( 3 ),
382            BUFFER_POINTER,
383            RTEMS.DEFAULT_OPTIONS,
384            RTEMS.NO_TIMEOUT,
385            MESSAGE_SIZE,
386            STATUS
387         );
388         TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "MESSAGE_QUEUE_RECEIVE" );
389         TEXT_IO.PUT( "TA1 - buffer received: " );
390         SPTEST.PUT_BUFFER( BUFFER );
391         TEXT_IO.NEW_LINE;
392      end loop;
393
394      SPTEST.FILL_BUFFER( "BUFFER 3 TO Q 2 ", BUFFER );
395      TEXT_IO.PUT_LINE( "TA1 - message_queue_urgent - BUFFER 3 TO Q 2" );
396      RTEMS.MESSAGE_QUEUE.URGENT( 
397         SPTEST.QUEUE_ID( 2 ), 
398         BUFFER_POINTER, 
399         16,
400         STATUS
401      );
402      TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "MESSAGE_QUEUE_URGENT" );
403
404      TEXT_IO.PUT( 
405        "TA1 - message_queue_receive - receive from queue 2 - " 
406      );
407      TEXT_IO.PUT_LINE( "WAIT FOREVER" );
408      RTEMS.MESSAGE_QUEUE.RECEIVE(
409         SPTEST.QUEUE_ID( 2 ),
410         BUFFER_POINTER,
411         RTEMS.DEFAULT_OPTIONS,
412         RTEMS.NO_TIMEOUT,
413         MESSAGE_SIZE,
414         STATUS
415      );
416      TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "MESSAGE_QUEUE_RECEIVE" );
417      TEXT_IO.PUT( "TA1 - buffer received: " );
418      SPTEST.PUT_BUFFER( BUFFER );
419      TEXT_IO.NEW_LINE;
420
421TEST_SUPPORT.PAUSE;
422
423      TEXT_IO.PUT_LINE( "TA1 - message_queue_delete - delete queue 1" );
424      RTEMS.MESSAGE_QUEUE.DELETE( SPTEST.QUEUE_ID( 1 ), STATUS );
425      TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "MESSAGE_QUEUE_DELETE" );
426   
427      SPTEST.FILL_BUFFER( "BUFFER 3 TO Q 2 ", BUFFER );
428      TEXT_IO.PUT_LINE( "TA1 - message_queue_urgent - BUFFER 3 TO Q 2" );
429      RTEMS.MESSAGE_QUEUE.URGENT( 
430         SPTEST.QUEUE_ID( 2 ), 
431         BUFFER_POINTER, 
432         16,
433         STATUS
434      );
435      TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "MESSAGE_QUEUE_URGENT" );
436
437      TEXT_IO.PUT_LINE( "TA1 - message_queue_delete - delete queue 2" );
438      RTEMS.MESSAGE_QUEUE.DELETE( SPTEST.QUEUE_ID( 2 ), STATUS );
439      TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "MESSAGE_QUEUE_DELETE" );
440   
441      TEXT_IO.PUT_LINE( "TA1 - message_queue_get_number_pending - check Q 3" );
442      RTEMS.MESSAGE_QUEUE.GET_NUMBER_PENDING(
443         SPTEST.QUEUE_ID( 3 ), COUNT, STATUS
444      );
445      TEST_SUPPORT.DIRECTIVE_FAILED(
446         STATUS, "MESSAGE_QUEUE_GET_NUMBER_PENDING"
447      );
448      TEXT_IO.PUT( "TA1 - " );
449      UNSIGNED32_IO.PUT( COUNT, WIDTH => 3, BASE => 10 );
450      TEXT_IO.PUT_LINE( " messages are pending on Q 3" );
451   
452      TEXT_IO.PUT_LINE( "TA1 - message_queue_flush - empty Q 3" );
453      RTEMS.MESSAGE_QUEUE.FLUSH( SPTEST.QUEUE_ID( 3 ), COUNT, STATUS );
454      TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "MESSAGE_QUEUE_FLUSH" );
455      TEXT_IO.PUT( "TA1 - " );
456      UNSIGNED32_IO.PUT( COUNT, WIDTH => 3, BASE => 10 );
457      TEXT_IO.PUT_LINE( " messages were flushed from Q 3" );
458     
459      SPTEST.FILL_BUFFER( "BUFFER 1 TO Q 3 ", BUFFER );
460      TEXT_IO.PUT_LINE( "TA1 - message_queue_send - BUFFER 1 TO Q 3" );
461      RTEMS.MESSAGE_QUEUE.SEND( 
462         SPTEST.QUEUE_ID( 3 ), 
463         BUFFER_POINTER, 
464         16,
465         STATUS
466      );
467      TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "MESSAGE_QUEUE_SEND" );
468
469      SPTEST.FILL_BUFFER( "BUFFER 2 TO Q 3 ", BUFFER );
470      TEXT_IO.PUT_LINE( "TA1 - message_queue_send - BUFFER 2 TO Q 3" );
471      RTEMS.MESSAGE_QUEUE.SEND( 
472         SPTEST.QUEUE_ID( 3 ), 
473         BUFFER_POINTER, 
474         16,
475         STATUS
476      );
477      TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "MESSAGE_QUEUE_SEND" );
478
479      -- this broadcast should have no effect on the queue
480      SPTEST.FIlL_BUFFER( "NO BUFFER TO Q1 ", BUFFER );
481      TEXT_IO.PUT_LINE( "TA1 - message_queue_broadcast - NO BUFFER TO Q1" );
482      RTEMS.MESSAGE_QUEUE.BROADCAST(
483         SPTEST.QUEUE_ID( 1 ),
484         BUFFER_POINTER,
485         16,
486         COUNT,
487         STATUS
488      );
489      TEXT_IO.PUT( "TA1 - number of tasks awakened = " );
490      UNSIGNED32_IO.PUT( COUNT, WIDTH => 3, BASE => 10 );
491      TEXT_IO.NEW_LINE;
492   
493      TEXT_IO.PUT_LINE( "TA1 - message_queue_get_number_pending - check Q 3" );
494      RTEMS.MESSAGE_QUEUE.GET_NUMBER_PENDING(
495         SPTEST.QUEUE_ID( 3 ), COUNT, STATUS
496      );
497      TEST_SUPPORT.DIRECTIVE_FAILED(
498         STATUS, "MESSAGE_QUEUE_GET_NUMBER_PENDING"
499      );
500      TEXT_IO.PUT( "TA1 - " );
501      UNSIGNED32_IO.PUT( COUNT, WIDTH => 3, BASE => 10 );
502      TEXT_IO.PUT_LINE( " messages are pending on Q 3" );
503
504      SPTEST.FILL_BUFFER( "BUFFER 3 TO Q 3 ", BUFFER );
505      TEXT_IO.PUT_LINE( "TA1 - message_queue_send - BUFFER 3 TO Q 3" );
506      RTEMS.MESSAGE_QUEUE.SEND( 
507         SPTEST.QUEUE_ID( 3 ), 
508         BUFFER_POINTER, 
509         16,
510         STATUS
511      );
512      TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "MESSAGE_QUEUE_SEND" );
513
514      TEXT_IO.PUT_LINE( "TA1 - message_queue_flush - Q 3" );
515      RTEMS.MESSAGE_QUEUE.FLUSH( SPTEST.QUEUE_ID( 3 ), COUNT, STATUS );
516      TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "MESSAGE_QUEUE_FLUSH" );
517      TEXT_IO.PUT( "TA1 - " );
518      UNSIGNED32_IO.PUT( COUNT, WIDTH => 3, BASE => 10 );
519      TEXT_IO.PUT_LINE( " messages were flushed from Q 3" );
520     
521      TEXT_IO.PUT_LINE( 
522         "TA1 - message_queue_send - until all message buffers consumed"
523      );
524      loop
525
526         RTEMS.MESSAGE_QUEUE.SEND( 
527            SPTEST.QUEUE_ID( 3 ), 
528            BUFFER_POINTER, 
529            16,
530            STATUS
531         );
532         
533         exit when RTEMS.ARE_STATUSES_EQUAL( STATUS, RTEMS.TOO_MANY );
534
535         TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "MESSAGE_QUEUE_SEND" );
536         
537      end loop;
538
539      TEXT_IO.PUT_LINE( 
540         "TA1 - message_queue_send - all message buffers consumed"
541      );
542
543      TEXT_IO.PUT_LINE( "TA1 - message_queue_flush - Q 3" );
544      RTEMS.MESSAGE_QUEUE.FLUSH( SPTEST.QUEUE_ID( 3 ), COUNT, STATUS );
545      TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "MESSAGE_QUEUE_FLUSH" );
546      TEXT_IO.PUT( "TA1 - " );
547      UNSIGNED32_IO.PUT( COUNT, WIDTH => 3, BASE => 10 );
548      TEXT_IO.PUT_LINE( " messages were flushed from Q 3" );
549
550TEST_SUPPORT.PAUSE;
551     
552      TEXT_IO.PUT_LINE( "TA1 - create message queue of 20 bytes on queue 1" );
553      RTEMS.MESSAGE_QUEUE.CREATE(
554         SPTEST.QUEUE_NAME( 1 ),
555         100,
556         20,
557         RTEMS.DEFAULT_ATTRIBUTES,
558         SPTEST.QUEUE_ID( 1 ),
559         STATUS
560      );
561      TEST_SUPPORT.DIRECTIVE_FAILED(
562         STATUS, "MESSAGE_QUEUE_CREATE of Q1; 20 bytes each"
563      );
564      RTEMS.MESSAGE_QUEUE.SEND(
565         SPTEST.QUEUE_ID( 1 ), BIG_SEND_BUFFER_POINTER, 40, STATUS
566      );
567      TEST_SUPPORT.FATAL_DIRECTIVE_STATUS(
568         STATUS, RTEMS.INVALID_SIZE, "expected INVALID_SIZE"
569      );
570
571      TEXT_IO.PUT_LINE( "TA1 - message_queue_delete - delete queue 1" );
572      RTEMS.MESSAGE_QUEUE.DELETE( SPTEST.QUEUE_ID( 1 ), STATUS );
573      TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "MESSAGE_QUEUE_DELETE" );
574
575TEST_SUPPORT.PAUSE;
576
577      TEXT_IO.PUT_LINE( "TA1 - message_queue_create - variable sizes " );
578      for QUEUE_SIZE in 1 .. 1029 loop
579          RTEMS.MESSAGE_QUEUE.CREATE(
580              SPTEST.QUEUE_NAME( 1 ),
581              2,            -- just 2 msgs each
582              RTEMS.Size( QUEUE_SIZE ),
583              RTEMS.DEFAULT_ATTRIBUTES,
584              QUEUE_ID( 1 ),
585              STATUS
586          );
587          if STATUS /= RTEMS.SUCCESSFUL then
588              TEXT_IO.PUT( "TA1 - msq que size: " );
589              UNSIGNED32_IO.PUT(
590                 RTEMS.UNSIGNED32( QUEUE_SIZE ), WIDTH => 3, BASE => 10
591              );
592              TEXT_IO.NEW_LINE;
593              TEST_SUPPORT.DIRECTIVE_FAILED(
594                 STATUS, "message_queue_create of Q1"
595              );
596          end if;
597
598          RTEMS.MESSAGE_QUEUE.DELETE( SPTEST.QUEUE_ID( 1 ), STATUS );
599          TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "message_queue_delete" );
600      end loop;
601
602      TEXT_IO.PUT_LINE(
603         "TA1 - message_queue_create and send - variable sizes "
604      );
605      for QUEUE_SIZE in 1 .. 1029 loop
606
607          RTEMS.MESSAGE_QUEUE.CREATE(
608              SPTEST.QUEUE_NAME( 1 ),
609              2,            -- just 2 msgs each
610              RTEMS.Size( QUEUE_SIZE ),
611              RTEMS.DEFAULT_ATTRIBUTES,
612              SPTEST.QUEUE_ID( 1 ),
613              STATUS
614          );
615          TEST_SUPPORT.DIRECTIVE_FAILED(status, "message_queue_create of Q1");
616
617          BIG_SEND_BUFFER := (others => CHARACTER'POS( 'A' ));
618          BIG_RECEIVE_BUFFER := (others => CHARACTER'POS( 'Z' ));
619
620          -- send a msg too big
621          RTEMS.MESSAGE_QUEUE.SEND(
622             SPTEST.QUEUE_ID( 1 ),
623             BIG_SEND_BUFFER_POINTER,
624             RTEMS.Size( QUEUE_SIZE + 1 ),
625             STATUS
626          );
627          TEST_SUPPORT.FATAL_DIRECTIVE_STATUS(
628             STATUS, RTEMS.INVALID_SIZE, "message_queue_send too large"
629          );
630
631          -- send a msg that is just right
632          RTEMS.MESSAGE_QUEUE.SEND(
633             SPTEST.QUEUE_ID( 1 ),
634             BIG_SEND_BUFFER_POINTER,
635             RTEMS.Size( QUEUE_SIZE ),
636             STATUS
637          );
638          TEST_SUPPORT.DIRECTIVE_FAILED(
639             STATUS, "message_queue_send exact size"
640          );
641
642          -- now read and verify the message just sent
643          SIZE := RTEMS.Size(QUEUE_SIZE);
644          RTEMS.MESSAGE_QUEUE.RECEIVE(
645             SPTEST.QUEUE_ID( 1 ),
646             BIG_RECEIVE_BUFFER_POINTER,
647             RTEMS.DEFAULT_OPTIONS,
648             1 * TEST_SUPPORT.TICKS_PER_SECOND,
649             SIZE,
650             STATUS
651          );
652          TEST_SUPPORT.DIRECTIVE_FAILED(
653             STATUS, "message_queue_receive exact size"
654          );
655          if SIZE /= RTEMS.Size( QUEUE_SIZE ) then
656              TEXT_IO.PUT(
657                 "TA1 - exact size size match failed for queue_size = "
658              );
659              UNSIGNED32_IO.PUT(
660                 RTEMS.UNSIGNED32( QUEUE_SIZE ), WIDTH => 3, BASE => 10
661              );
662              TEXT_IO.NEW_LINE;
663          end if;
664
665          if (BIG_SEND_BUFFER( BIG_SEND_BUFFER'FIRST .. Integer( SIZE )) /=
666            BIG_RECEIVE_BUFFER( BIG_RECEIVE_BUFFER'FIRST .. Integer( SIZE )))
667          then
668              TEXT_IO.PUT_LINE("TA1 - exact size data match failed");
669          end if;
670
671          for I in Integer( SIZE + 1 ) .. BIG_RECEIVE_BUFFER'LAST loop
672              if BIG_RECEIVE_BUFFER( I ) /= CHARACTER'POS( 'Z' ) then
673                  TEXT_IO.PUT_LINE("TA1 - exact size overrun match failed");
674              end if;
675          end loop;
676
677          -- all done with this one; delete it
678          RTEMS.MESSAGE_QUEUE.DELETE( SPTEST.QUEUE_ID( 1 ), STATUS );
679          TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "message_queue_delete" );
680      end loop;
681
682      TEST_SUPPORT.ADA_TEST_END;
683      RTEMS.SHUTDOWN_EXECUTIVE( 0 );
684
685   end TASK_1;
686
687--
688--  TASK_2
689--
690
691   procedure TASK_2 (
692      ARGUMENT : in     RTEMS.TASKS.ARGUMENT
693   ) is
694      pragma Unreferenced(ARGUMENT);
695      BUFFER            : SPTEST.BUFFER;
696      BUFFER_POINTER    : RTEMS.ADDRESS;
697      PREVIOUS_PRIORITY : RTEMS.TASKS.PRIORITY;
698      MESSAGE_SIZE      : RTEMS.Size := 0;
699      STATUS            : RTEMS.STATUS_CODES;
700   begin
701
702      BUFFER_POINTER := BUFFER'ADDRESS;
703
704      TEXT_IO.PUT_LINE( 
705         "TA2 - message_queue_receive - receive from queue 1 - NO_WAIT"
706      );
707      RTEMS.MESSAGE_QUEUE.RECEIVE(
708         SPTEST.QUEUE_ID( 1 ),
709         BUFFER_POINTER,
710         RTEMS.NO_WAIT,
711         RTEMS.NO_TIMEOUT,
712         MESSAGE_SIZE,
713         STATUS
714      );
715      TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "MESSAGE_QUEUE_RECEIVE" );
716      TEXT_IO.PUT( "TA2 - buffer received: " );
717      SPTEST.PUT_BUFFER( BUFFER );
718      TEXT_IO.NEW_LINE;
719
720      TEXT_IO.PUT_LINE( 
721         "TA2 - message_queue_receive - receive from queue 1 - WAIT FOREVER"
722      );
723      RTEMS.MESSAGE_QUEUE.RECEIVE(
724         SPTEST.QUEUE_ID( 1 ),
725         BUFFER_POINTER,
726         RTEMS.DEFAULT_OPTIONS,
727         RTEMS.NO_TIMEOUT,
728         MESSAGE_SIZE,
729         STATUS
730      );
731      TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "MESSAGE_QUEUE_RECEIVE" );
732      TEXT_IO.PUT( "TA2 - buffer received: " );
733      SPTEST.PUT_BUFFER( BUFFER );
734      TEXT_IO.NEW_LINE;
735
736      TEXT_IO.PUT_LINE( 
737         "TA2 - message_queue_receive - receive from queue 1 - WAIT FOREVER"
738      );
739      RTEMS.MESSAGE_QUEUE.RECEIVE(
740         SPTEST.QUEUE_ID( 1 ),
741         BUFFER_POINTER,
742         RTEMS.DEFAULT_OPTIONS,
743         RTEMS.NO_TIMEOUT,
744         MESSAGE_SIZE,
745         STATUS
746      );
747      TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "MESSAGE_QUEUE_RECEIVE" );
748      TEXT_IO.PUT( "TA2 - buffer received: " );
749      SPTEST.PUT_BUFFER( BUFFER );
750      TEXT_IO.NEW_LINE;
751
752      TEXT_IO.PUT_LINE( 
753         "TA2 - task_set_priority - make self highest priority task"
754      );
755      RTEMS.TASKS.SET_PRIORITY(
756         RTEMS.SELF,
757         3,
758         PREVIOUS_PRIORITY,
759         STATUS
760      );
761      TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "TASK_SET_PRIORITY" );
762
763      TEXT_IO.PUT_LINE( 
764         "TA2 - message_queue_receive - receive from queue 2 - WAIT FOREVER"
765      );
766      RTEMS.MESSAGE_QUEUE.RECEIVE(
767         SPTEST.QUEUE_ID( 2 ),
768         BUFFER_POINTER,
769         RTEMS.DEFAULT_OPTIONS,
770         RTEMS.NO_TIMEOUT,
771         MESSAGE_SIZE,
772         STATUS
773      );
774      TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "MESSAGE_QUEUE_RECEIVE" );
775      TEXT_IO.PUT( "TA2 - buffer received: " );
776      SPTEST.PUT_BUFFER( BUFFER );
777      TEXT_IO.NEW_LINE;
778
779      SPTEST.FILL_BUFFER( "BUFFER 2 TO Q 2 ", BUFFER );
780      TEXT_IO.PUT_LINE( "TA2 - message_queue_send - BUFFER 2 TO Q 2" );
781      RTEMS.MESSAGE_QUEUE.SEND( 
782         SPTEST.QUEUE_ID( 2 ), 
783         BUFFER_POINTER, 
784         16,
785         STATUS
786      );
787      TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "MESSAGE_QUEUE_SEND" );
788   
789      TEXT_IO.PUT_LINE( 
790    "TA2 - message_queue_receive - receive from queue 1 - 10 second timeout"
791      );
792      RTEMS.MESSAGE_QUEUE.RECEIVE(
793         SPTEST.QUEUE_ID( 1 ),
794         BUFFER_POINTER,
795         RTEMS.DEFAULT_OPTIONS,
796         10 * TEST_SUPPORT.TICKS_PER_SECOND,
797         MESSAGE_SIZE,
798         STATUS
799      );
800      TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "MESSAGE_QUEUE_RECEIVE" );
801      TEXT_IO.PUT( "TA2 - buffer received: " );
802      SPTEST.PUT_BUFFER( BUFFER );
803      TEXT_IO.NEW_LINE;
804
805      TEXT_IO.PUT_LINE( 
806         "TA2 - message_queue_receive - receive from queue 3 - WAIT FOREVER"
807      );
808      RTEMS.MESSAGE_QUEUE.RECEIVE(
809         SPTEST.QUEUE_ID( 3 ),
810         BUFFER_POINTER,
811         RTEMS.DEFAULT_OPTIONS,
812         RTEMS.NO_TIMEOUT,
813         MESSAGE_SIZE,
814         STATUS
815      );
816      TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "MESSAGE_QUEUE_RECEIVE" );
817      TEXT_IO.PUT( "TA2 - buffer received: " );
818      SPTEST.PUT_BUFFER( BUFFER );
819      TEXT_IO.NEW_LINE;
820
821   end TASK_2;
822
823--
824--  TASK_3
825--
826
827   procedure TASK_3 (
828      ARGUMENT : in     RTEMS.TASKS.ARGUMENT
829   ) is
830      pragma Unreferenced(ARGUMENT);
831      BUFFER         : SPTEST.BUFFER;
832      BUFFER_POINTER : RTEMS.ADDRESS;
833      COUNT          : RTEMS.UNSIGNED32;
834      MESSAGE_SIZE   : RTEMS.Size := 0;
835      STATUS         : RTEMS.STATUS_CODES;
836   begin
837
838      BUFFER_POINTER := BUFFER'ADDRESS;
839
840      TEXT_IO.PUT_LINE( 
841         "TA3 - message_queue_receive - receive from queue 2 - WAIT FOREVER"
842      );
843      RTEMS.MESSAGE_QUEUE.RECEIVE(
844         SPTEST.QUEUE_ID( 2 ),
845         BUFFER_POINTER,
846         RTEMS.DEFAULT_OPTIONS,
847         RTEMS.NO_TIMEOUT,
848         MESSAGE_SIZE,
849         STATUS
850      );
851      TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "MESSAGE_QUEUE_RECEIVE" );
852      TEXT_IO.PUT( "TA3 - buffer received: " );
853      SPTEST.PUT_BUFFER( BUFFER );
854      TEXT_IO.NEW_LINE;
855
856      SPTEST.FILL_BUFFER( "BUFFER 3 TO Q 1 ", BUFFER );
857      TEXT_IO.PUT_LINE( "TA3 - message_queue_broadcast - BUFFER 3 TO Q 1" );
858      RTEMS.MESSAGE_QUEUE.BROADCAST( 
859         SPTEST.QUEUE_ID( 1 ), 
860         BUFFER_POINTER, 
861         16,
862         COUNT,
863         STATUS
864      );
865      TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "MESSAGE_QUEUE_BROADCAST" );
866      TEXT_IO.PUT( "TA3 - number of tasks awakened = " );
867      UNSIGNED32_IO.PUT( COUNT, WIDTH => 3, BASE => 10 );
868      TEXT_IO.NEW_LINE;
869     
870      TEXT_IO.PUT_LINE( 
871         "TA3 - message_queue_receive - receive from queue 3 - WAIT FOREVER"
872      );
873      RTEMS.MESSAGE_QUEUE.RECEIVE(
874         SPTEST.QUEUE_ID( 3 ),
875         BUFFER_POINTER,
876         RTEMS.DEFAULT_OPTIONS,
877         RTEMS.NO_TIMEOUT,
878         MESSAGE_SIZE,
879         STATUS
880      );
881      TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "MESSAGE_QUEUE_RECEIVE" );
882      TEXT_IO.PUT( "TA3 - buffer received: " );
883      SPTEST.PUT_BUFFER( BUFFER );
884      TEXT_IO.NEW_LINE;
885
886      TEXT_IO.PUT_LINE( "TA3 - task_delete - delete self" );
887      RTEMS.TASKS.DELETE( RTEMS.SELF, STATUS );
888      TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "TASK_DELETE OF SELF" );
889
890   end TASK_3;
891
892end SPTEST;
Note: See TracBrowser for help on using the repository browser.