Lines Matching defs:pgrp
109 static void doenterpgrp(struct proc *, struct pgrp *);
110 static void orphanpg(struct pgrp *pg);
115 static void pgdelete(struct pgrp *);
202 pgrp_zone = uma_zcreate("PGRP", sizeof(struct pgrp), NULL, NULL,
310 struct pgrp *pg;
489 struct pgrp *
492 struct pgrp *pgrp;
496 LIST_FOREACH(pgrp, PGRPHASH(pgid), pg_hash) {
497 if (pgrp->pg_id == pgid) {
498 PGRP_LOCK(pgrp);
499 return (pgrp);
576 enterpgrp(struct proc *p, pid_t pgid, struct pgrp *pgrp, struct session *sess)
578 struct pgrp *old_pgrp;
582 KASSERT(pgrp != NULL, ("enterpgrp: pgrp == NULL"));
584 ("enterpgrp: new pgrp and pid != pgid"));
586 ("enterpgrp: pgrp with pgid exists"));
607 PGRP_LOCK(pgrp);
617 pgrp->pg_session = sess;
621 pgrp->pg_session = p->p_session;
622 sess_hold(pgrp->pg_session);
623 PGRP_LOCK(pgrp);
625 pgrp->pg_id = pgid;
627 LIST_INIT(&pgrp->pg_members);
628 pgrp->pg_flags = 0;
634 LIST_INSERT_HEAD(PGRPHASH(pgid), pgrp, pg_hash);
635 SLIST_INIT(&pgrp->pg_sigiolst);
636 PGRP_UNLOCK(pgrp);
638 doenterpgrp(p, pgrp);
648 enterthispgrp(struct proc *p, struct pgrp *pgrp)
650 struct pgrp *old_pgrp;
654 PGRP_LOCK_ASSERT(pgrp, MA_NOTOWNED);
657 KASSERT(pgrp->pg_session == p->p_session,
658 ("%s: pgrp's session %p, p->p_session %p proc %p\n",
659 __func__, pgrp->pg_session, p->p_session, p));
660 KASSERT(pgrp != p->p_pgrp,
661 ("%s: p %p belongs to pgrp %p", __func__, p, pgrp));
671 if (!sx_try_xlock(&pgrp->pg_killsx)) {
674 sx_xlock(&pgrp->pg_killsx);
675 sx_xunlock(&pgrp->pg_killsx);
679 doenterpgrp(p, pgrp);
681 sx_xunlock(&pgrp->pg_killsx);
687 * If true, any child of q which belongs to group pgrp, qualifies the
688 * process group pgrp as not orphaned.
691 isjobproc(struct proc *q, struct pgrp *pgrp)
695 return (q->p_pgrp != pgrp &&
696 q->p_pgrp->pg_session == pgrp->pg_session);
729 pgrp_calc_jobc(struct pgrp *pgrp)
735 if (!mtx_owned(&pgrp->pg_mtx))
740 LIST_FOREACH(q, &pgrp->pg_members, p_pglist) {
744 if (isjobproc(jobc_parent(q, NULL), pgrp))
754 doenterpgrp(struct proc *p, struct pgrp *pgrp)
756 struct pgrp *savepgrp;
761 PGRP_LOCK_ASSERT(pgrp, MA_NOTOWNED);
768 PGRP_LOCK(pgrp);
774 p->p_pgrp = pgrp;
776 LIST_INSERT_HEAD(&pgrp->pg_members, p, p_pglist);
777 if (isjobproc(pp, pgrp))
778 pgrp->pg_flags &= ~PGRP_ORPHANED;
780 PGRP_UNLOCK(pgrp);
791 struct pgrp *savepgrp;
810 pgdelete(struct pgrp *pgrp)
816 PGRP_LOCK_ASSERT(pgrp, MA_NOTOWNED);
817 SESS_LOCK_ASSERT(pgrp->pg_session, MA_NOTOWNED);
824 funsetownlst(&pgrp->pg_sigiolst);
826 PGRP_LOCK(pgrp);
827 tp = pgrp->pg_session->s_ttyp;
828 LIST_REMOVE(pgrp, pg_hash);
829 savesess = pgrp->pg_session;
830 PGRP_UNLOCK(pgrp);
832 /* Remove the reference to the pgrp before deallocating it. */
835 tty_rel_pgrp(tp, pgrp);
838 proc_id_clear(PROC_ID_GROUP, pgrp->pg_id);
839 uma_zfree(pgrp_zone, pgrp);
848 struct pgrp *pgrp;
852 pgrp = p->p_pgrp;
853 PGRP_LOCK_ASSERT(pgrp, MA_NOTOWNED);
854 SESS_LOCK_ASSERT(pgrp->pg_session, MA_NOTOWNED);
867 pgrp = p->p_pgrp;
868 if (isjobproc(jobc_parent(p, NULL), pgrp)) {
869 PGRP_LOCK(pgrp);
870 if (pgrp_calc_jobc(pgrp) == 0)
871 orphanpg(pgrp);
872 PGRP_UNLOCK(pgrp);
880 pgrp = q->p_pgrp;
881 PGRP_LOCK(pgrp);
882 if (pgrp_calc_jobc(pgrp) == 0) {
889 if (jobc_parent(q, p) == p && isjobproc(p, pgrp))
890 orphanpg(pgrp);
892 pgrp->pg_flags &= ~PGRP_ORPHANED;
893 PGRP_UNLOCK(pgrp);
896 pgrp = q->p_pgrp;
897 PGRP_LOCK(pgrp);
898 if (pgrp_calc_jobc(pgrp) == 0) {
899 if (isjobproc(p, pgrp))
900 orphanpg(pgrp);
902 pgrp->pg_flags &= ~PGRP_ORPHANED;
903 PGRP_UNLOCK(pgrp);
936 * Signal foreground pgrp and revoke access to
973 orphanpg(struct pgrp *pg)
1022 db_print_pgrp_one(struct pgrp *pgrp, struct proc *p)
1025 " pid %d at %p pr %d pgrp %p e %d jc %d\n",
1028 p->p_pptr == NULL ? 0 : isjobproc(p->p_pptr, pgrp));
1033 struct pgrp *pgrp;
1040 LIST_FOREACH(pgrp, &pgrphashtbl[i], pg_hash) {
1042 " pgrp %p, pgid %d, sess %p, sesscnt %d, mem %p\n",
1043 pgrp, (int)pgrp->pg_id, pgrp->pg_session,
1044 pgrp->pg_session->s_count,
1045 LIST_FIRST(&pgrp->pg_members));
1046 LIST_FOREACH(p, &pgrp->pg_members, p_pglist)
1047 db_print_pgrp_one(pgrp, p);
1200 struct pgrp *pgrp;
1205 pgrp = p->p_pgrp;
1206 if (pgrp == NULL)
1209 kp->ki_pgid = pgrp->pg_id;
1210 kp->ki_jobc = pgrp_calc_jobc(pgrp);
1212 sp = pgrp->pg_session;
1665 /* could do this by traversing pgrp */
3355 static SYSCTL_NODE(_kern_proc, KERN_PROC_PGRP, pgrp, CTLFLAG_RD | CTLFLAG_MPSAFE,