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;
}
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;
}
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){
}
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){
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;
}