18,11 → 18,11 |
|
/** |
------------ |
CVS : $Id: signal.c,v 1.4 2003-09-12 10:10:41 giacomo Exp $ |
CVS : $Id: signal.c,v 1.5 2003-11-05 15:05:12 giacomo Exp $ |
|
File: $File$ |
Revision: $Revision: 1.4 $ |
Last update: $Date: 2003-09-12 10:10:41 $ |
Revision: $Revision: 1.5 $ |
Last update: $Date: 2003-11-05 15:05:12 $ |
------------ |
|
This file contains: |
244,8 → 244,9 |
{ |
proc_des *task; /* current executing task... */ |
int err = 0; |
SYS_FLAGS f; |
|
kern_cli(); |
f = kern_fsave(); |
|
task = &proc_table[exec_shadow]; |
|
284,7 → 285,7 |
kern_deliver_async_signal(sig); |
} |
|
kern_sti(); |
kern_frestore(f); |
return err; |
} |
|
296,7 → 297,8 |
task_signal(PID p, int signo) |
{ |
// int enabled; |
|
SYS_FLAGS f; |
|
/* Error check? Sure! */ |
if (!signo) |
return 0; |
307,7 → 309,7 |
if (proc_table[p].status == FREE) |
return EINVAL; |
|
kern_cli(); |
f = kern_fsave(); |
|
/* |
* Look at the process sigactions. If the "process" is ignoring |
315,7 → 317,7 |
*/ |
if (!(sigactions[signo].sa_flags & SA_SIGINFO) && |
sigactions[signo].sa_handler == SIG_IGN) { |
kern_sti(); |
kern_frestore(f); |
return 0; |
} |
|
347,7 → 349,7 |
kern_deliver_pending_signals(); |
} |
|
kern_sti(); |
kern_frestore(f); |
return 0; |
} |
|
719,11 → 721,12 |
int thissig; |
|
LEVEL l; |
SYS_FLAGS f; |
|
task_testcancel(); |
|
/* siglock and pthread siglock are taken from an interrupt handler */ |
kern_cli(); |
f = kern_fsave(); |
|
/* |
* First check for process pending signals. Must take and hold |
744,7 → 747,7 |
|
sigdelset(&pthread->sigpending, thissig); |
sigdelset(&procsigpending, thissig); |
kern_sti(); |
kern_frestore(f); |
return 0; |
} |
|
774,7 → 777,7 |
sig_queue[sos].next = sigqueue_free; |
sigqueue_free = sos; |
} |
kern_sti(); |
kern_frestore(f); |
return 0; |
} |
|
787,7 → 790,7 |
info->si_code = SI_USER; |
info->si_value.sival_int = 0; |
sigdelset(&pthread->sigpending, thissig); |
kern_sti(); |
kern_frestore(f); |
return 0; |
} |
|
796,7 → 799,7 |
* is zero, its an error. |
*/ |
if (timeout && timeout->tv_sec == 0 && timeout->tv_nsec == 0) { |
kern_sti(); |
kern_frestore(f); |
return EAGAIN; |
} |
|
851,7 → 854,7 |
* Look for timeout. |
*/ |
if (proc_table[exec_shadow].control & SIGTIMEOUT_EXPIRED) { |
kern_sti(); |
kern_frestore(f); |
return EAGAIN; |
} |
|
873,7 → 876,7 |
info->si_value.sival_int = 0; |
|
sigdelset(&procsigpending, thissig); |
kern_sti(); |
kern_frestore(f); |
return 0; |
} |
|
903,7 → 906,7 |
sigqueue_free = sos; |
} |
|
kern_sti(); |
kern_frestore(f); |
return 0; |
} |
|
913,7 → 916,7 |
* thread wait was interrupted for some other reason. Return EINTR. |
*/ |
if (! (pthread->sigpending & *set)) { |
kern_sti(); |
kern_frestore(f); |
return EINTR; |
} |
|
925,7 → 928,7 |
info->si_code = SI_USER; |
info->si_value.sival_int = 0; |
sigdelset(&pthread->sigpending, thissig); |
kern_sti(); |
kern_frestore(f); |
return 0; |
} |
|
1016,12 → 1019,12 |
int sigsuspend(const sigset_t *set) |
{ |
proc_des *pthread = &proc_table[exec_shadow]; |
|
SYS_FLAGS f; |
LEVEL l; |
|
task_testcancel(); |
|
kern_cli(); |
f = kern_fsave(); |
|
/* |
* Now check for pthread pending signals. |
1028,7 → 1031,7 |
*/ |
if (pthread->sigpending & *set) { |
kern_deliver_pending_signals(); |
kern_sti(); |
kern_frestore(f); |
return 0; |
} |
|
1064,7 → 1067,7 |
* thread wait was interrupted for some other reason. Return EINTR. |
*/ |
if (! (pthread->sigpending & *set)) { |
kern_sti(); |
kern_frestore(f); |
return EINTR; |
} |
|
1072,7 → 1075,7 |
* Otherwise, deliver the signals. |
*/ |
kern_deliver_pending_signals(); |
kern_sti(); |
kern_frestore(f); |
return 0; |
} |
|
1092,8 → 1095,9 |
unsigned int alarm(unsigned int seconds) |
{ |
struct timespec returnvalue, temp; |
SYS_FLAGS f; |
|
kern_cli(); |
f = kern_fsave(); |
|
kern_gettime(&temp); |
|
1113,7 → 1117,7 |
else |
alarm_timer = -1; |
|
kern_sti(); |
kern_frestore(f); |
|
return returnvalue.tv_sec; |
} |
1300,7 → 1304,6 |
sigmask |= act.sa_mask; |
sigdelset(&task->sigpending, sig); |
task->sigmask = sigmask; |
kern_sti(); |
|
/* |
* and call the handler ... |
1314,7 → 1317,6 |
/* NB: when we pass the kern_cli(), there can be the case that |
an irq (and/or a timer...) fired... and do a context change. |
so, we return here after an indefinite time... */ |
kern_cli(); |
task->sigmask = oldmask; |
|
kern_frestore(f); |
1328,6 → 1330,7 |
void kern_raise(int n, PID p) |
{ |
union sigval v; |
SYS_FLAGS f; |
PID sos; /* temp. PID */ |
|
v.sival_int = n; |
1335,7 → 1338,7 |
|
/* sigqueue set the p field to exec_shadow... so whe change it for a |
little... because sigqueue fill descriptor with exec_shadow... */ |
kern_cli(); |
f = kern_fsave(); |
sos = exec_shadow; |
exec_shadow = p; |
|
1344,7 → 1347,7 |
active_exc = 0; |
|
exec_shadow = sos; |
kern_sti(); |
kern_frestore(f); |
|
/* (*) |
when we are in an exception, we don't have to call the |