1 //----------------------------------------------------------------------
2 // Copyright (C) 2006 - 2007 by the FRESCOR consortium:
4 // Universidad de Cantabria, SPAIN
5 // University of York, UK
6 // Scuola Superiore Sant'Anna, ITALY
7 // Kaiserslautern University, GERMANY
8 // Univ. Politecnica Valencia, SPAIN
9 // Czech Technical University in Prague, CZECH REPUBLIC
11 // Thales Communication S.A. FRANCE
12 // Visual Tools S.A. SPAIN
13 // Rapita Systems Ltd UK
16 // See http://www.frescor.org
18 // The FRESCOR project (FP6/2005/IST/5-034026) is funded
19 // in part by the European Union Sixth Framework Programme
20 // The European Union is not liable of any use that may be
24 // based on previous work (FSF) done in the FIRST project
26 // Copyright (C) 2005 Mälardalen University, SWEDEN
27 // Scuola Superiore S.Anna, ITALY
28 // Universidad de Cantabria, SPAIN
29 // University of York, UK
31 // This file is part of FOSA (Frsh Operating System Abstraction)
33 // FOSA is free software; you can redistribute it and/or modify it
34 // under terms of the GNU General Public License as published by the
35 // Free Software Foundation; either version 2, or (at your option) any
36 // later version. FOSA is distributed in the hope that it will be
37 // useful, but WITHOUT ANY WARRANTY; without even the implied warranty
38 // of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
39 // General Public License for more details. You should have received a
40 // copy of the GNU General Public License along with FOSA; see file
41 // COPYING. If not, write to the Free Software Foundation, 675 Mass Ave,
42 // Cambridge, MA 02139, USA.
44 // As a special exception, including FOSA header files in a file,
45 // instantiating FOSA generics or templates, or linking other files
46 // with FOSA objects to produce an executable application, does not
47 // by itself cause the resulting executable application to be covered
48 // by the GNU General Public License. This exception does not
49 // however invalidate any other reasons why the executable file might be
50 // covered by the GNU Public License.
51 // -----------------------------------------------------------------------
52 //fosa_thread_and_signals.h
53 //==============================================
54 // ******** ****** ******** **********
55 // **///// /** ** **////// /** /**
56 // ** /** ** /** /** /**
57 // ******* /** ** /********* /**********
58 // **//// /** ** ////////** /**//////**
59 // ** /** ** /** /** /**
60 // ** /** ** ******** /** /**
61 // // /******/ //////// // //
63 // FOSA(Frescor Operating System Adaptation layer)
64 //================================================
67 #ifndef FOSA_THREAD_AND_SIGNALS_H_
68 #define FOSA_THREAD_AND_SIGNALS_H_
70 #include "fosa_types.h"
73 * @defgroup threadandsignals Thread and Signals
76 * This module defines the functions that manipulate fosa_threads and
77 * fosa_signals inside FRSH implementation.
79 * Applications can refer to FRSH threads but they cannot create them
80 * directly, instead they must use frsh_thread_create*() which in turn
81 * use fosa_thread_create().
83 * For signals, we assume that the OS provides a direct mapping
84 * for fosa_signal_t and fosa_signal_info_t in the native interface.
91 /*************************
92 * Thread identification
93 *************************/
98 * Compare two thread identifiers to determine if they refer to the
101 bool fosa_thread_equal(fosa_thread_id_t t1, fosa_thread_id_t t2);
107 * Return the thread id of the calling thread
109 fosa_thread_id_t fosa_thread_self();
112 /*************************
114 *************************/
117 * fosa_thread_attr_init()
119 * Initialize a thread attributes object
121 * This function initializes the object pointed to by attr to all
122 * the default values defined by FRSH
124 * @return 0 if successful; otherwise it returns \n
125 * FOSA_ENOMEM: insufficient memory exists to initialize the thread
128 int fosa_thread_attr_init(fosa_thread_attr_t *attr);
132 * fosa_thread_attr_destroy()
134 * Destroy a thread attributes object
136 * This function is used to destroy the thread attributes object,
137 * pointed to by attr, and deallocate any system resources allocated for it
141 int fosa_thread_attr_destroy(fosa_thread_attr_t *attr);
145 * fosa_thread_attr_set_stacksize()
147 * Set the thread minimum stack size in a thread attributes object
149 * This function sets the minimum stack size of the thread attributes
150 * object attr to the value given by stacksize, in bytes. This
151 * function has no runtime effect on the stack size, except when the
152 * attributes object is used to create a thread, when it will be
153 * created with the specified minimum stack size
155 * @return 0 if successful, or the following error code:
156 * FOSA_EINVAL: the specified stacksize value is not supported in
157 * this implementation
159 int fosa_thread_attr_set_stacksize(fosa_thread_attr_t *attr,
163 * fosa_thread_attr_get_stacksize()
165 * Get the thread minimum stack size from a thread attributes object
167 * This function sets the variable pointed to by stacksize to the
168 * minimum stack size stored in the thread attributes object attr.
172 int fosa_thread_attr_get_stacksize(const fosa_thread_attr_t *attr,
176 /*************************
177 * Thread creation and termination
178 *************************/
181 * fosa_thread_create()
183 * This function creates a new thread using the attributes specified
184 * in attr. If attr is NULL, default attributes are used. The new
185 * thread starts running immediately, executing the function specified
186 * by code, with an argument equal to arg. Upon successful return, the
187 * variable pointed to by tid will contain the identifier of the newly
188 * created thread. The set of signals that may be synchronously
189 * accepted is inherited from the parent thread.
191 * Returns 0 if successful; otherwise it returs a code error:
193 * FOSA_EAGAIN: the system lacks the necessary resources to create a
194 * new thread or the maximum number of threads has been
197 * FOSA_EINVAL: the value specified by attr is invalid (for instance,
198 * it has not been correctly initialized)
200 * FOSA_EREJECT: the cretion of the thread was rejected by the frsh scheduler
201 * possibly because of incorrect attributes, or because the
202 * requested minimum capacity cannot be guaranteed
205 int fosa_thread_create
206 (fosa_thread_id_t *tid, const fosa_thread_attr_t *attr,
207 fosa_thread_code_t code, void * arg);
211 * Note: no thread termination primitive is provided. The termination
212 * of a thread will be notified by the system to the FRSH scheduler
213 * through the scheduler API
217 /**************************************************
218 * Thread-specific data
219 * (extended with access from a different thread)
221 * Several data items (pointers) may be associated with each thread
222 * Each item is identified through a key, an integer value between 0
223 * and FOSA_MAX_KEYS-1. The caller is responsible of allocating and
224 * deallocating the memory area pointed to by the pointer
225 **************************************************/
230 * Create a new key for thread specific data.
232 * Prior to setting data in a key, we need ask the system to create
233 * one for us. The thread specific data of all the threads is set to
234 * the value NULL until changed to a different value via
235 * fosa_thread_set_specific_data().
237 * @return 0 if successful \n
238 * FOSA_EINVAL If we already have reached the FOSA_MAX_KEYS limit.
239 * FOSA_ENOMEM If there are no enough memory resources to
242 int fosa_key_create(int *key);
249 * This destroys the key and disables its use in the system
251 * @return 0 if successful \n
252 * FOSA_EINVAL The key is not initialised or is not in FOSA key range.
254 int fosa_key_destroy(int key);
258 * fosa_thread_set_specific_data()
260 * Set thread-specific data
262 * For the thread identified by tid, the thread-specifid data field
263 * identified by key will be set to the value specified by value
265 * Returns 0 if successful; otherwise, an error code is returned
266 * FOSA_EINVAL: the value of key is not between 0 and FOSA_MAX_KEYS-1
268 * Alternatively, in case of error the implementation is allowed to
269 * notify it to the system console and then terminate the FRSH
270 * implementation and dependant applications
272 int fosa_thread_set_specific_data
273 (int key, fosa_thread_id_t tid, const void * value);
276 * fosa_thread_get_specific_data()
278 * Get thread-specific data
280 * For the thread identified by tid, the thread-specifid data field
281 * identified by key will be copied to the variable pointed to by value
283 * Returns 0 if successful; otherwise, an error code is returned
284 * FOSA_EINVAL: the value of key is not between 0 and FOSA_MAX_KEYS-1
286 * Alternatively, in case of error the implementation is allowed to
287 * notify it to the system console and then terminate the FRSH
288 * implementation and dependant applications
290 int fosa_thread_get_specific_data(int key, fosa_thread_id_t tid,
294 /******************************************************************
297 * This implementation of FRSH assumes an underlying fixed priority
298 * scheduler with priorities in a range, with a minimum and a
299 * maximumm, a number of priority levels with at least 31
300 * priorities. A larger number implies a larger priority. In systems
301 * in which the underlying scheduler uses the opposite convention, a
302 * mapping is automatically provided by the OS adaptation layer.
303 *******************************************************************/
306 * fosa_get_priority_max()
308 * Return the maximum priority value used in this implementation
310 int fosa_get_priority_max();
313 * fosa_get_priority_min()
315 * Return the minimum priority value used in this implementation
317 int fosa_get_priority_min();
320 * fosa_thread_attr_set_prio()
322 * Change the priority of a thread attributes object
324 * The priority of the thread attriutes object specified by attr is
325 * set to the value specified by prio. This function has no runtime
326 * effect on the priority, except when the attributes object is used
327 * to create a thread, when it will be created with the specified
330 * Returns 0 if successful, or the following error code:
331 * FOSA_EINVAL: the specified priority value is not between the
332 * minimum and the maximum priorities defined in this
333 * FRSH implementation
334 * Alternatively, in case of error the implementation is allowed to
335 * notify it to the system console and then terminate the FRSH
336 * implementation and dependant applications
338 int fosa_thread_attr_set_prio(fosa_thread_attr_t *attr, int prio);
341 * fosa_thread_attr_get_prio()
343 * Get the priority from a thread attributes object
345 * This function sets the variable pointed to by prio to the
346 * priority stored in the thread attributes object attr.
350 int fosa_thread_attr_get_prio
351 (const fosa_thread_attr_t *attr, int *prio);
354 * fosa_thread_set_prio()
356 * Dynamically change the priority of a thread
358 * The priority of the thread identified by tid is
359 * set to the value specified by prio.
361 * Returns 0 if successful, or the following error code:
362 * FOSA_EINVAL: the specified priority value is not between the
363 * minimum and the maximum priorities defined in this
364 * FRSH implementation
365 * Alternatively, in case of error the implementation is allowed to
366 * notify it to the system console and then terminate the FRSH
367 * implementation and dependant applications
369 int fosa_thread_set_prio(fosa_thread_id_t tid, int prio);
372 * fosa_thread_get_prio()
374 * Dynamically get the priority of a thread
376 * This function sets the variable pointed to by prio to the
377 * priority of the thread identified by tid
381 int fosa_thread_get_prio (fosa_thread_id_t tid, int *prio);
385 /*******************************************************************
388 * Signals represent events that may be notified by the system, or
389 * sent explicitly by the application, and for which a thread may
390 * synchronously wait. Signals carry an associated piece of
391 * information (an integer or a pointer) and are queued until they are
392 * accepted. Signals are identified by an integer signal number (of
393 * the type fosa_signal_t) in the range FOSA_SIGNAL_MIN,
394 * FOSA_SIGNAL_MAX. This range is required to have at least <tbd>
396 *******************************************************************/
399 * fosa_set_accepted_signals()
401 * Establish the set of signals that may be synchronously accepted
402 * by the calling thread
404 * The function uses the array of signal numbers specified by set,
405 * which must be of size equal to size
407 * Returns 0 if successful; otherwise it returns an error code:
408 * FOSA_EINVAL: the array contains one or more values which are not
409 * between FOSA_SIGNAL_MIN and FOSA_SIGNAL_MAX, or size
412 * Alternatively, in case of error the implementation is allowed to
413 * notify it to the system console and then terminate the FRSH
414 * implementation and dependant applications
416 int fosa_set_accepted_signals(fosa_signal_t set[], int size);
419 * fosa_signal_queue()
423 * This function is used to explicitly send a signal with a specified
426 * The signal number specified by signal is sent together with the
427 * information specified by info, to the thread identified by
428 * receiver. In those implementations that do not support queueing a
429 * signal with information to a thread (such as POSIX), the signal may
430 * be sent to any thread that is waiting for this signal via
431 * fosa_signal_wait(). Portability can be ensured by having the receiver
432 * thread be the one who is waiting for the signal.
434 * Returns 0 if successful; otherwise it returns an error code:
435 * FOSA_EINVAL: the signal specified by signal is not
436 * between FOSA_SIGNAL_MIN and FOSA_SIGNAL_MAX
438 * FOSA_EAGAIN: no resources are available to queue the signal; the
439 * maximum number of queued signals has been reached, or a
440 * systemwide resource limit has been exceeded
442 * Alternatively, in case of error the implementation is allowed to
443 * notify it to the system console and then terminate the FRSH
444 * implementation and dependant applications
446 int fosa_signal_queue
447 (fosa_signal_t signal, fosa_signal_info_t info,
448 fosa_thread_id_t receiver);
458 * The function waits for the arrival of one of the signals in the
459 * array of signal numbers specified by set, which must be of size
460 * equal to size. If there is a signal already queued, the function
461 * returns immediately. If there is no signal of the specified set
462 * queued, the calling thread is suspended until a signal from that
463 * set arrives. Upon return, if signal_received is not NULL the number
464 * of the signal received is stored in the variable pointed to by
465 * signal_received; and if info is not NULL the associated information
466 * is stored in the variable pointed to by info.
468 * Returns 0 if successful; otherwise it returns an error code:
469 * FOSA_EINVAL: the array contains one or more values which are not
470 * between FOSA_SIGNAL_MIN and FOSA_SIGNAL_MAX, or size
473 * Alternatively, in case of error the implementation is allowed to
474 * notify it to the system console and then terminate the FRSH
475 * implementation and dependant applications
478 (fosa_signal_t set[], int size, fosa_signal_t *signal_received,
479 fosa_signal_info_t *info);
482 * fosa_signal_timedwait()
484 * Timed wait for a signal
486 * This function behaves the same as fosa_signal_wait(), except that
487 * the suspension time is limited to the time interval specified in
488 * the timespec structure referenced by timeout.
490 * Returns 0 if successful; otherwise it returns an error code:
491 * FOSA_EINVAL: the array contains one or more values which are not
492 * between FOSA_SIGNAL_MIN and FOSA_SIGNAL_MAX, or size
493 * is less than 0, or timeout is invalid
494 * FOSA_EAGAIN: The timeout expired
496 * Alternatively, in case of the FOSA_EINVAL error the implementation is
497 * allowed to notify it to the system console and then terminate the
498 * FRSH implementation and dependant applications
500 int fosa_signal_timedwait
501 (fosa_signal_t set[], int size, fosa_signal_t *signal_received,
502 fosa_signal_info_t *info, const struct timespec *timeout);
507 #endif /* !FOSA_THREAD_AND_SIGNALS_H_ */