]> rtime.felk.cvut.cz Git - frescor/fosa.git/blobdiff - src_marte/fosa_threads_and_signals.c
Fixing license header
[frescor/fosa.git] / src_marte / fosa_threads_and_signals.c
index 39af09b952cb12c5836b2ca775eb99e2934eb5ad..2a999e0fd12f7f360772b9e47f7b1ae90a4a5f4e 100644 (file)
@@ -1,11 +1,11 @@
-//----------------------------------------------------------------------
-//  Copyright (C) 2006 - 2007 by the FRESCOR consortium:
+// -----------------------------------------------------------------------
+//  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
@@ -13,9 +13,9 @@
 //    Rapita Systems Ltd                     UK
 //    Evidence                               ITALY
 //
-//    See http://www.frescor.org
+//    See http://www.frescor.org for a link to partners' websites
 //
-//        The FRESCOR project (FP6/2005/IST/5-034026) is funded
+//           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.
 //                       Universidad de Cantabria, SPAIN
 //                       University of York, UK
 //
-// This file is part of FOSA (Frsh Operating System Abstraction)
+//   FSF API web pages: http://marte.unican.es/fsf/docs
+//                      http://shark.sssup.it/contrib/first/docs/
+//
+//   This file is part of FOSA (Frsh Operating System Adaption)
 //
-// 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.
+//  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, 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.
+//  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_threads_and_signals.c
 //==============================================
@@ -137,7 +140,7 @@ void init_keys() {
  * Compare two thread identifiers to determine if they refer to the 
  * same thread
  **/
-bool fosa_thread_equal(frsh_thread_id_t t1, frsh_thread_id_t t2)
+bool fosa_thread_equal(fosa_thread_id_t t1, fosa_thread_id_t t2)
 {
   return pthread_equal(t1,t2);
 }
@@ -148,11 +151,103 @@ bool fosa_thread_equal(frsh_thread_id_t t1, frsh_thread_id_t t2)
  *
  * Return the thread id of the calling thread
  **/
-frsh_thread_id_t fosa_thread_self()
+fosa_thread_id_t fosa_thread_self()
 {
   return pthread_self();
 }
 
+/*************************
+ * Thread attributes
+ *************************/ 
+
+/**
+ * fosa_thread_attr_init()
+ *
+ * Initialize a thread attributes object
+ *
+ * This function initializes the object pointed to by attr to all 
+ * the default values defined by FRSH
+ *
+ * @return 0 if successful; otherwise it returns \n
+ *   FOSA_ENOMEM: insufficient memory exists to initialize the thread 
+ *           attributes object
+ **/
+int fosa_thread_attr_init(fosa_thread_attr_t *attr)
+{
+  int ret_value;
+
+  ret_value=pthread_attr_init(attr);
+  if (ret_value==0) {
+    // set the default values
+
+    // detachstate = detached thread (no join operation allowed)
+    CHK(pthread_attr_setdetachstate(attr,PTHREAD_CREATE_DETACHED));
+
+    // inheritsched = explicit, so that we can explicitly set the attributes
+    CHK(pthread_attr_setinheritsched(attr,PTHREAD_EXPLICIT_SCHED));
+
+    // schedpolicy = fixed priorities
+    CHK(pthread_attr_setschedpolicy(attr,SCHED_FIFO));
+
+    // detachstate = detached thread (no join operation allowed)
+    CHK(pthread_attr_setdetachstate(attr,PTHREAD_CREATE_DETACHED));
+
+  }
+  return ret_value;
+}
+
+/**
+ * fosa_thread_attr_destroy()
+ *
+ * Destroy a thread attributes object
+ *
+ * This function is used to destroy the thread attributes object,
+ * pointed to by attr, and deallocate any system resources allocated for it
+ * 
+ * Returns 0
+ */
+int fosa_thread_attr_destroy(fosa_thread_attr_t *attr)
+{
+  return pthread_attr_destroy(attr);
+}
+
+/**
+ * fosa_thread_attr_set_stacksize()
+ *
+ * Set the thread minimum stack size in a thread attributes object
+ *
+ * This function sets the minimum stack size of the thread attributes
+ * object attr to the value given by stacksize, in bytes. This
+ * function has no runtime effect on the stack size, except when the
+ * attributes object is used to create a thread, when it will be
+ * created with the specified minimum stack size
+ * 
+ * @return 0 if successful, or the following error code:
+ *    FOSA_EINVAL: the specified stacksize  value is not supported in
+ *            this implementation
+ */
+int fosa_thread_attr_set_stacksize
+     (fosa_thread_attr_t *attr, size_t stacksize)
+{
+  return pthread_attr_setstacksize(attr,stacksize);
+}
+
+/**
+ * fosa_thread_attr_get_stacksize()
+ *
+ * Get the thread minimum stack size from a thread attributes object
+ *
+ * This function sets the variable pointed to by stacksize to the
+ * minimum stack size stored in the thread attributes object attr.
+ * 
+ * @return 0
+ */
+int fosa_thread_attr_get_stacksize
+      (const fosa_thread_attr_t *attr, size_t *stacksize)
+{
+  return pthread_attr_getstacksize(attr,stacksize);
+}
+
 
 /*************************
  * Thread creation and termination
@@ -184,8 +279,8 @@ frsh_thread_id_t fosa_thread_self()
  *
  **/
  int fosa_thread_create
-    (frsh_thread_id_t *tid, const frsh_thread_attr_t *attr, 
-     frsh_thread_code_t code, void * arg)
+    (fosa_thread_id_t *tid, const fosa_thread_attr_t *attr, 
+     fosa_thread_code_t code, void * arg)
 {
   return pthread_create(tid,attr,code,arg);
 }
@@ -226,6 +321,7 @@ int fosa_key_create(int *key)
   int i,ret_value;
   bool found=false;
 
+  ret_value = 0;
   // initialize the keys data structure if needed
   CHK(pthread_once(&keys_initialized, init_keys));
 
@@ -296,7 +392,7 @@ int fosa_key_destroy(int key)
  * implementation and dependant applications
  **/
  int fosa_thread_set_specific_data
-       (int key, frsh_thread_id_t tid, const void * value)
+       (int key, fosa_thread_id_t tid, const void * value)
 {
   return pthread_setspecific_for(key_list[key],tid,value);
 }
@@ -316,7 +412,7 @@ int fosa_key_destroy(int key)
  * notify it to the system console and then terminate the FRSH
  * implementation and dependant applications
  **/
-int fosa_thread_get_specific_data(int key, frsh_thread_id_t tid, 
+int fosa_thread_get_specific_data(int key, fosa_thread_id_t tid, 
                                   void ** value)
 {
   return pthread_getspecific_from(key_list[key],tid,value);
@@ -373,7 +469,7 @@ int fosa_get_priority_min()
  * notify it to the system console and then terminate the FRSH
  * implementation and dependant applications
  **/
-int fosa_thread_attr_set_prio(frsh_thread_attr_t *attr, int prio)
+int fosa_thread_attr_set_prio(fosa_thread_attr_t *attr, int prio)
 {
   struct sched_param param;
 
@@ -392,7 +488,7 @@ int fosa_thread_attr_set_prio(frsh_thread_attr_t *attr, int prio)
  * Returns 0
  **/
 int fosa_thread_attr_get_prio
-          (const frsh_thread_attr_t *attr, int *prio)
+          (const fosa_thread_attr_t *attr, int *prio)
 {
   struct sched_param param;
   int ret_value;
@@ -420,7 +516,7 @@ int fosa_thread_attr_get_prio
  * notify it to the system console and then terminate the FRSH
  * implementation and dependant applications
  **/
-int fosa_thread_set_prio(frsh_thread_id_t tid, int prio)
+int fosa_thread_set_prio(fosa_thread_id_t tid, int prio)
 {
   struct sched_param param;
   int policy, ret_value;
@@ -442,7 +538,7 @@ int fosa_thread_set_prio(frsh_thread_id_t tid, int prio)
  * 
  * Returns 0
  **/
-int fosa_thread_get_prio (frsh_thread_id_t tid, int *prio)
+int fosa_thread_get_prio (fosa_thread_id_t tid, int *prio)
 {
   struct sched_param param;
   int policy, ret_value;
@@ -464,7 +560,7 @@ int fosa_thread_get_prio (frsh_thread_id_t tid, int *prio)
  * synchronously wait. Signals carry an associated piece of
  * information (an integer or a pointer) and are queued until they are
  * accepted.  Signals are identified by an integer signal number (of
- * the type frsh_signal_t) in the range FOSA_SIGNAL_MIN,
+ * the type fosa_signal_t) in the range FOSA_SIGNAL_MIN,
  * FOSA_SIGNAL_MAX.  This range is required to have at least <tbd>
  * values.
  *******************************************************************/
@@ -487,7 +583,7 @@ int fosa_thread_get_prio (frsh_thread_id_t tid, int *prio)
  * notify it to the system console and then terminate the FRSH
  * implementation and dependant applications
  **/
-int fosa_set_accepted_signals(frsh_signal_t set[], int size)
+int fosa_set_accepted_signals(fosa_signal_t set[], int size)
 {
   sigset_t signalset;
   int i;
@@ -541,8 +637,8 @@ int fosa_set_accepted_signals(frsh_signal_t set[], int size)
  * implementation and dependant applications
  **/
 int fosa_signal_queue
-       (frsh_signal_t signal, frsh_signal_info_t info,
-        frsh_thread_id_t receiver)
+       (fosa_signal_t signal, fosa_signal_info_t info,
+        fosa_thread_id_t receiver)
 {
   // note: in MaRTE OS the signal is sent to any interested thread
   pid_t pid=1; // dummy value; the pid is ignored in MaRTE OS
@@ -583,8 +679,8 @@ int fosa_signal_queue
  * implementation and dependant applications
  **/
 int fosa_signal_wait
-      (frsh_signal_t set[], int size, frsh_signal_t *signal_received, 
-       frsh_signal_info_t *info)
+      (fosa_signal_t set[], int size, fosa_signal_t *signal_received, 
+       fosa_signal_info_t *info)
 {
   int err,i;
   sigset_t signalset;
@@ -598,7 +694,7 @@ int fosa_signal_wait
   err=sigwaitinfo(&signalset,&siginfo);
   if (err!=-1) {
     *signal_received=siginfo.si_signo;
-    *info=*((frsh_signal_info_t *)(&siginfo.si_value));
+    *info=*((fosa_signal_info_t *)(&siginfo.si_value));
     return 0;
   } else {
     return errno;
@@ -625,8 +721,8 @@ int fosa_signal_wait
  * FRSH implementation and dependant applications
  **/
  int fosa_signal_timedwait
-      (frsh_signal_t set[], int size, frsh_signal_t *signal_received, 
-       frsh_signal_info_t *info, const struct timespec *timeout)
+      (fosa_signal_t set[], int size, fosa_signal_t *signal_received, 
+       fosa_signal_info_t *info, const fosa_rel_time_t *timeout)
 {
 
   // the implementation of sigtimedwait is not yet available in MaRTE OS