* remove process from process group */
| 751 | * remove process from process group |
| 752 | */ |
| 753 | int |
| 754 | leavepgrp(struct proc *p) |
| 755 | { |
| 756 | struct pgrp *savepgrp; |
| 757 | |
| 758 | sx_assert(&proctree_lock, SX_XLOCKED); |
| 759 | savepgrp = p->p_pgrp; |
| 760 | PGRP_LOCK(savepgrp); |
| 761 | PROC_LOCK(p); |
| 762 | LIST_REMOVE(p, p_pglist); |
| 763 | p->p_pgrp = NULL; |
| 764 | PROC_UNLOCK(p); |
| 765 | PGRP_UNLOCK(savepgrp); |
| 766 | if (LIST_EMPTY(&savepgrp->pg_members)) |
| 767 | pgdelete(savepgrp); |
| 768 | return (0); |
| 769 | } |
| 770 | |
| 771 | /* |
| 772 | * delete a process group |