// -----------------------------------------------------------------------
-// Copyright (C) 2006 - 2007 FRESCOR consortium partners:
+// Copyright (C) 2006 - 2008 FRESCOR consortium partners:
//
// Universidad de Cantabria, SPAIN
// University of York, UK
// Scuola Superiore Sant'Anna, ITALY
// Kaiserslautern University, GERMANY
-// Univ. Politecnica Valencia, SPAIN
+// Univ. Politécnica 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
// 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.
+// based on previous work (FSF) done in the FIRST project
+//
+// Copyright (C) 2005 Mälardalen University, SWEDEN
+// Scuola Superiore S.Anna, ITALY
+// Universidad de Cantabria, SPAIN
+// University of York, UK
+//
+// FSF API web pages: http://marte.unican.es/fsf/docs
+// http://shark.sssup.it/contrib/first/docs/
//
-// 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.
+// This file is part of FOSA (Frsh Operating System Adaption)
//
-// 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.
+// FOSA is free software; you can redistribute it and/or modify it
+// under terms of the GNU General Public License as published by the
+// Free Software Foundation; either version 2, or (at your option) any
+// later version. FOSA 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 along with FOSA; see file
+// COPYING. If not, write to the Free Software Foundation, 675 Mass Ave,
+// Cambridge, MA 02139, 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.
+// As a special exception, including FOSA header files in a file,
+// instantiating FOSA generics or templates, or linking other files
+// with FOSA objects to produce an executable application, does not
+// by itself cause the resulting executable application 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 Public License.
// -----------------------------------------------------------------------
//fosa_opaque_types.h
//==============================================
// **//// /** ** ////////** /**//////**
// ** /** ** /** /** /**
// ** /** ** ******** /** /**
-// // /******/ //////// // //
+// // /******/ //////// // //
//
// FOSA(Frescor Operating System Adaptation layer)
//================================================
#include <stdbool.h>
-////////////////////////// RT_LINUX and MARTE_OS //////////////////////////////
+#include "fosa_cpp_macros.h"
+#include "fosa_opaque_types_time.h"
-#if defined(RT_LINUX) || defined(MARTE_OS)
+/////////////////////// MARTE_OS /////////////////////////////
+
+#ifdef MARTE_OS
#include <pthread.h>
#include <signal.h>
#include <time.h>
#include <sched.h>
+#include <errno.h>
+
+FOSA_CPP_BEGIN_DECLS
+
+
+/* Thread and signals */
+/**********************/
+typedef pthread_t FOSA_THREAD_ID_T_OPAQUE;
+typedef pthread_attr_t FOSA_THREAD_ATTR_T_OPAQUE;
+
+typedef int FOSA_SIGNAL_T_OPAQUE;
+/* Signal info is defined as a union in thread_and_signals */
+
+#define FOSA_SIGNAL_MIN SIGRTMIN
+#define FOSA_SIGNAL_MAX SIGRTMIN+0
+
+#define FOSA_NULL_SIGNAL 0
+
+/* Clocks and timers */
+/**********************/
+typedef clockid_t FOSA_CLOCK_ID_T_OPAQUE;
+typedef timer_t FOSA_TIMER_ID_T_OPAQUE;
+
+#define FOSA_SYSTEM_CLOCK_OPAQUE CLOCK_MONOTONIC
+
+/* Mutex and conditional variables */
+/***********************************/
+typedef pthread_mutex_t FOSA_MUTEX_T_OPAQUE;
+typedef pthread_cond_t FOSA_COND_T_OPAQUE;
+
+
+/* Application defined Scheduling */
+/**********************************/
+#define FOSA_ADS_ACTIONS_T_OPAQUE struct \
+{ \
+ posix_appsched_actions_t actions; \
+ struct timespec *timeout_ptr; \
+ struct timespec timeout; \
+ bool rejected; \
+ bool suspended; \
+ bool activated; \
+}
+
+
+/* Local jump */
+/**************/
+#include "marte_non_local_jmp.h"
+
+#define FOSA_LONG_JUMP_CONTEXT_T_OPAQUE struct { \
+ marte_nonlocaljmp_context_t marte_context; \
+ fosa_thread_id_t tid; \
+}
+
+
+/* Thread groups */
+/*****************/
+typedef marte_thread_set_t FOSA_THREAD_GROUP_ID_T_OPAQUE;
+
+#define FOSA_NULL_THREAD_GROUP_ID_OPAQUE 0 /* In MaRTE-OS thread_set_t are
+ * pointers */
+
+/* FOSA errors */
+/***************/
+/** Not enough memory available **/
+#define FOSA_ENOMEM ENOMEM
+
+/** Invalid parameter **/
+#define FOSA_EINVAL EINVAL
+
+/** Still pending information **/
+#define FOSA_EAGAIN EAGAIN
+
+/** FOSA ADS errors **/
+#ifdef MARTE_OS
+#define EREJECT 201 /* (for linux_lib_arch) Appsched has rejected object */
+#endif
+
+#define FOSA_EREJECT EREJECT
+#define FOSA_EMASKED -2
+#define FOSA_EPOLICY -3
+
+#define FOSA_ETIMEDOUT ETIMEDOUT
+
+/* Not found in search (non existing thread, thread_group...) */
+#define FOSA_ESRCH ESRCH
+#define FOSA_ENOTSUP ENOTSUP
+
+#endif
+
+/////////////////////// End of MARTE_OS /////////////////////////////
+
+
+/////////////////////// RT_LINUX ///////////////////////////
#ifdef RT_LINUX
+
+/* Very similar to MARTE_OS but I leave separate for clarity */
+
+#include <pthread.h>
+#include <signal.h>
+#include <time.h>
+#include <sched.h>
+#include <errno.h>
#include <rtl_timer.h>
-#endif
+
+/* Threads and signals */
+/***********************/
+#define FOSA_THREAD_ID_T_OPAQUE pthread_t
+
+typedef pthread_attr_t FOSA_THREAD_ATTR_T_OPAQUE;
+typedef int FOSA_SIGNAL_T_OPAQUE;
+/* Signal info is defined as a union in fosa_types.h */
+
+// The minimum and maximum signal numbers that may be used by the FRSH
+// implementation
+#define FOSA_SIGNAL_MIN SIGRTMIN
+#define FOSA_SIGNAL_MAX SIGRTMIN+0
+#define FOSA_NULL_SIGNAL 0
+
+/* Clocks and timers */
+/*********************/
#define FOSA_CLOCK_ID_T_OPAQUE clockid_t
-#define FOSA_SYSTEM_CLOCK_OPAQUE CLOCK_REALTIME
+#define FOSA_TIMER_ID_T_OPAQUE timer_t
+#define FOSA_SYSTEM_CLOCK_OPAQUE CLOCK_MONOTONIC
+
+/* Mutex and cond vars */
+/***********************/
+typedef pthread_mutex_t FOSA_MUTEX_T_OPAQUE;
+#define FOSA_COND_T_OPAQUE pthread_cond_t
+
+/* Thread groups */
+/*****************/
+typedef int FOSA_THREAD_GROUP_ID_T_OPAQUE
+
+/* FOSA Errors */
+/***************/
+/** Not enough memory available **/
+#define FOSA_ENOMEM ENOMEM
+/** Invalid parameter **/
+#define FOSA_EINVAL EINVAL
+/** Still pending information **/
+#define FOSA_EAGAIN EAGAIN
+
+/** FOSA ADS errors **/
+#define FOSA_EREJECT EREJECT
+#define FOSA_EMASKED -2
+#define FOSA_EPOLICY -3
+
+#define FOSA_ETIMEDOUT ETIMEDOUT
+
+#endif
+
+/////////////////////// End of RT_LINUX /////////////////////////////
+
+
+////////////////////////// OSE //////////////////////////////////////
+
+#ifdef OSE
+
+
+
+/* Put OSE dependent includes and defines here */
+
+#endif /* OSE */
+
+
+
+/////////////////////// AQuoSA ///////////////////////////
+
+#ifdef AQuoSA
+
+#include <unistd.h>
+#include <linux/unistd.h>
+
+#define _XOPEN_SOURCE 500
+#define __USE_UNIX98
+#include <pthread.h>
+
+#include <signal.h>
+#include <errno.h>
+#include <time.h>
+
+/* Time */
+/********/
+// typedef struct timespec fosa_rel_time_t;
+// typedef struct timespec fosa_abs_time_t;
+
+
+/* Threads and signals */
+/***********************/
+typedef struct {
+ pthread_t pthread_id;
+ pid_t linux_pid;
+ pid_t linux_tid;
+} FOSA_THREAD_ID_T_OPAQUE;
+
+
+typedef pthread_attr_t FOSA_THREAD_ATTR_T_OPAQUE;
+typedef int FOSA_SIGNAL_T_OPAQUE;
+
+
+// The minimum and maximum signal numbers that may be used by the FRSH
+// implementation
+#define FOSA_SIGNAL_MIN SIGRTMIN
+#define FOSA_SIGNAL_MAX SIGRTMIN+0
+#define FOSA_NULL_SIGNAL 0
+
+
+/* Thread groups */
+/*****************/
+typedef int FOSA_THREAD_GROUP_ID_T_OPAQUE;
+
+/* Clocks and signals */
+/**********************/
+#define FOSA_CLOCK_ID_T_OPAQUE clockid_t
+#define FOSA_SYSTEM_CLOCK_OPAQUE CLOCK_MONOTONIC
#define FOSA_TIMER_ID_T_OPAQUE timer_t
+
+
+/* Mutex and cond vars */
+/***********************/
+typedef pthread_mutex_t FOSA_MUTEX_T_OPAQUE;
#define FOSA_COND_T_OPAQUE pthread_cond_t
-/*********
- * ADS
- *********/
+
+/* Application Defined Scheduling */
+/**********************************/
+/* hack to get AQuoSA sources compile without having none
+ * of the application level scheduler header files and symbols */
+#define posix_appsched_actions_t int
+#define FOSA_LONG_JUMP_CONTEXT_T_OPAQUE int
+
+#define FOSA_ADS_ACTIONS_T_OPAQUE posix_appsched_actions_t
+
+
+/* FOSA Errors */
+
+/** Not enough memory available **/
+#define FOSA_ENOMEM ENOMEM
+
+/** Invalid parameter **/
+#define FOSA_EINVAL EINVAL
+
+/** Still pending information **/
+#define FOSA_EAGAIN EAGAIN
+
+#define FOSA_EREJECT EREJECT
+#define FOSA_EMASKED -2
+#define FOSA_EPOLICY -3
+
+#define FOSA_ETIMEDOUT ETIMEDOUT
+
+
+#endif
+////////////////// END of AQuoSA //////////////////////
+
+
+
+/////////////////////////////////// PARTIKLE ///////////////////////////////////////////
+#if defined(PARTIKLE)
+
+#include <pthread.h>
+#include <signal.h>
+#include <time.h>
+#include <sched.h>
+#include <stdlib.h>
+#include <setjmp.h>
+#include <limits.h>
typedef struct {
posix_appsched_actions_t actions;
bool rejected;
bool suspended;
bool activated;
-} fosa_ads_actions_internal_t;
+} FOSA_ADS_ACTIONS_T_OPAQUE;
+
+typedef unsigned long FOSA_LONG_JUMP_CONTEXT_T_OPAQUE [32];
+
+typedef pthread_t FOSA_THREAD_ID_T_OPAQUE;
+typedef pthread_attr_t FOSA_THREAD_ATTR_T_OPAQUE;
+typedef int FOSA_SIGNAL_T_OPAQUE;
+typedef clockid_t FOSA_CLOCK_ID_T_OPAQUE;
+typedef timer_t FOSA_TIMER_ID_T_OPAQUE;
+typedef pthread_cond_t FOSA_COND_T_OPAQUE;
+typedef pthread_mutex_t FOSA_MUTEX_T_OPAQUE;
-#define FOSA_ADS_ACTIONS_T_OPAQUE fosa_ads_actions_internal_t
+enum _fosa_clocks_e {
+ FOSA_SYSTEM_CLOCK_OPAQUE = CLOCK_MONOTONIC
+};
+#define LONGJMP_NSIG 3
+#if LONGJMP_NSIG > (RTSIG_MAX - 1)
+# error LONGJMP_NSIG too big (LONGJMP_NSIG > RTSIG_MAX - 1)
#endif
-////////////////////// END OF RT_LINUX and MARTE_OS //////////////////////////
+enum _fosa_signal_limits_e {
+ LONGJMP_FIRSTSIG = SIGRTMAX - LONGJMP_NSIG + 1,
+ FOSA_SIGNAL_MAX = LONGJMP_FIRSTSIG - 1,
+ FOSA_SIGNAL_MIN = FOSA_SIGNAL_MAX,
+};
+
+
+enum _fosa_errors_e {
+ FOSA_EINVAL = EINVAL,
+ FOSA_EAGAIN = EAGAIN,
+ FOSA_EREJECT = EREJECT,
+ FOSA_EMASKED = EMASKED,
+ FOSA_EPOLICY = EPOLICY,
+ FOSA_ETIMEDOUT = ETIMEDOUT,
+ FOSA_ENOMEM = ENOMEM,
+};
+
+
+
+
+#endif
+/////////////////////////////////// PARTIKLE END //////////////////////////////////////
+
+
+
+////////////////////////// VIRTUAL TIME //////////////////////////////////////
+#ifdef VIRTUAL_TIME
+
+/* Time */
+/********/
+// typedef struct timespec fosa_rel_time_t;
+// typedef struct timespec fosa_abs_time_t;
+
+#include <fosa_vt.h>
+
+#define FOSA_THREAD_ID_T_OPAQUE vt_posix_process_t
+#define FOSA_THREAD_ATTR_T_OPAQUE fosa_thread_attr_t
+#define FOSA_SIGNAL_T_OPAQUE int
+
+#define FOSA_MUTEX_T_OPAQUE fosa_mutex_t
+
+// The minimum and maximum signal numbers that may be used by the FRSH
+// implementation
+#define FOSA_SIGNAL_MIN 8
+#define FOSA_SIGNAL_MAX 31
+
+// the min. and max. priority a fosa thread can have
+#define FOSA_PRIORITY_MAX VT_PRIORITY_MIN - 1
+#define FOSA_PRIORITY_MIN VT_PRIORITY_MAX
+
+#define FOSA_NULL_SIGNAL 0
+
+/* FOSA Errors and return values*/
+
+/** Invalid parameter **/
+#define FOSA_EINVAL -1
+
+/** Not enough memory available **/
+#define FOSA_ENOMEM -2
+
+/** Still pending information **/
+#define FOSA_EAGAIN -3
+
+/** Mutex not available **/
+#define FOSA_EBUSY -4
+
+/** Cond var timedout **/
+#define FOSA_ETIMEDOUT -5
+
+/** FOSA ADS errors **/
+#define FOSA_EREJECT -6
+#define FOSA_EMASKED -7
+
+
+/** Sched policy not correct */
+#define FOSA_EPOLICY -8
+
+/** the value given by thread_id is not valid for ADS */
+#define FOSA_ESRCH -9
+
+/** retval if no action performed **/
+#define FOSA_NO_ACTION 0
+
+#endif /* VIRTUAL_TIME */
+//////////////////////////End of VIRTUAL TIME ///////////////////////////////////
////////////////////////// DUMMY_OS //////////////////////////////////////
/* independent at the FRSH code. */
/*****************************************************************/
-#define FOSA_CLOCK_ID_T_OPAQUE int
-#define FOSA_SYSTEM_CLOCK_OPAQUE 42
+/* Time */
+/********/
+// typedef struct timespec fosa_rel_time_t;
+// typedef struct timespec fosa_abs_time_t;
-#define FOSA_TIMER_ID_T_OPAQUE int
+/* Thread and signals */
+/**********************/
+typedef int FOSA_THREAD_ID_T_OPAQUE;
+typedef int FOSA_THREAD_ATTR_T_OPAQUE;
-#define FOSA_COND_T_OPAQUE int
+typedef int FOSA_SIGNAL_T_OPAQUE;
+typedef int FOSA_SIGNAL_INFO_T_OPAQUE;
-/*********
- * ADS
- *********/
+/* Signal info is defined as a union in thread_and_signals */
-#define FOSA_ADS_ACTIONS_T_OPAQUE int
+#define FOSA_SIGNAL_MIN 42
+#define FOSA_SIGNAL_MAX 44
+
+#define FOSA_NULL_SIGNAL 0
+/* Clocks and timers */
+/**********************/
+typedef int FOSA_CLOCK_ID_T_OPAQUE;
+typedef int FOSA_TIMER_ID_T_OPAQUE;
+#define FOSA_SYSTEM_CLOCK_OPAQUE 25
+
+/* Mutex and conditional variables */
+/***********************************/
+typedef int FOSA_MUTEX_T_OPAQUE;
+typedef int FOSA_COND_T_OPAQUE;
+
+/* Application defined Scheduling */
+/**********************************/
+#define FOSA_ADS_ACTIONS_T_OPAQUE int
#endif /* DUMMY */
//////////////////////////End of DUMMY_OS ////////////////////////////////////
-
+FOSA_CPP_END_DECLS
#endif // _FOSA_OPAQUE_TYPES_H_