source: rtems/testsuites/mptests/mp14/msgtask1.c @ 497428a2

4.104.114.84.95
Last change on this file since 497428a2 was ac7d5ef0, checked in by Joel Sherrill <joel.sherrill@…>, on 05/11/95 at 17:39:37

Initial revision

  • Property mode set to 100644
File size: 2.8 KB
Line 
1/*  Message_queue_task
2 *
3 *  This task continuously sends messages to and receives messages from
4 *  a global message queue.    The message buffer is viewed as an array
5 *  of two sixty-four bit counts which are incremented when a message is
6 *  received.
7 *
8 *  Input parameters:
9 *    argument - task argument
10 *
11 *  Output parameters:  NONE
12 *
13 *  COPYRIGHT (c) 1989, 1990, 1991, 1992, 1993, 1994.
14 *  On-Line Applications Research Corporation (OAR).
15 *  All rights assigned to U.S. Government, 1994.
16 *
17 *  This material may be reproduced by or for the U.S. Government pursuant
18 *  to the copyright license under the clause at DFARS 252.227-7013.  This
19 *  notice must appear in all copies of this file and its derivatives.
20 *
21 *  $Id$
22 */
23
24#include "system.h"
25
26rtems_task Message_queue_task(
27  rtems_task_argument index
28)
29{
30  rtems_status_code  status;
31  rtems_unsigned32   count;
32  rtems_unsigned32   yield_count;
33  rtems_unsigned32  *buffer_count;
34  rtems_unsigned32  *overflow_count;
35
36  Msg_buffer[ index ][0] = 0;
37  Msg_buffer[ index ][1] = 0;
38  Msg_buffer[ index ][2] = 0;
39  Msg_buffer[ index ][3] = 0;
40
41  puts( "Getting ID of msg queue" );
42  while ( FOREVER ) {
43    status = rtems_message_queue_ident(
44      Queue_name[ 1 ],
45      RTEMS_SEARCH_ALL_NODES,
46      &Queue_id[ 1 ]
47    );
48    if ( status == RTEMS_SUCCESSFUL )
49      break;
50    puts( "rtems_message_queue_ident FAILED!!" );
51  }
52
53  if ( Multiprocessing_configuration.node == 1 ) {
54      status = rtems_message_queue_send(
55        Queue_id[ 1 ],
56        (long (*)[4])Msg_buffer[ index ]
57      );
58      directive_failed( status, "rtems_message_queue_send" );
59      overflow_count = &Msg_buffer[ index ][0];
60      buffer_count   = &Msg_buffer[ index ][1];
61  } else {
62      overflow_count = &Msg_buffer[ index ][2];
63      buffer_count   = &Msg_buffer[ index ][3];
64  }
65
66  while ( Stop_Test == FALSE ) {
67    yield_count = 100;
68
69    for ( count=MESSAGE_DOT_COUNT ; Stop_Test == FALSE && count ; count-- ) {
70      status = rtems_message_queue_receive(
71        Queue_id[ 1 ],
72        (long (*)[4])Msg_buffer[ index ],
73        RTEMS_DEFAULT_OPTIONS,
74        RTEMS_NO_TIMEOUT
75      );
76      directive_failed( status, "rtems_message_queue_receive" );
77
78      if ( *buffer_count == (rtems_unsigned32)0xffffffff ) {
79        *buffer_count    = 0;
80        *overflow_count += 1;
81      } else
82        *buffer_count += 1;
83
84      status = rtems_message_queue_send(
85        Queue_id[ 1 ],
86        (long (*)[4])Msg_buffer[ index ]
87      );
88      directive_failed( status, "rtems_message_queue_send" );
89
90      if (Stop_Test == FALSE)
91        if ( Multiprocessing_configuration.node == 1 && --yield_count == 0 ) {
92          status = rtems_task_wake_after( RTEMS_YIELD_PROCESSOR );
93          directive_failed( status, "rtems_task_wake_after" );
94
95          yield_count = 100;
96        }
97    }
98    put_dot( 'm' );
99  }
100
101  Exit_test();
102}
Note: See TracBrowser for help on using the repository browser.