Lines Matching refs:pgrp

108 static void doenterpgrp(struct proc *, struct pgrp *);
109 static void orphanpg(struct pgrp *pg);
114 static void pgdelete(struct pgrp *);
201 pgrp_zone = uma_zcreate("PGRP", sizeof(struct pgrp), NULL, NULL,
309 struct pgrp *pg;
487 struct pgrp *
490 struct pgrp *pgrp;
494 LIST_FOREACH(pgrp, PGRPHASH(pgid), pg_hash) {
495 if (pgrp->pg_id == pgid) {
496 PGRP_LOCK(pgrp);
497 return (pgrp);
574 enterpgrp(struct proc *p, pid_t pgid, struct pgrp *pgrp, struct session *sess)
579 KASSERT(pgrp != NULL, ("enterpgrp: pgrp == NULL"));
581 ("enterpgrp: new pgrp and pid != pgid"));
583 ("enterpgrp: pgrp with pgid exists"));
595 PGRP_LOCK(pgrp);
605 pgrp->pg_session = sess;
609 pgrp->pg_session = p->p_session;
610 sess_hold(pgrp->pg_session);
611 PGRP_LOCK(pgrp);
613 pgrp->pg_id = pgid;
615 LIST_INIT(&pgrp->pg_members);
616 pgrp->pg_flags = 0;
622 LIST_INSERT_HEAD(PGRPHASH(pgid), pgrp, pg_hash);
623 SLIST_INIT(&pgrp->pg_sigiolst);
624 PGRP_UNLOCK(pgrp);
626 doenterpgrp(p, pgrp);
635 enterthispgrp(struct proc *p, struct pgrp *pgrp)
640 PGRP_LOCK_ASSERT(pgrp, MA_NOTOWNED);
643 KASSERT(pgrp->pg_session == p->p_session,
644 ("%s: pgrp's session %p, p->p_session %p proc %p\n",
645 __func__, pgrp->pg_session, p->p_session, p));
646 KASSERT(pgrp != p->p_pgrp,
647 ("%s: p %p belongs to pgrp %p", __func__, p, pgrp));
649 doenterpgrp(p, pgrp);
655 * If true, any child of q which belongs to group pgrp, qualifies the
656 * process group pgrp as not orphaned.
659 isjobproc(struct proc *q, struct pgrp *pgrp)
663 return (q->p_pgrp != pgrp &&
664 q->p_pgrp->pg_session == pgrp->pg_session);
697 pgrp_calc_jobc(struct pgrp *pgrp)
703 if (!mtx_owned(&pgrp->pg_mtx))
708 LIST_FOREACH(q, &pgrp->pg_members, p_pglist) {
712 if (isjobproc(jobc_parent(q, NULL), pgrp))
722 doenterpgrp(struct proc *p, struct pgrp *pgrp)
724 struct pgrp *savepgrp;
729 PGRP_LOCK_ASSERT(pgrp, MA_NOTOWNED);
736 PGRP_LOCK(pgrp);
742 p->p_pgrp = pgrp;
744 LIST_INSERT_HEAD(&pgrp->pg_members, p, p_pglist);
745 if (isjobproc(pp, pgrp))
746 pgrp->pg_flags &= ~PGRP_ORPHANED;
748 PGRP_UNLOCK(pgrp);
759 struct pgrp *savepgrp;
778 pgdelete(struct pgrp *pgrp)
784 PGRP_LOCK_ASSERT(pgrp, MA_NOTOWNED);
785 SESS_LOCK_ASSERT(pgrp->pg_session, MA_NOTOWNED);
792 funsetownlst(&pgrp->pg_sigiolst);
794 PGRP_LOCK(pgrp);
795 tp = pgrp->pg_session->s_ttyp;
796 LIST_REMOVE(pgrp, pg_hash);
797 savesess = pgrp->pg_session;
798 PGRP_UNLOCK(pgrp);
800 /* Remove the reference to the pgrp before deallocating it. */
803 tty_rel_pgrp(tp, pgrp);
806 proc_id_clear(PROC_ID_GROUP, pgrp->pg_id);
807 uma_zfree(pgrp_zone, pgrp);
816 struct pgrp *pgrp;
820 pgrp = p->p_pgrp;
821 PGRP_LOCK_ASSERT(pgrp, MA_NOTOWNED);
822 SESS_LOCK_ASSERT(pgrp->pg_session, MA_NOTOWNED);
835 pgrp = p->p_pgrp;
836 if (isjobproc(jobc_parent(p, NULL), pgrp)) {
837 PGRP_LOCK(pgrp);
838 if (pgrp_calc_jobc(pgrp) == 0)
839 orphanpg(pgrp);
840 PGRP_UNLOCK(pgrp);
848 pgrp = q->p_pgrp;
849 PGRP_LOCK(pgrp);
850 if (pgrp_calc_jobc(pgrp) == 0) {
857 if (jobc_parent(q, p) == p && isjobproc(p, pgrp))
858 orphanpg(pgrp);
860 pgrp->pg_flags &= ~PGRP_ORPHANED;
861 PGRP_UNLOCK(pgrp);
864 pgrp = q->p_pgrp;
865 PGRP_LOCK(pgrp);
866 if (pgrp_calc_jobc(pgrp) == 0) {
867 if (isjobproc(p, pgrp))
868 orphanpg(pgrp);
870 pgrp->pg_flags &= ~PGRP_ORPHANED;
871 PGRP_UNLOCK(pgrp);
904 * Signal foreground pgrp and revoke access to
941 orphanpg(struct pgrp *pg)
990 db_print_pgrp_one(struct pgrp *pgrp, struct proc *p)
993 " pid %d at %p pr %d pgrp %p e %d jc %d\n",
996 p->p_pptr == NULL ? 0 : isjobproc(p->p_pptr, pgrp));
1001 struct pgrp *pgrp;
1008 LIST_FOREACH(pgrp, &pgrphashtbl[i], pg_hash) {
1010 " pgrp %p, pgid %d, sess %p, sesscnt %d, mem %p\n",
1011 pgrp, (int)pgrp->pg_id, pgrp->pg_session,
1012 pgrp->pg_session->s_count,
1013 LIST_FIRST(&pgrp->pg_members));
1014 LIST_FOREACH(p, &pgrp->pg_members, p_pglist)
1015 db_print_pgrp_one(pgrp, p);
1173 struct pgrp *pgrp;
1178 pgrp = p->p_pgrp;
1179 if (pgrp == NULL)
1182 kp->ki_pgid = pgrp->pg_id;
1183 kp->ki_jobc = pgrp_calc_jobc(pgrp);
1185 sp = pgrp->pg_session;
1638 /* could do this by traversing pgrp */
3131 static SYSCTL_NODE(_kern_proc, KERN_PROC_PGRP, pgrp, CTLFLAG_RD | CTLFLAG_MPSAFE,