Lines Matching defs:pgrp

169 static void orphanpg(struct pgrp *pg);
173 static void pgrp_add(struct pgrp * pgrp, proc_t parent, proc_t child);
175 static void pgrp_replace(proc_t p, struct pgrp *pgrp);
176 static void pgdelete_dropref(struct pgrp *pgrp);
177 extern void pg_rele_dropref(struct pgrp * pgrp);
181 struct pgrp * pg;
907 struct pgrp *
910 struct pgrp * pgrp;
913 pgrp = pgfind_internal(pgid);
914 if ((pgrp == NULL) || ((pgrp->pg_listflags & PGRP_FLAG_TERMINATE) != 0))
915 pgrp = PGRP_NULL;
917 pgrp->pg_refcount++;
919 return(pgrp);
924 struct pgrp *
927 struct pgrp *pgrp;
929 for (pgrp = PGRPHASH(pgid)->lh_first; pgrp != 0; pgrp = pgrp->pg_hash.le_next)
930 if (pgrp->pg_id == pgid)
931 return (pgrp);
936 pg_rele(struct pgrp * pgrp)
938 if(pgrp == PGRP_NULL)
940 pg_rele_dropref(pgrp);
944 pg_rele_dropref(struct pgrp * pgrp)
947 if ((pgrp->pg_refcount == 1) && ((pgrp->pg_listflags & PGRP_FLAG_TERMINATE) == PGRP_FLAG_TERMINATE)) {
949 pgdelete_dropref(pgrp);
953 pgrp->pg_refcount--;
988 struct pgrp * pg;
1020 struct pgrp *pgrp;
1021 struct pgrp *mypgrp;
1024 pgrp = pgfind(pgid);
1029 if (pgrp != NULL && mksess) /* firewalls */
1030 panic("enterpgrp: setsid into non-empty pgrp");
1034 if (pgrp == PGRP_NULL) {
1042 panic("enterpgrp: new pgrp and pid != pgid");
1044 MALLOC_ZONE(pgrp, struct pgrp *, sizeof(struct pgrp), M_PGRP,
1046 if (pgrp == NULL)
1055 FREE_ZONE(pgrp, sizeof(struct pgrp), M_PGRP);
1088 pgrp->pg_session = sess;
1095 pgrp->pg_session = procsp;
1097 if ((pgrp->pg_session->s_listflags & (S_LIST_TERM | S_LIST_DEAD)) != 0)
1099 pgrp->pg_session->s_count++;
1102 pgrp->pg_id = pgid;
1104 lck_mtx_init(&pgrp->pg_mlock, proc_mlock_grp, proc_lck_attr);
1106 lck_mtx_init(&pgrp->pg_mlock, proc_lck_grp, proc_lck_attr);
1108 LIST_INIT(&pgrp->pg_members);
1109 pgrp->pg_membercnt = 0;
1110 pgrp->pg_jobc = 0;
1112 pgrp->pg_refcount = 1;
1113 pgrp->pg_listflags = 0;
1114 LIST_INSERT_HEAD(PGRPHASH(pgid), pgrp, pg_hash);
1116 } else if (pgrp == mypgrp) {
1117 pg_rele(pgrp);
1132 fixjobc(p, pgrp, 1);
1137 pgrp_replace(p, pgrp);
1138 pg_rele(pgrp);
1158 pgdelete_dropref(struct pgrp *pgrp)
1165 pgrp_lock(pgrp);
1166 if (pgrp->pg_membercnt != 0) {
1169 pgrp_unlock(pgrp);
1172 pgrp->pg_refcount--;
1173 if ((emptypgrp == 0) || (pgrp->pg_membercnt != 0)) {
1178 pgrp->pg_listflags |= PGRP_FLAG_TERMINATE;
1180 if (pgrp->pg_refcount > 0) {
1185 pgrp->pg_listflags |= PGRP_FLAG_DEAD;
1186 LIST_REMOVE(pgrp, pg_hash);
1190 ttyp = SESSION_TP(pgrp->pg_session);
1192 if (ttyp->t_pgrp == pgrp) {
1195 if (ttyp->t_pgrp == pgrp) {
1197 pgrp->pg_session->s_ttypgrpid = NO_PID;
1205 sessp = pgrp->pg_session;
1235 lck_mtx_destroy(&pgrp->pg_mlock, proc_mlock_grp);
1237 lck_mtx_destroy(&pgrp->pg_mlock, proc_lck_grp);
1239 FREE_ZONE(pgrp, sizeof(*pgrp), M_PGRP);
1244 * Adjust pgrp jobc counters when specified process changes process group.
1257 struct pgrp * pg, *hispg;
1290 fixjobc(proc_t p, struct pgrp *pgrp, int entering)
1292 struct pgrp *hispgrp = PGRP_NULL;
1294 struct session *mysession = pgrp->pg_session;
1310 if ((hispgrp != pgrp) &&
1312 pgrp_lock(pgrp);
1314 pgrp->pg_jobc++;
1315 pgrp_unlock(pgrp);
1316 }else if (--pgrp->pg_jobc == 0) {
1317 pgrp_unlock(pgrp);
1318 orphanpg(pgrp);
1320 pgrp_unlock(pgrp);
1333 fjarg.pg = pgrp;
1345 orphanpg(struct pgrp * pgrp)
1351 if (pgrp == PGRP_NULL)
1354 pgrp_lock(pgrp);
1355 for (p = pgrp->pg_members.lh_first; p != 0; p = p->p_pglist.le_next) {
1357 for (p = pgrp->pg_members.lh_first; p != 0;
1363 pgrp_unlock(pgrp);
1373 pgrp_lock(pgrp);
1374 for (p = pgrp->pg_members.lh_first; p != 0;
1377 for (p = pgrp->pg_members.lh_first; p != 0;
1387 pgrp_unlock(pgrp);
2214 pgrp_iterate(pgrp, flags, callout, arg, filterfn, filterarg)
2215 struct pgrp *pgrp;
2234 if (pgrp == 0)
2236 count = pgrp->pg_membercnt + 10;
2243 pgrp_lock(pgrp);
2245 while ((pgrp->pg_listflags & PGRP_FLAG_ITERABEGIN) == PGRP_FLAG_ITERABEGIN) {
2246 pgrp->pg_listflags |= PGRP_FLAG_ITERWAIT;
2247 msleep(&pgrp->pg_listflags, &pgrp->pg_mlock, 0, "pgrp_iterate", 0);
2249 pgrp->pg_listflags |= PGRP_FLAG_ITERABEGIN;
2252 pgid = pgrp->pg_id;
2255 for (p = pgrp->pg_members.lh_first; p != 0;
2266 pgrp_unlock(pgrp);
2268 pg_rele(pgrp);
2303 pgrp_lock(pgrp);
2304 pgrp->pg_listflags &= ~PGRP_FLAG_ITERABEGIN;
2305 if ((pgrp->pg_listflags & PGRP_FLAG_ITERWAIT) == PGRP_FLAG_ITERWAIT) {
2306 pgrp->pg_listflags &= ~PGRP_FLAG_ITERWAIT;
2307 wakeup(&pgrp->pg_listflags);
2309 pgrp_unlock(pgrp);
2311 pg_rele(pgrp);
2318 pgrp_add(struct pgrp * pgrp, struct proc * parent, struct proc * child)
2321 child->p_pgrp = pgrp;
2322 child->p_pgrpid = pgrp->pg_id;
2325 * When pgrp is being freed , a process can still
2328 * Safe to hold lock due to refcount on pgrp
2330 if ((pgrp->pg_listflags & (PGRP_FLAG_TERMINATE | PGRP_FLAG_DEAD)) == PGRP_FLAG_TERMINATE) {
2331 pgrp->pg_listflags &= ~PGRP_FLAG_TERMINATE;
2334 if ((pgrp->pg_listflags & PGRP_FLAG_DEAD) == PGRP_FLAG_DEAD)
2335 panic("pgrp_add : pgrp is dead adding process");
2338 pgrp_lock(pgrp);
2339 pgrp->pg_membercnt++;
2343 LIST_INSERT_HEAD(&pgrp->pg_members, child, p_pglist);
2345 pgrp_unlock(pgrp);
2348 if (((pgrp->pg_listflags & (PGRP_FLAG_TERMINATE | PGRP_FLAG_DEAD)) == PGRP_FLAG_TERMINATE) && (pgrp->pg_membercnt != 0)) {
2349 pgrp->pg_listflags &= ~PGRP_FLAG_TERMINATE;
2357 struct pgrp * pg;
2392 pgrp_replace(struct proc * p, struct pgrp * newpg)
2394 struct pgrp * oldpg;
2439 * When pgrp is being freed , a process can still
2442 * Safe to hold lock due to refcount on pgrp
2449 panic("pgrp_add : pgrp is dead adding process");
2472 pgrp_lock(struct pgrp * pgrp)
2474 lck_mtx_lock(&pgrp->pg_mlock);
2478 pgrp_unlock(struct pgrp * pgrp)
2480 lck_mtx_unlock(&pgrp->pg_mlock);
2496 struct pgrp *
2499 struct pgrp * pgrp;
2510 pgrp = p->p_pgrp;
2512 assert(pgrp != NULL);
2514 if (pgrp != PGRP_NULL) {
2515 pgrp->pg_refcount++;
2516 if ((pgrp->pg_listflags & (PGRP_FLAG_TERMINATE | PGRP_FLAG_DEAD)) != 0)
2517 panic("proc_pgrp: ref being povided for dead pgrp");
2522 return(pgrp);
2525 struct pgrp *
2528 struct pgrp * pg = PGRP_NULL;
2535 panic("tty_pgrp: ref being povided for dead pgrp");