X-Git-Url: https://rtime.felk.cvut.cz/gitweb/frescor/fosa.git/blobdiff_plain/9d662adffa40beabf4431361009b51e24ee69ea1..fdb98e52d61a335b6fa11c2413d7f5af6783cd8e:/src_partikle/fosa_mutexes_and_condvars.c diff --git a/src_partikle/fosa_mutexes_and_condvars.c b/src_partikle/fosa_mutexes_and_condvars.c index 5d688d7..5c7d34c 100644 --- a/src_partikle/fosa_mutexes_and_condvars.c +++ b/src_partikle/fosa_mutexes_and_condvars.c @@ -1,32 +1,162 @@ -/** fosa_mutexes_and_condvars.h - * - * < description > - * < author > - * < date > - */ +// ----------------------------------------------------------------------- +// Copyright (C) 2006 - 2007 FRESCOR consortium partners: +// +// Universidad de Cantabria, SPAIN +// University of York, UK +// Scuola Superiore Sant'Anna, ITALY +// Kaiserslautern University, GERMANY +// Univ. Politecnica Valencia, SPAIN +// Czech Technical University in Prague, CZECH REPUBLIC +// ENEA SWEDEN +// Thales Communication S.A. FRANCE +// Visual Tools S.A. SPAIN +// Rapita Systems Ltd UK +// Evidence ITALY +// +// See http://www.frescor.org for a link to partners' websites +// +// FRESCOR project (FP6/2005/IST/5-034026) is funded +// in part by the European Union Sixth Framework Programme +// The European Union is not liable of any use that may be +// made of this code. +// +// This file is part of the FRSH implementation +// +// FRSH is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2, or (at your option) +// any later version. +// +// FRSH is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// distributed with FRSH; see file COPYING. If not, write to the +// Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA +// 02111-1307, USA. +// +// As a special exception, if you include this header file into source +// files to be compiled, this header file does not by itself cause +// the resulting executable to be covered by the GNU General Public +// License. This exception does not however invalidate any other +// reasons why the executable file might be covered by the GNU General +// Public License. +// ----------------------------------------------------------------------- +//============================================== +// ******** ****** ******** ********** +// **///// /** ** **////// /** /** +// ** /** ** /** /** /** +// ******* /** ** /********* /********** +// **//// /** ** ////////** /**//////** +// ** /** ** /** /** /** +// ** /** ** ******** /** /** +// // /******/ //////// // // +// +// FOSA(Frescor Operating System Adaptation layer) +//================================================ #include /******************************************************* * Mutexes with priority ceiling ******************************************************/ -int fosa_mutex_init(frsh_mutex_t *mutex, int prioceiling); -int fosa_mutex_destroy(frsh_mutex_t *mutex); +int fosa_mutex_init(fosa_mutex_t *mutex, int prioceiling) +{ + pthread_mutexattr_t attr; + int err; + + if (err = pthread_mutexattr_init (&attr)) + return err; + + pthread_mutexattr_settype (&attr, PTHREAD_MUTEX_ERRORCHECK); + pthread_mutexattr_setprotocol (&attr, PTHREAD_PRIO_PROTECT); + if (err = pthread_mutexattr_setprioceiling (&attr, prioceiling)) + return err; + + return pthread_mutex_init (mutex, &attr); +} + +int fosa_mutex_destroy(fosa_mutex_t *mutex) +{ + return pthread_mutex_destroy (mutex); +} + int fosa_mutex_set_prioceiling - (frsh_mutex_t *mutex, int new_ceiling, int *old_ceiling); -int fosa_mutex_get_prioceiling(const frsh_mutex_t *mutex, int *ceiling); -int fosa_mutex_lock(frsh_mutex_t *mutex); -int fosa_mutex_trylock(frsh_mutex_t *mutex); -int fosa_mutex_unlock(frsh_mutex_t *mutex); + (fosa_mutex_t *mutex, int new_ceiling, int *old_ceiling) +{ + return pthread_mutex_setprioceiling (mutex, new_ceiling, old_ceiling); +} + +int fosa_mutex_get_prioceiling(const fosa_mutex_t *mutex, int *ceiling) +{ + return pthread_mutex_getprioceiling (mutex, ceiling); +} + +int fosa_mutex_lock(fosa_mutex_t *mutex) +{ + return pthread_mutex_lock (mutex); +} + +int fosa_mutex_trylock(fosa_mutex_t *mutex) +{ + return pthread_mutex_trylock (mutex); +} + +int fosa_mutex_unlock(fosa_mutex_t *mutex) +{ + return pthread_mutex_unlock (mutex); +} /********************** * Condition variables *********************/ -int fosa_cond_init(fosa_cond_t *cond); -int fosa_cond_destroy(fosa_cond_t *cond); -int fosa_cond_signal(fosa_cond_t *cond); -int fosa_cond_broadcast(fosa_cond_t *cond); -int fosa_cond_wait(fosa_cond_t *cond, frsh_mutex_t *mutex); -int fosa_cond_timedwait(fosa_cond_t *cond, frsh_mutex_t *mutex, - const struct timespec *abstime); +int fosa_cond_init(fosa_cond_t *cond) +{ + pthread_condattr_t attr; + int err; + + if (err = pthread_condattr_init (&attr)) + return err; + + return pthread_cond_init (cond, NULL); +} + +int fosa_cond_destroy(fosa_cond_t *cond) +{ + return pthread_cond_destroy (cond); +} + +int fosa_cond_signal(fosa_cond_t *cond) +{ + return pthread_cond_signal (cond); +} + +int fosa_cond_broadcast(fosa_cond_t *cond) +{ + return pthread_cond_broadcast (cond); +} + +int fosa_cond_wait(fosa_cond_t *cond, fosa_mutex_t *mutex) +{ + return pthread_cond_wait (cond, mutex); +} + +int fosa_cond_timedwait + (fosa_cond_t *cond, + fosa_mutex_t *mutex, + const struct timespec *abstime) +{ + int err; + + err = pthread_cond_timedwait (cond, mutex, abstime); + if (err == ETIMEDOUT) + return ETIMEDOUT; + + if (err) + return EINVAL; + + return 0; +}