1 // -----------------------------------------------------------------------
2 // Copyright (C) 2006 - 2008 FRESCOR consortium partners:
4 // Universidad de Cantabria, SPAIN
5 // University of York, UK
6 // Scuola Superiore Sant'Anna, ITALY
7 // Kaiserslautern University, GERMANY
8 // Univ. Politécnica 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 for a link to partners' websites
18 // 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 // FSF API web pages: http://marte.unican.es/fsf/docs
32 // http://shark.sssup.it/contrib/first/docs/
34 // This file is part of FOSA (Frsh Operating System Adaption)
36 // FOSA is free software; you can redistribute it and/or modify it
37 // under terms of the GNU General Public License as published by the
38 // Free Software Foundation; either version 2, or (at your option) any
39 // later version. FOSA is distributed in the hope that it will be
40 // useful, but WITHOUT ANY WARRANTY; without even the implied warranty
41 // of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
42 // General Public License for more details. You should have received a
43 // copy of the GNU General Public License along with FOSA; see file
44 // COPYING. If not, write to the Free Software Foundation, 675 Mass Ave,
45 // Cambridge, MA 02139, USA.
47 // As a special exception, including FOSA header files in a file,
48 // instantiating FOSA generics or templates, or linking other files
49 // with FOSA objects to produce an executable application, does not
50 // by itself cause the resulting executable application to be covered
51 // by the GNU General Public License. This exception does not
52 // however invalidate any other reasons why the executable file might be
53 // covered by the GNU Public License.
54 // -----------------------------------------------------------------------
55 //==============================================
56 // ******** ****** ******** **********
57 // **///// /** ** **////// /** /**
58 // ** /** ** /** /** /**
59 // ******* /** ** /********* /**********
60 // **//// /** ** ////////** /**//////**
61 // ** /** ** /** /** /**
62 // ** /** ** ******** /** /**
63 // // /******/ //////// // //
65 // FOSA(Frescor Operating System Adaptation layer)
66 //================================================
68 #include <fosa_mutexes_and_condvars.h>
69 #include <fosa_time.h>
71 /*******************************************************
72 * Mutexes with priority ceiling
73 ******************************************************/
74 int fosa_mutex_init(fosa_mutex_t *mutex, int prioceiling)
76 pthread_mutexattr_t attr;
79 err = pthread_mutexattr_init (&attr);
83 pthread_mutexattr_settype (&attr, PTHREAD_MUTEX_ERRORCHECK);
84 pthread_mutexattr_setprotocol (&attr, PTHREAD_PRIO_PROTECT);
85 err = pthread_mutexattr_setprioceiling (&attr, prioceiling);
89 return pthread_mutex_init (mutex, &attr);
92 int fosa_mutex_destroy(fosa_mutex_t *mutex)
94 return pthread_mutex_destroy (mutex);
97 int fosa_mutex_set_prioceiling
98 (fosa_mutex_t *mutex, int new_ceiling, int *old_ceiling)
100 return pthread_mutex_setprioceiling (mutex, new_ceiling, old_ceiling);
103 int fosa_mutex_get_prioceiling(const fosa_mutex_t *mutex, int *ceiling)
105 return pthread_mutex_getprioceiling (mutex, ceiling);
108 int fosa_mutex_lock(fosa_mutex_t *mutex)
110 return pthread_mutex_lock (mutex);
113 int fosa_mutex_trylock(fosa_mutex_t *mutex)
115 return pthread_mutex_trylock (mutex);
118 int fosa_mutex_unlock(fosa_mutex_t *mutex)
120 return pthread_mutex_unlock (mutex);
124 /**********************
125 * Condition variables
126 *********************/
127 int fosa_cond_init(fosa_cond_t *cond)
129 pthread_condattr_t attr;
132 err = pthread_condattr_init (&attr);
136 return pthread_cond_init (cond, NULL);
139 int fosa_cond_destroy(fosa_cond_t *cond)
141 return pthread_cond_destroy (cond);
144 int fosa_cond_signal(fosa_cond_t *cond)
146 return pthread_cond_signal (cond);
149 int fosa_cond_broadcast(fosa_cond_t *cond)
151 return pthread_cond_broadcast (cond);
154 int fosa_cond_wait(fosa_cond_t *cond, fosa_mutex_t *mutex)
156 return pthread_cond_wait (cond, mutex);
159 int fosa_cond_timedwait (fosa_cond_t *cond, fosa_mutex_t *mutex,
160 const fosa_abs_time_t *abstime)
163 struct timespec tout = fosa_abs_time_to_timespec (*abstime);
165 err = pthread_cond_timedwait (cond, mutex, &tout);
166 if (err == ETIMEDOUT)
167 return FOSA_ETIMEDOUT;