source: rtems/cpukit/rtems/src/tasks.c @ 3ba754e1

4.104.114.84.95
Last change on this file since 3ba754e1 was 3ba754e1, checked in by Joel Sherrill <joel.sherrill@…>, on 11/02/99 at 15:34:40

Added comments for _RTEMS_tasks_Create_extension,
_RTEMS_tasks_Start_extension, _RTEMS_tasks_Delete_extension, and
_RTEMS_tasks_Switch_extension.

  • Property mode set to 100644
File size: 5.2 KB
Line 
1/*
2 *  RTEMS Task Manager
3 *
4 *
5 *  COPYRIGHT (c) 1989-1998.
6 *  On-Line Applications Research Corporation (OAR).
7 *  Copyright assigned to U.S. Government, 1994.
8 *
9 *  The license and distribution terms for this file may be
10 *  found in the file LICENSE in this distribution or at
11 *  http://www.OARcorp.com/rtems/license.html.
12 *
13 *  $Id$
14 */
15
16#include <rtems/system.h>
17#include <rtems/rtems/status.h>
18#include <rtems/rtems/support.h>
19#include <rtems/rtems/modes.h>
20#include <rtems/score/object.h>
21#include <rtems/score/stack.h>
22#include <rtems/score/states.h>
23#include <rtems/rtems/tasks.h>
24#include <rtems/score/thread.h>
25#include <rtems/score/threadq.h>
26#include <rtems/score/tod.h>
27#include <rtems/score/userext.h>
28#include <rtems/score/wkspace.h>
29#include <rtems/score/apiext.h>
30#include <rtems/score/sysstate.h>
31
32/*PAGE
33 *
34 *  _RTEMS_tasks_Create_extension
35 *
36 *  This routine is an extension routine that is invoked as part
37 *  of creating any type of task or thread in the system.  If the
38 *  task is created via another API, then this routine is invoked
39 *  and this API given the opportunity to initialize its extension
40 *  area.
41 */
42
43boolean _RTEMS_tasks_Create_extension(
44  Thread_Control *executing,
45  Thread_Control *created
46)
47{
48  RTEMS_API_Control *api;
49
50  api = _Workspace_Allocate( sizeof( RTEMS_API_Control ) );
51
52  if ( !api )
53    return FALSE;
54
55  created->API_Extensions[ THREAD_API_RTEMS ] = api;
56 
57  api->pending_events = EVENT_SETS_NONE_PENDING;
58  _ASR_Initialize( &api->Signal );
59  return TRUE;
60}
61
62/*PAGE
63 *
64 *  _RTEMS_tasks_Start_extension
65 *
66 *  This extension routine is invoked when a task is started for the
67 *  first time.
68 */
69 
70User_extensions_routine _RTEMS_tasks_Start_extension(
71  Thread_Control *executing,
72  Thread_Control *started
73)
74{
75  RTEMS_API_Control *api;
76
77  api = started->API_Extensions[ THREAD_API_RTEMS ];
78 
79  api->pending_events = EVENT_SETS_NONE_PENDING;
80
81  _ASR_Initialize( &api->Signal );
82}
83
84/*PAGE
85 *
86 *  _RTEMS_tasks_Delete_extension
87 *
88 *  This extension routine is invoked when a task is deleted.
89 */
90 
91User_extensions_routine _RTEMS_tasks_Delete_extension(
92  Thread_Control *executing,
93  Thread_Control *deleted
94)
95{
96  (void) _Workspace_Free( deleted->API_Extensions[ THREAD_API_RTEMS ] );
97 
98  deleted->API_Extensions[ THREAD_API_RTEMS ] = NULL;
99}
100
101/*PAGE
102 *
103 *  _RTEMS_tasks_Switch_extension
104 *
105 *  This extension routine is invoked at each context switch.
106 */
107 
108void _RTEMS_tasks_Switch_extension(
109  Thread_Control *executing
110)
111{
112  ISR_Level          level;
113  RTEMS_API_Control *api;
114  ASR_Information   *asr;
115  rtems_signal_set   signal_set;
116  Modes_Control      prev_mode;
117
118  api = executing->API_Extensions[ THREAD_API_RTEMS ];
119  asr = &api->Signal;
120 
121  _ISR_Disable( level );
122    signal_set = asr->signals_posted;
123    asr->signals_posted = 0;
124  _ISR_Enable( level );
125 
126 
127  if ( !signal_set ) /* similar to _ASR_Are_signals_pending( asr ) */
128    return;
129 
130  asr->nest_level += 1;
131  rtems_task_mode( asr->mode_set, RTEMS_ALL_MODE_MASKS, &prev_mode );
132 
133  (*asr->handler)( signal_set );
134
135  asr->nest_level -= 1;
136  rtems_task_mode( prev_mode, RTEMS_ALL_MODE_MASKS, &prev_mode );
137
138}
139
140API_extensions_Control _RTEMS_tasks_API_extensions = {
141  { NULL, NULL },
142  NULL,                                     /* predriver */
143  _RTEMS_tasks_Initialize_user_tasks,       /* postdriver */
144  _RTEMS_tasks_Switch_extension             /* post switch */
145};
146
147User_extensions_Control _RTEMS_tasks_User_extensions = {
148  { NULL, NULL },
149  { _RTEMS_tasks_Create_extension,            /* create */
150    _RTEMS_tasks_Start_extension,             /* start */
151    _RTEMS_tasks_Start_extension,             /* restart */
152    _RTEMS_tasks_Delete_extension,            /* delete */
153    NULL,                                     /* switch */
154    NULL,                                     /* begin */
155    NULL,                                     /* exitted */
156    NULL                                      /* fatal */
157  }
158};
159
160/*PAGE
161 *
162 *  _RTEMS_tasks_Manager_initialization
163 *
164 *  This routine initializes all Task Manager related data structures.
165 *
166 *  Input parameters:
167 *    maximum_tasks       - number of tasks to initialize
168 *
169 *  Output parameters:  NONE
170 */
171
172void _RTEMS_tasks_Manager_initialization(
173  unsigned32                        maximum_tasks,
174  unsigned32                        number_of_initialization_tasks,
175  rtems_initialization_tasks_table *user_tasks
176)
177{
178
179  _RTEMS_tasks_Number_of_initialization_tasks = number_of_initialization_tasks;
180  _RTEMS_tasks_User_initialization_tasks = user_tasks;
181
182  /*
183   *  There may not be any RTEMS initialization tasks configured.
184   */
185
186#if 0
187  if ( user_tasks == NULL || number_of_initialization_tasks == 0 )
188    _Internal_error_Occurred( INTERNAL_ERROR_RTEMS_API, TRUE, RTEMS_TOO_MANY );
189#endif
190
191  _Objects_Initialize_information(
192    &_RTEMS_tasks_Information,
193    OBJECTS_RTEMS_TASKS,
194    TRUE,
195    maximum_tasks,
196    sizeof( Thread_Control ),
197    FALSE,
198    RTEMS_MAXIMUM_NAME_LENGTH,
199    TRUE
200  );
201
202  /*
203   *  Add all the extensions for this API
204   */
205
206  _User_extensions_Add_API_set( &_RTEMS_tasks_User_extensions );
207
208  _API_extensions_Add( &_RTEMS_tasks_API_extensions );
209
210  /*
211   *  Register the MP Process Packet routine.
212   */
213
214#if defined(RTEMS_MULTIPROCESSING)
215  _MPCI_Register_packet_processor(
216    MP_PACKET_TASKS,
217    _RTEMS_tasks_MP_Process_packet
218  );
219#endif
220
221}
222
Note: See TracBrowser for help on using the repository browser.