* Copyright (c) 1982, 1986, 1989 Regents of the University of California.
* %sccs.include.redist.c%
* @(#)kern_proc.c 7.11 (Berkeley) %G%
#include "../ufs/quota.h"
* Is p an inferior of the current process?
for (; p
!= u
.u_procp
; p
= p
->p_pptr
)
* Locate a process by number
register struct proc
*p
= pidhash
[PIDHASH(pid
)];
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");
panic("pgmv: session leader attempted setpgrp");
panic("pgmv: new pgrp and pid != pgid");
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
)];
} else if (pgrp
== p
->p_pgrp
)
* adjust eligibility of affected pgrps to participate in job control
* unlink p from old process group
for (; *pp
; pp
= &(*pp
)->p_pgrpnxt
)
panic("pgmv: can't find p on old pgrp");
p
->p_pgrpnxt
= pgrp
->pg_mem
;
* adjust eligibility of affected pgrps to participate in job control
* remove process from process group
register struct proc
**pp
= &p
->p_pgrp
->pg_mem
;
for (; *pp
; pp
= &(*pp
)->p_pgrpnxt
)
panic("pgrm: can't find p in pgrp");
register struct pgrp
*pgrp
;
register struct pgrp
**pgp
= &pgrphash
[PIDHASH(pgrp
->pg_id
)];
if (pgrp
->pg_session
->s_ttyp
!= NULL
&&
pgrp
->pg_session
->s_ttyp
->t_pgrp
== pgrp
)
pgrp
->pg_session
->s_ttyp
->t_pgrp
= NULL
;
for (; *pgp
; pgp
= &(*pgp
)->pg_hforw
)
panic("pgdelete: can't find pgrp on hash chain");
if (--pgrp
->pg_session
->s_count
== 0)
FREE(pgrp
->pg_session
, M_SESSION
);
* Adjust pgrp jobc counter.
* flag == 0 => p is leaving current state.
* flag == 1 => p is entering current state.
register struct pgrp
*mypgrp
= p
->p_pgrp
, *hispgrp
;
register struct session
*mysession
= mypgrp
->pg_session
;
register struct proc
*qp
;
if ((hispgrp
= p
->p_pptr
->p_pgrp
) != mypgrp
&&
hispgrp
->pg_session
== mysession
)
else if (--mypgrp
->pg_jobc
== 0) {
for (qp
= mypgrp
->pg_mem
; qp
!= NULL
;
} else if (qp
->p_stat
== SSTOP
) {
for (p
= p
->p_cptr
; p
!= NULL
; p
= p
->p_osptr
)
if ((hispgrp
= p
->p_pgrp
) != mypgrp
&&
hispgrp
->pg_session
== mysession
&&
else if (--hispgrp
->pg_jobc
== 0) {
for (qp
= hispgrp
->pg_mem
; qp
!= NULL
;
} else if (qp
->p_stat
== SSTOP
) {
* 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",