| 185 | } |
| 186 | |
| 187 | int |
| 188 | kern_setpriority(struct thread *td, int which, int who, int prio) |
| 189 | { |
| 190 | struct proc *curp, *p; |
| 191 | struct pgrp *pg; |
| 192 | int found = 0, error = 0; |
| 193 | |
| 194 | curp = td->td_proc; |
| 195 | switch (which) { |
| 196 | case PRIO_PROCESS: |
| 197 | if (who == 0) { |
| 198 | PROC_LOCK(curp); |
| 199 | error = donice(td, curp, prio); |
| 200 | PROC_UNLOCK(curp); |
| 201 | } else { |
| 202 | p = pfind(who); |
| 203 | if (p == NULL) |
| 204 | break; |
| 205 | error = p_cansee(td, p); |
| 206 | if (error == 0) |
| 207 | error = donice(td, p, prio); |
| 208 | PROC_UNLOCK(p); |
| 209 | } |
| 210 | found++; |
| 211 | break; |
| 212 | |
| 213 | case PRIO_PGRP: |
| 214 | sx_slock(&proctree_lock); |
| 215 | if (who == 0) { |
| 216 | pg = curp->p_pgrp; |
| 217 | PGRP_LOCK(pg); |
| 218 | } else { |
| 219 | pg = pgfind(who); |
| 220 | if (pg == NULL) { |
| 221 | sx_sunlock(&proctree_lock); |
| 222 | break; |
| 223 | } |
| 224 | } |
| 225 | sx_sunlock(&proctree_lock); |
| 226 | LIST_FOREACH(p, &pg->pg_members, p_pglist) { |
| 227 | PROC_LOCK(p); |
| 228 | if (p->p_state == PRS_NORMAL && |
| 229 | p_cansee(td, p) == 0) { |
| 230 | error = donice(td, p, prio); |
| 231 | found++; |
| 232 | } |
| 233 | PROC_UNLOCK(p); |
| 234 | } |
| 235 | PGRP_UNLOCK(pg); |
| 236 | break; |
| 237 | |
| 238 | case PRIO_USER: |
| 239 | if (who == 0) |
| 240 | who = td->td_ucred->cr_uid; |
| 241 | sx_slock(&allproc_lock); |
| 242 | FOREACH_PROC_IN_SYSTEM(p) { |
| 243 | PROC_LOCK(p); |
| 244 | if (p->p_state == PRS_NORMAL && |
no test coverage detected