43 #include <sys/cdefs.h>
46 #include <sys/param.h>
48 #include <sys/mutex.h>
50 #include <sys/resourcevar.h>
51 #include <sys/sched.h>
52 #include <sys/systm.h>
57 #include <vm/vm_map.h>
73 #define TESTAB(a, b) ((a)<<1 | (b))
87 FOREACH_THREAD_IN_PROC(p, td) {
114 runa = TD_IS_RUNNING(td) | TD_ON_RUNQ(td);
115 slpa = td->td_flags & TDF_SINTR;
119 runb = TD_IS_RUNNING(td2) | TD_ON_RUNQ(td2);
121 slpb = td2->td_flags & TDF_SINTR;
126 switch (
TESTAB(runa, runb)) {
144 switch (
TESTAB(slpa, slpb)) {
180 switch (
TESTAB(runa, runb)) {
198 switch (
TESTAB(p1->p_state == PRS_ZOMBIE, p2->p_state == PRS_ZOMBIE)) {
207 return (p2->p_pid > p1->p_pid);
216 struct timeval rtime, utime, stime;
217 struct proc *p, *ppick;
218 struct thread *td, *tdpick;
219 const char *stateprefix, *state;
223 char comm[MAXCOMLEN + 1];
226 tty_lock_assert(tp, MA_OWNED);
232 load = (
averunnable.ldavg[0] * 100 + FSCALE / 2) >> FSHIFT;
233 ttyprintf(tp,
"%sload: %d.%02d ", tp->t_column == 0 ?
"" :
"\n",
234 load / 100, load % 100);
236 if (tp->t_session == NULL) {
237 ttyprintf(tp,
"not a controlling terminal\n");
240 if (tp->t_pgrp == NULL) {
241 ttyprintf(tp,
"no foreground process group\n");
244 PGRP_LOCK(tp->t_pgrp);
245 if (LIST_EMPTY(&tp->t_pgrp->pg_members)) {
246 PGRP_UNLOCK(tp->t_pgrp);
247 ttyprintf(tp,
"empty foreground process group\n");
259 LIST_FOREACH(ppick, &tp->t_pgrp->pg_members, p_pglist)
264 PGRP_UNLOCK(tp->t_pgrp);
266 FOREACH_THREAD_IN_PROC(p, tdpick)
271 if (TD_IS_RUNNING(td))
273 else if (TD_ON_RUNQ(td) || TD_CAN_RUN(td))
275 else if (TD_IS_SLEEPING(td)) {
277 if (TD_ON_SLEEPQ(td))
278 state = td->td_wmesg;
280 state =
"sleeping without queue";
281 }
else if (TD_ON_LOCK(td)) {
282 state = td->td_lockname;
284 }
else if (TD_IS_SUSPENDED(td))
286 else if (TD_AWAITING_INTR(td))
288 else if (p->p_state == PRS_ZOMBIE)
292 pctcpu = (
sched_pctcpu(td) * 10000 + FSCALE / 2) >> FSHIFT;
294 if (p->p_state == PRS_NEW || p->p_state == PRS_ZOMBIE)
297 rss = pgtok(vmspace_resident_count(p->p_vmspace));
302 strlcpy(comm, p->p_comm,
sizeof comm);
307 " cmd: %s %d [%s%s] %ld.%02ldr %ld.%02ldu %ld.%02lds %d%% %ldk\n",
308 comm, pid, stateprefix, state,
309 (
long)rtime.tv_sec, rtime.tv_usec / 10000,
310 (
long)utime.tv_sec, utime.tv_usec / 10000,
311 (
long)stime.tv_sec, stime.tv_usec / 10000,
static int thread_compare(struct thread *td, struct thread *td2)
void tty_info(struct tty *tp)
int ttyprintf(struct tty *tp, const char *fmt,...)
static int proc_compare(struct proc *p1, struct proc *p2)
void timevalsub(struct timeval *t1, const struct timeval *t2)
struct loadavg averunnable
void rufetchcalc(struct proc *p, struct rusage *ru, struct timeval *up, struct timeval *sp)
int tty_checkoutq(struct tty *tp)
static int proc_sum(struct proc *p, fixpt_t *estcpup)
void microuptime(struct timeval *tvp)
fixpt_t sched_pctcpu(struct thread *td)