* Move p to a process group */
| 716 | * Move p to a process group |
| 717 | */ |
| 718 | static void |
| 719 | doenterpgrp(struct proc *p, struct pgrp *pgrp) |
| 720 | { |
| 721 | struct pgrp *savepgrp; |
| 722 | struct proc *pp; |
| 723 | |
| 724 | sx_assert(&proctree_lock, SX_XLOCKED); |
| 725 | PROC_LOCK_ASSERT(p, MA_NOTOWNED); |
| 726 | PGRP_LOCK_ASSERT(pgrp, MA_NOTOWNED); |
| 727 | PGRP_LOCK_ASSERT(p->p_pgrp, MA_NOTOWNED); |
| 728 | SESS_LOCK_ASSERT(p->p_session, MA_NOTOWNED); |
| 729 | |
| 730 | savepgrp = p->p_pgrp; |
| 731 | pp = jobc_parent(p, NULL); |
| 732 | |
| 733 | PGRP_LOCK(pgrp); |
| 734 | PGRP_LOCK(savepgrp); |
| 735 | if (isjobproc(pp, savepgrp) && pgrp_calc_jobc(savepgrp) == 1) |
| 736 | orphanpg(savepgrp); |
| 737 | PROC_LOCK(p); |
| 738 | LIST_REMOVE(p, p_pglist); |
| 739 | p->p_pgrp = pgrp; |
| 740 | PROC_UNLOCK(p); |
| 741 | LIST_INSERT_HEAD(&pgrp->pg_members, p, p_pglist); |
| 742 | if (isjobproc(pp, pgrp)) |
| 743 | pgrp->pg_flags &= ~PGRP_ORPHANED; |
| 744 | PGRP_UNLOCK(savepgrp); |
| 745 | PGRP_UNLOCK(pgrp); |
| 746 | if (LIST_EMPTY(&savepgrp->pg_members)) |
| 747 | pgdelete(savepgrp); |
| 748 | } |
| 749 | |
| 750 | /* |
| 751 | * remove process from process group |
no test coverage detected