summaryrefslogtreecommitdiffstats
path: root/cpukit/score/include/rtems/score/userext.h
blob: b8bcc0c2ffdc1d560a0d327fb01e034047660b25 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
/** 
 *  @file  rtems/score/userext.h
 *
 *  This include file contains all information about user extensions.  This
 *  Handler provides mechanisms which can be used to initialize and manipulate
 *  all user extensions.
 */

/*
 *  COPYRIGHT (c) 1989-2006.
 *  On-Line Applications Research Corporation (OAR).
 *
 *  The license and distribution terms for this file may be
 *  found in the file LICENSE in this distribution or at
 *  http://www.rtems.com/license/LICENSE.
 *
 *  $Id$
 */

#ifndef _RTEMS_SCORE_USEREXT_H
#define _RTEMS_SCORE_USEREXT_H

/**
 *  @defgroup ScoreUserExt User Extension Handler
 *
 *  This handler encapsulates functionality related to the management of
 *  the user extensions to the SuperCore that are available to the user.
 */
/**@{*/

#ifdef __cplusplus
extern "C" {
#endif

#include <rtems/score/interr.h>
#include <rtems/score/chain.h>
#include <rtems/score/thread.h>

/*@}*/

/** @defgroup ScoreUserExtStruct User Extension Handler Structures
 *
 *  The following records defines the User Extension Table.
 *  This table defines the application dependent routines which
 *  are invoked at critical points in the life of each thread and
 *  the system as a whole.
 */
/*@{*/

/**
 *  This type indicates the return type of a user extension method.
 */
typedef void User_extensions_routine;

/**
 *  This type defines the prototype of a thread creation extension handler.
 *  The handler is passed the thread executing and the thread being created.
 */
typedef boolean ( *User_extensions_thread_create_extension )(
                 Thread_Control *,
                 Thread_Control *
             );

/**
 *  This type defines the prototype of a thread deletion extension handler.
 *  The handler is passed the thread executing and the thread being deleted.
 */
typedef User_extensions_routine ( *User_extensions_thread_delete_extension )(
                 Thread_Control *,
                 Thread_Control *
             );

/**
 *  This type defines the prototype of thread starting extension handler.
 *  The handler is passed the thread executing and the thread being started.
 */
typedef User_extensions_routine ( *User_extensions_thread_start_extension )(
                 Thread_Control *,
                 Thread_Control *
             );

/**
 *  This type defines the prototype of a thread restarting extension handler.
 *  The handler is passed the thread executing and the thread being restarted.
 */
typedef User_extensions_routine ( *User_extensions_thread_restart_extension )(
                 Thread_Control *,
                 Thread_Control *
             );

/**
 *  This type defines the prototype of thread context switch extension handler.
 *  The handler is passed the thread currently executing and the thread being 
 *  switched to.
 */
typedef User_extensions_routine ( *User_extensions_thread_switch_extension )(
                 Thread_Control *,
                 Thread_Control *
             );

/**
 *  This type defines the prototype of a post context switch extension handler.
 *  The handler is passed the thread thread being switched to.
 */
typedef User_extensions_routine (*User_extensions_thread_post_switch_extension)(
                 Thread_Control *
             );

/**
 *  This type defines the prototype of a thread beginning to execute
 *  extension handler.  The handler is passed the thread executing.  This
 *  extension is executed in the context of the beginning thread.
 */
typedef User_extensions_routine ( *User_extensions_thread_begin_extension )(
                 Thread_Control *
             );

/**
 *  This type defines the prototype of a thread exiting extension handler.
 *  The handler is passed the thread exiting.
 */
typedef User_extensions_routine ( *User_extensions_thread_exitted_extension )(
                 Thread_Control *
             );

/**
 *  This type defines the prototype of the fatal error extension handler.
 *  The handler is passed an indicator of the source of the fatal error,
 *  whether it is internal to RTEMS and an error code.
 */
typedef User_extensions_routine ( *User_extensions_fatal_extension )(
                 Internal_errors_Source  /* the_source  */,
                 boolean                 /* is_internal */,
                 uint32_t                /* the_error   */
             );

/**
 *  This type defines a set of user extensions.
 */
typedef struct {
  /** This field is the thread creation handler. */
  User_extensions_thread_create_extension       thread_create;
  /** This field is the thread starting handler. */
  User_extensions_thread_start_extension        thread_start;
  /** This field is the thread restarting handler. */
  User_extensions_thread_restart_extension      thread_restart;
  /** This field is the thread deleting handler */
  User_extensions_thread_delete_extension       thread_delete;
  /** This field is thread context switch handler. */
  User_extensions_thread_switch_extension       thread_switch;
  /** This field is the thread beginning handler. */
  User_extensions_thread_begin_extension        thread_begin;
  /** This field is thread exiting handler. */
  User_extensions_thread_exitted_extension      thread_exitted;
  /** This field is the fatal error extension. */
  User_extensions_fatal_extension               fatal;
}   User_extensions_Table;

/**
 *  This is used to manage the list of switch handlers.  They are managed
 *  separately from other extensions for performance reasons.
 */
typedef struct {
  /** This field is a Chain Node structure and allows this to be placed on
   *  chains for set management.
   */
  Chain_Node                              Node;
  /** This field is the thread switch extension. */
  User_extensions_thread_switch_extension thread_switch;
}   User_extensions_Switch_control;

/**
 *  This is used to manage each user extension set.
 *  The switch control is part of the extensions control even
 *  if not used due to the extension not having a switch
 *  handler.
 */
typedef struct {
  /** This field is a Chain Node structure and allows this to be placed on
   *  chains for set management.
   */
  Chain_Node                     Node;
  /** This field is the thread switch user extension. */
  User_extensions_Switch_control Switch;
  /** This field is the rest of this user extension's entry points.  */
  User_extensions_Table          Callouts;
}   User_extensions_Control;

/**
 *  This is used to manage the list of active extensions.
 */
SCORE_EXTERN Chain_Control _User_extensions_List;

/**
 *  This is used to manage a chain of user extension task
 *  switch nodes.
 */
SCORE_EXTERN Chain_Control _User_extensions_Switches_list;

/*@}*/
/** @addtogroup ScoreUserExt */

/*@{*/

/** @brief User extensions Handler Initialization
 *
 *  This routine performs the initialization necessary for this handler.
 *
 *  @param[in] number_of_extensions is the number of extensions
 *  @param[in] initial_extensions is the initial extension set
 */
void _User_extensions_Handler_initialization (
  uint32_t                number_of_extensions,
  User_extensions_Table  *initial_extensions
);

/** @brief User extensions Add to API extension set
 *
 *  This routine is used to add an API extension set to the active list.
 *
 *  @param[in] the_extension is the extension set to add
 */
void _User_extensions_Add_API_set (
  User_extensions_Control *the_extension
);

/** @brief User extensions Add extension set
 *
 *  This routine is used to add a user extension set to the active list.
 *
 *  @param[in] the_extension is the extension set to add
 *  @param[in] extension_table is the user's extension set
 */
void _User_extensions_Add_set (
  User_extensions_Control *the_extension,
  User_extensions_Table   *extension_table
);

/**
 *  This routine is used to remove a user extension set from the active list.
 */
void _User_extensions_Remove_set (
  User_extensions_Control  *the_extension
);

/** @brief  User extensions Thread create
 *
 *  This routine is used to invoke the user extension for
 *  the thread creation operate.
 *
 *  @param[in] the_thread is the thread being created.
 *
 *  @return This method returns TRUE if the user extension executed
 *          successfully.
 */
boolean _User_extensions_Thread_create (
  Thread_Control *the_thread
);

/** @brief  User extensions Thread delete
 *
 *  This routine is used to invoke the user extension for
 *  the thread deletion operation.
 *
 *  @param[in] the_thread is the thread being deleted.
 */
void _User_extensions_Thread_delete (
  Thread_Control *the_thread
);

/** @brief  User extensions Thread start
 *
 *  This routine is used to invoke the user extension for
 *  the thread start operation.
 *
 *  @param[in] the_thread is the thread being started.
 */
void _User_extensions_Thread_start (
  Thread_Control *the_thread
);

/** @brief  User extensions Thread restart
 *
 *  This routine is used to invoke the user extension for
 *  the thread restart operation.
 *
 *  @param[in] the_thread is the thread being restarted.
 */
void _User_extensions_Thread_restart (
  Thread_Control *the_thread
);

/** @brief  User extensions Thread begin
 *
 *  This routine is used to invoke the user extension which
 *  is invoked when a thread begins.
 *
 *  @param[in] executing is the thread beginning to execute.
 */
void _User_extensions_Thread_begin (
  Thread_Control *executing
);


/** @brief  User extensions Thread switch
 *
 *  This routine is used to invoke the user extension which
 *  is invoked when a context switch occurs.
 *
 *  @param[in] executing is the thread currently executing.
 *  @param[in] heir is the thread which will execute.
 */
void _User_extensions_Thread_switch (
  Thread_Control *executing,
  Thread_Control *heir
);

/** @brief  User extensions Thread exitted
 *
 *  This routine is used to invoke the user extension which
 *  is invoked when a thread exits.
 *
 *  @param[in] executing is the thread voluntarily exiting.
 */
void _User_extensions_Thread_exitted (
  Thread_Control *executing
);

/** @brief  User extensions Fatal
 *
 *  This routine is used to invoke the user extension invoked
 *  when a fatal error occurs.
 *
 *  @param[in] the_source is the source of the fatal error.
 *  @param[in] is_internal is TRUE if the error originated inside RTEMS.
 *  @param[in] the_error is an indication of the actual error.
 */
void _User_extensions_Fatal (
  Internal_errors_Source  the_source,
  boolean                 is_internal,
  uint32_t                the_error
);

#ifdef __cplusplus
}
#endif

/**@}*/

#endif
/* end of include file */