* Copyright (c) 1982, 1986 Regents of the University of California.
* All rights reserved. The Berkeley software License Agreement
* specifies the terms and conditions for redistribution.
* @(#)kern_proc.c 7.3 (Berkeley) %G%
#include "../machine/reg.h"
#include "../machine/pte.h"
#include "../machine/psl.h"
* Clear any pending stops for top and all descendents.
~(sigmask(SIGTSTP
)|sigmask(SIGTTIN
)|sigmask(SIGTTOU
));
* If this process has children, descend to them next,
* otherwise do any siblings, and if done with this level,
* follow back up the tree (but not past top).
* Is p an inferior of the current process?
for (; p
!= u
.u_procp
; p
= p
->p_pptr
)
for (p
= &proc
[pidhash
[PIDHASH(pid
)]] ;
p
!= &proc
[0]; p
= &proc
[p
->p_idhash
])
return ((struct proc
*)0);
* Locate a process group by number
register struct pgrp
*pgrp
= pgrphash
[PIDHASH(pgid
)];
for (; pgrp
; pgrp
= pgrp
->pg_hforw
)
return ((struct pgrp
*)0);
* Move p to a new or existing process group (and session)
register struct pgrp
*pgrp
= pgfind(pgid
);
register struct proc
**pp
= &p
->p_pgrp
->pg_mem
;
register struct proc
*cp
;
if (pgrp
&& mksess
) /* firewalls */
panic("pgmv: setsid into non-empty pgrp %d\n", pgid
);
panic("pgmv: session leader attempted setpgrp\n");
panic("pgmv: new pgrp and pid != pgid\n");
MALLOC(pgrp
, struct pgrp
*, sizeof(struct pgrp
), M_PGRP
,
register struct session
*sess
;
MALLOC(sess
, struct session
*, sizeof(struct session
),
panic("pgmv: mksession and p != u.u_procp");
pgrp
->pg_session
= p
->p_session
;
pgrp
->pg_session
->s_count
++;
pgrp
->pg_hforw
= pgrphash
[n
=PIDHASH(pgid
)];
* adjust eligibility of affected pgrps to participate in job control
for (cp
= p
->p_cptr
; cp
; cp
= cp
->p_osptr
)
* unlink p from old process group
for (; *pp
; pp
= &(*pp
)->p_pgrpnxt
)
panic("pgmv: can't find p on old pgrp\n");
p
->p_pgrpnxt
= pgrp
->pg_mem
;
* adjust eligibility of affected pgrps to participate in job control
for (cp
= p
->p_cptr
; cp
; cp
= cp
->p_osptr
)
* remove process from process group
register struct proc
**pp
= &p
->p_pgrp
->pg_mem
;
register struct proc
*cp
;
for (; *pp
; pp
= &(*pp
)->p_pgrpnxt
)
panic("pgrm: can't find p in pgrp\n");
register struct pgrp
*pgrp
;
register struct pgrp
**pgp
= &pgrphash
[PIDHASH(pgrp
->pg_id
)];
for (; *pgp
; pgp
= &(*pgp
)->pg_hforw
)
panic("pgdelete: can't find pgrp on hash chain\n");
if (--pgrp
->pg_session
->s_count
== 0)
FREE(pgrp
->pg_session
, M_SESSION
);
* init the process queues
* most procs are initially on freequeue
* nb: we place them there in their "natural" order.
for (p
= procNPROC
; --p
> proc
; freeproc
= p
)
* but proc[0] is special ...
register struct pgrp
*pgrp
;
for (i
=0; i
<PIDHSZ
; i
++) {
printf("\tindx %d\n", i
);
for (pgrp
=pgrphash
[i
]; pgrp
; pgrp
=pgrp
->pg_hforw
) {
printf("\tpgrp %x, pgid %d, sess %x, sesscnt %d, mem %x\n",
pgrp
, pgrp
->pg_id
, pgrp
->pg_session
,
pgrp
->pg_session
->s_count
, pgrp
->pg_mem
);
for (p
=pgrp
->pg_mem
; p
; p
=p
->p_pgrpnxt
) {
printf("\t\tpid %d addr %x pgrp %x\n",