Subversion Repositories shark

Compare Revisions

Ignore whitespace Rev 317 → Rev 318

/shark/trunk/kernel/signal.c
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