]> rtime.felk.cvut.cz Git - frescor/fosa.git/blobdiff - src_rtlinux/fosa_threads_and_signals.c
The implementation of FOSA for RTLinux has been completed
[frescor/fosa.git] / src_rtlinux / fosa_threads_and_signals.c
index e7f901c51a687cf459715c606c86f871de604d30..38c90c5537988eab3c0faa1a02393c9e44666538 100644 (file)
@@ -94,9 +94,8 @@ int fosa_thread_create (frsh_thread_id_t *tid, const frsh_thread_attr_t *attr,
 int fosa_thread_set_specific_data (int key, frsh_thread_id_t tid, 
                                            const void * value){
      if ((0<key) && (key<FOSA_MAX_KEYS-1)){
-          // MISSED
-          //pthread_setspecific_for(key, tid, value);
-          return 0;
+       tid->tsd[key] = (void *) value;
+       return 0;
      }
      return EINVAL;
 }
@@ -104,8 +103,9 @@ int fosa_thread_set_specific_data (int key, frsh_thread_id_t tid,
 int fosa_thread_get_specific_data(int key, frsh_thread_id_t tid, 
                                   void ** value){
      if ((0<key) && (key<FOSA_MAX_KEYS-1)){
-          *value=pthread_remote_getspecific(key,tid);
-          return 0;
+       //*value=pthread_remote_getspecific(key,tid);
+       *value=tid->tsd[key];
+       return 0;
      }
      return EINVAL;
 
@@ -132,12 +132,11 @@ int fosa_get_priority_min(){
 }
 
 int fosa_thread_attr_set_prio(frsh_thread_attr_t *attr, int prio) {
-       // MISSED
-     /*if ((ched_get_priority_min(0)<=prio) || (prio<=sched_get_priority_min(0))){
-          attr->sched_param.sched_priority = prio;
-          return 0;
-     }*/
-     return EINVAL;
+  if ((sched_get_priority_min(0)<=prio) || (prio<=sched_get_priority_min(0))){
+    attr->sched_param.sched_priority = prio;
+    return 0;
+  }
+  return EINVAL;
 }
 
 int fosa_thread_attr_get_prio (const frsh_thread_attr_t *attr, size_t *prio){
@@ -146,11 +145,11 @@ int fosa_thread_attr_get_prio (const frsh_thread_attr_t *attr, size_t *prio){
 }
 
 int fosa_thread_set_prio(frsh_thread_id_t tid, int prio){
-     if ((sched_get_priority_min(0)<=prio) || (prio<=sched_get_priority_min(0))){
-           pthread_setschedprio(tid,prio);
-           return 0;
-     }
-     return EINVAL;
+  if ((sched_get_priority_min(0)<=prio) || (prio<=sched_get_priority_min(0))){
+    pthread_setschedprio(tid,prio);
+    return 0;
+  }
+  return EINVAL;
 }
 
 int fosa_thread_get_prio (frsh_thread_id_t tid, int *prio){
@@ -176,57 +175,54 @@ int fosa_thread_get_prio (frsh_thread_id_t tid, int *prio){
 int fosa_set_accepted_signals(frsh_signal_t set[], int size) {
      int x;
      // MISSED
-     /*rtl_sigset_t bitset;
-
-     rtl_sigfillset(bitset); // By default all signals will be blocked.
+     rtl_sigset_t bitset;
+     
+     rtl_sigfillset(&bitset); // By default all signals will be blocked.
      for (x=0; x<size; x++)
-          rtl_sigdelset(bitset, set[x]); // Unblock the "set" of signals.
-     */
-     return 0;//pthread_sigmask(SIG_SETMASK, bitmask, NULL);
+          rtl_sigdelset(&bitset, set[x]); // Unblock the "set" of signals.
+     
+     return pthread_sigmask(SIG_SETMASK, &bitset, NULL);
 }
 
 
 int fosa_signal_queue (frsh_signal_t signal, frsh_signal_info_t info,
                        frsh_thread_id_t receiver){
-/*     union sigval value;
+     union sigval value;
      
-     value.sival_ptr=info;
-     return sigqueue(0, signal, value);*/
+     value.sival_ptr=info.area;
+     return sigqueue(0, signal, value);
 }
 
 int fosa_signal_wait (frsh_signal_t set[], int size, frsh_signal_t *signal_received, 
                                     frsh_signal_info_t *info){
-/*     int x;
-     rtl_sigset_t bitset;
-     siginfo_t __info;
-     
-     rtl_sigemptyset(bitset); // No signals to wait for;
-     for (x=0; x<size; x++)
-          rtl_sigaddset(bitset, set[x]); // Add to the set of signals to be waited for.
-     sigwaitinfo(&bitset, &__info);
-     *signal_received=__info.si_signo;
-     *info = __info.si_value.sival_ptr;
-*/
+  int x;
+  rtl_sigset_t bitset;
+  siginfo_t __info;
+  
+  rtl_sigemptyset(&bitset); // No signals to wait for;
+  for (x=0; x<size; x++)
+    rtl_sigaddset(&bitset, set[x]); // Add to the set of signals to be waited for.
+  sigwaitinfo(&bitset, &__info);
+  *signal_received=__info.si_signo;
+  //*info = __info.si_value.sival_ptr;
 }
 
-int fosa_signal_timedwait (frsh_signal_t set[], int size, frsh_signal_t *signal_received, 
-                                         frsh_signal_info_t *info, const struct timespec *timeout){
+int fosa_signal_timedwait (frsh_signal_t set[], int size, frsh_signal_t *signal_received, frsh_signal_info_t *info, const struct timespec *timeout){
+     
      
-  /*   
      int x;
      rtl_sigset_t bitset;
      siginfo_t __info;
      
-     rtl_sigemptyset(bitset); // No signals to wait for;
+     rtl_sigemptyset(&bitset); // No signals to wait for;
      for (x=0; x<size; x++)
-          rtl_sigaddset(bitset, set[x]); // Add to the set of signals to be waited for.
-
-         ????? // to be done
+          rtl_sigaddset(&bitset, set[x]); // Add to the set of signals to be waited for.
+    sigtimedwait(&bitset, &__info, timeout);
+     
      
      sigwaitinfo(&bitset, &__info);
      *signal_received=__info.si_signo;
-     *info = __info.si_value.sival_ptr;
-       ??????*/
+//     *info = __info.si_value.sival_ptr;
 }