Line | |
---|
1 | /* The kernel call that is implemented in this file:
|
---|
2 | * m_type: SYS_ENDKSIG
|
---|
3 | *
|
---|
4 | * The parameters for this kernel call are:
|
---|
5 | * m2_i1: SIG_ENDPT # process for which PM is done
|
---|
6 | */
|
---|
7 |
|
---|
8 | #include "../system.h"
|
---|
9 | #include <signal.h>
|
---|
10 | #include <sys/sigcontext.h>
|
---|
11 |
|
---|
12 | #if USE_ENDKSIG
|
---|
13 |
|
---|
14 | /*===========================================================================*
|
---|
15 | * do_endksig *
|
---|
16 | *===========================================================================*/
|
---|
17 | PUBLIC int do_endksig(m_ptr)
|
---|
18 | message *m_ptr; /* pointer to request message */
|
---|
19 | {
|
---|
20 | /* Finish up after a kernel type signal, caused by a SYS_KILL message or a
|
---|
21 | * call to cause_sig by a task. This is called by the PM after processing a
|
---|
22 | * signal it got with SYS_GETKSIG.
|
---|
23 | */
|
---|
24 | register struct proc *rp;
|
---|
25 | int proc;
|
---|
26 |
|
---|
27 | /* Get process pointer and verify that it had signals pending. If the
|
---|
28 | * process is already dead its flags will be reset.
|
---|
29 | */
|
---|
30 | if(!isokendpt(m_ptr->SIG_ENDPT, &proc))
|
---|
31 | return EINVAL;
|
---|
32 |
|
---|
33 | rp = proc_addr(proc);
|
---|
34 | if (! (rp->p_rts_flags & SIG_PENDING)) return(EINVAL);
|
---|
35 |
|
---|
36 | /* PM has finished one kernel signal. Perhaps process is ready now? */
|
---|
37 | if (! (rp->p_rts_flags & SIGNALED)) /* new signal arrived */
|
---|
38 | if ((rp->p_rts_flags &= ~SIG_PENDING)==0) /* remove pending flag */
|
---|
39 | lock_enqueue(rp); /* ready if no flags */
|
---|
40 | return(OK);
|
---|
41 | }
|
---|
42 |
|
---|
43 | #endif /* USE_ENDKSIG */
|
---|
44 |
|
---|
Note:
See
TracBrowser
for help on using the repository browser.