| 96 | } |
| 97 | |
| 98 | int |
| 99 | kern_getpriority(struct thread *td, int which, int who) |
| 100 | { |
| 101 | struct proc *p; |
| 102 | struct pgrp *pg; |
| 103 | int error, low; |
| 104 | |
| 105 | error = 0; |
| 106 | low = PRIO_MAX + 1; |
| 107 | switch (which) { |
| 108 | case PRIO_PROCESS: |
| 109 | if (who == 0) |
| 110 | low = td->td_proc->p_nice; |
| 111 | else { |
| 112 | p = pfind(who); |
| 113 | if (p == NULL) |
| 114 | break; |
| 115 | if (p_cansee(td, p) == 0) |
| 116 | low = p->p_nice; |
| 117 | PROC_UNLOCK(p); |
| 118 | } |
| 119 | break; |
| 120 | |
| 121 | case PRIO_PGRP: |
| 122 | sx_slock(&proctree_lock); |
| 123 | if (who == 0) { |
| 124 | pg = td->td_proc->p_pgrp; |
| 125 | PGRP_LOCK(pg); |
| 126 | } else { |
| 127 | pg = pgfind(who); |
| 128 | if (pg == NULL) { |
| 129 | sx_sunlock(&proctree_lock); |
| 130 | break; |
| 131 | } |
| 132 | } |
| 133 | sx_sunlock(&proctree_lock); |
| 134 | LIST_FOREACH(p, &pg->pg_members, p_pglist) { |
| 135 | PROC_LOCK(p); |
| 136 | if (p->p_state == PRS_NORMAL && |
| 137 | p_cansee(td, p) == 0) { |
| 138 | if (p->p_nice < low) |
| 139 | low = p->p_nice; |
| 140 | } |
| 141 | PROC_UNLOCK(p); |
| 142 | } |
| 143 | PGRP_UNLOCK(pg); |
| 144 | break; |
| 145 | |
| 146 | case PRIO_USER: |
| 147 | if (who == 0) |
| 148 | who = td->td_ucred->cr_uid; |
| 149 | sx_slock(&allproc_lock); |
| 150 | FOREACH_PROC_IN_SYSTEM(p) { |
| 151 | PROC_LOCK(p); |
| 152 | if (p->p_state == PRS_NORMAL && |
| 153 | p_cansee(td, p) == 0 && |
| 154 | p->p_ucred->cr_uid == who) { |
| 155 | if (p->p_nice < low) |
no test coverage detected