View | Details | Raw Unified | Return to bug 174848
Collapse All | Expand All

(-)kvm_proc.c (-18 / +30 lines)
Lines 131-144 Link Here
131
	struct proc pproc;
131
	struct proc pproc;
132
	struct sysentvec sysent;
132
	struct sysentvec sysent;
133
	char svname[KI_EMULNAMELEN];
133
	char svname[KI_EMULNAMELEN];
134
	struct thread *td = NULL;
134
135
135
	kp = &kinfo_proc;
136
	kp = &kinfo_proc;
136
	kp->ki_structsize = sizeof(kinfo_proc);
137
	kp->ki_structsize = sizeof(kinfo_proc);
137
	/*
138
	/*
138
	 * Loop on the processes. this is completely broken because we need to be
139
	 * Loop on the processes, then threads within the process if requested.
139
	 * able to loop on the threads and merge the ones that are the same process some how.
140
	 */
140
	 */
141
	for (; cnt < maxcnt && p != NULL; p = LIST_NEXT(&proc, p_list)) {
141
	if (what == KERN_PROC_ALL)
142
		what |= KERN_PROC_INC_THREAD;
143
	for (; cnt < maxcnt && p != NULL; ) {
142
		memset(kp, 0, sizeof *kp);
144
		memset(kp, 0, sizeof *kp);
143
		if (KREAD(kd, (u_long)p, &proc)) {
145
		if (KREAD(kd, (u_long)p, &proc)) {
144
			_kvm_err(kd, kd->program, "can't read proc at %p", p);
146
			_kvm_err(kd, kd->program, "can't read proc at %p", p);
Lines 146-160 Link Here
146
		}
148
		}
147
		if (proc.p_state == PRS_NEW)
149
		if (proc.p_state == PRS_NEW)
148
			continue;
150
			continue;
151
		if (td == NULL)
152
			td = TAILQ_FIRST(&proc.p_threads);
149
		if (proc.p_state != PRS_ZOMBIE) {
153
		if (proc.p_state != PRS_ZOMBIE) {
150
			if (KREAD(kd, (u_long)TAILQ_FIRST(&proc.p_threads),
154
			if (KREAD(kd, (u_long)td, &mtd)) {
151
			    &mtd)) {
152
				_kvm_err(kd, kd->program,
155
				_kvm_err(kd, kd->program,
153
				    "can't read thread at %p",
156
				    "can't read thread at %p", td);
154
				    TAILQ_FIRST(&proc.p_threads));
155
				return (-1);
157
				return (-1);
156
			}
158
			}
157
		}
159
			if (what & KERN_PROC_INC_THREAD)
160
				td = TAILQ_NEXT(&mtd, td_plist);
161
			else
162
				td = NULL;
163
		} else
164
			td = NULL;
158
		if (KREAD(kd, (u_long)proc.p_ucred, &ucred) == 0) {
165
		if (KREAD(kd, (u_long)proc.p_ucred, &ucred) == 0) {
159
			kp->ki_ruid = ucred.cr_ruid;
166
			kp->ki_ruid = ucred.cr_ruid;
160
			kp->ki_svuid = ucred.cr_svuid;
167
			kp->ki_svuid = ucred.cr_svuid;
Lines 184-210 Link Here
184
191
185
		case KERN_PROC_GID:
192
		case KERN_PROC_GID:
186
			if (kp->ki_groups[0] != (gid_t)arg)
193
			if (kp->ki_groups[0] != (gid_t)arg)
187
				continue;
194
				goto next;
188
			break;
195
			break;
189
196
190
		case KERN_PROC_PID:
197
		case KERN_PROC_PID:
191
			if (proc.p_pid != (pid_t)arg)
198
			if (proc.p_pid != (pid_t)arg)
192
				continue;
199
				goto next;
193
			break;
200
			break;
194
201
195
		case KERN_PROC_RGID:
202
		case KERN_PROC_RGID:
196
			if (kp->ki_rgid != (gid_t)arg)
203
			if (kp->ki_rgid != (gid_t)arg)
197
				continue;
204
				goto next;
198
			break;
205
			break;
199
206
200
		case KERN_PROC_UID:
207
		case KERN_PROC_UID:
201
			if (kp->ki_uid != (uid_t)arg)
208
			if (kp->ki_uid != (uid_t)arg)
202
				continue;
209
				goto next;
203
			break;
210
			break;
204
211
205
		case KERN_PROC_RUID:
212
		case KERN_PROC_RUID:
206
			if (kp->ki_ruid != (uid_t)arg)
213
			if (kp->ki_ruid != (uid_t)arg)
207
				continue;
214
				goto next;
208
			break;
215
			break;
209
		}
216
		}
210
		/*
217
		/*
Lines 223-228 Link Here
223
		kp->ki_addr = 0;	/* XXX uarea */
230
		kp->ki_addr = 0;	/* XXX uarea */
224
		/* kp->ki_kstack = proc.p_thread.td_kstack; XXXKSE */
231
		/* kp->ki_kstack = proc.p_thread.td_kstack; XXXKSE */
225
		kp->ki_args = proc.p_args;
232
		kp->ki_args = proc.p_args;
233
		kp->ki_numthreads = proc.p_numthreads;
226
		kp->ki_tracep = proc.p_tracevp;
234
		kp->ki_tracep = proc.p_tracevp;
227
		kp->ki_textvp = proc.p_textvp;
235
		kp->ki_textvp = proc.p_textvp;
228
		kp->ki_fd = proc.p_fd;
236
		kp->ki_fd = proc.p_fd;
Lines 353-370 Link Here
353
361
354
		case KERN_PROC_PGRP:
362
		case KERN_PROC_PGRP:
355
			if (kp->ki_pgid != (pid_t)arg)
363
			if (kp->ki_pgid != (pid_t)arg)
356
				continue;
364
				goto next;
357
			break;
365
			break;
358
366
359
		case KERN_PROC_SESSION:
367
		case KERN_PROC_SESSION:
360
			if (kp->ki_sid != (pid_t)arg)
368
			if (kp->ki_sid != (pid_t)arg)
361
				continue;
369
				goto next;
362
			break;
370
			break;
363
371
364
		case KERN_PROC_TTY:
372
		case KERN_PROC_TTY:
365
			if ((proc.p_flag & P_CONTROLT) == 0 ||
373
			if ((proc.p_flag & P_CONTROLT) == 0 ||
366
			     kp->ki_tdev != (dev_t)arg)
374
			     kp->ki_tdev != (dev_t)arg)
367
				continue;
375
				goto next;
368
			break;
376
			break;
369
		}
377
		}
370
		if (proc.p_comm[0] != 0)
378
		if (proc.p_comm[0] != 0)
Lines 386-391 Link Here
386
		}
394
		}
387
		kp->ki_runtime = cputick2usec(proc.p_rux.rux_runtime);
395
		kp->ki_runtime = cputick2usec(proc.p_rux.rux_runtime);
388
		kp->ki_pid = proc.p_pid;
396
		kp->ki_pid = proc.p_pid;
397
		kp->ki_tid = mtd.td_tid;
389
		kp->ki_siglist = proc.p_siglist;
398
		kp->ki_siglist = proc.p_siglist;
390
		SIGSETOR(kp->ki_siglist, mtd.td_siglist);
399
		SIGSETOR(kp->ki_siglist, mtd.td_siglist);
391
		kp->ki_sigmask = mtd.td_sigmask;
400
		kp->ki_sigmask = mtd.td_sigmask;
Lines 424-431 Link Here
424
			kp->ki_pri.pri_native = mtd.td_base_pri;
433
			kp->ki_pri.pri_native = mtd.td_base_pri;
425
			kp->ki_lastcpu = mtd.td_lastcpu;
434
			kp->ki_lastcpu = mtd.td_lastcpu;
426
			kp->ki_wchan = mtd.td_wchan;
435
			kp->ki_wchan = mtd.td_wchan;
427
			if (mtd.td_name[0] != 0)
428
				strlcpy(kp->ki_tdname, mtd.td_name, MAXCOMLEN);
429
			kp->ki_oncpu = mtd.td_oncpu;
436
			kp->ki_oncpu = mtd.td_oncpu;
430
			if (mtd.td_name[0] != '\0')
437
			if (mtd.td_name[0] != '\0')
431
				strlcpy(kp->ki_tdname, mtd.td_name, sizeof(kp->ki_tdname));
438
				strlcpy(kp->ki_tdname, mtd.td_name, sizeof(kp->ki_tdname));
Lines 437-442 Link Here
437
		bcopy(&kinfo_proc, bp, sizeof(kinfo_proc));
444
		bcopy(&kinfo_proc, bp, sizeof(kinfo_proc));
438
		++bp;
445
		++bp;
439
		++cnt;
446
		++cnt;
447
next:
448
		if (td == NULL)
449
		    p = LIST_NEXT(&proc, p_list);
440
	}
450
	}
441
	return (cnt);
451
	return (cnt);
442
}
452
}
Lines 573-578 Link Here
573
			_kvm_err(kd, kd->program, "can't read nprocs");
583
			_kvm_err(kd, kd->program, "can't read nprocs");
574
			return (0);
584
			return (0);
575
		}
585
		}
586
		if (op == KERN_PROC_ALL || (op & KERN_PROC_INC_THREAD))
587
			nprocs *= 10;		/* XXX */
576
		if (KREAD(kd, nl[3].n_value, &ticks)) {
588
		if (KREAD(kd, nl[3].n_value, &ticks)) {
577
			_kvm_err(kd, kd->program, "can't read ticks");
589
			_kvm_err(kd, kd->program, "can't read ticks");
578
			return (0);
590
			return (0);
(-)ps.1 (+2 lines)
Lines 629-634 Link Here
629
thread address
629
thread address
630
.It Cm tdev
630
.It Cm tdev
631
control terminal device number
631
control terminal device number
632
.It Cm tid
633
thread ID, same as lwp
632
.It Cm time
634
.It Cm time
633
accumulated CPU time, user + system (alias
635
accumulated CPU time, user + system (alias
634
.Cm cputime )
636
.Cm cputime )
(-)keyword.c (+1 lines)
Lines 152-157 Link Here
152
	{"tdaddr", "TDADDR", NULL, 0, kvar, KOFF(ki_tdaddr), KPTR, "lx", 0},
152
	{"tdaddr", "TDADDR", NULL, 0, kvar, KOFF(ki_tdaddr), KPTR, "lx", 0},
153
	{"tdev", "TDEV", NULL, 0, tdev, 0, CHAR, NULL, 0},
153
	{"tdev", "TDEV", NULL, 0, tdev, 0, CHAR, NULL, 0},
154
	{"tdnam", "TDNAM", NULL, LJUST, tdnam, 0, CHAR, NULL, 0},
154
	{"tdnam", "TDNAM", NULL, LJUST, tdnam, 0, CHAR, NULL, 0},
155
	{"tid", "TID", NULL, 0, kvar, KOFF(ki_tid), UINT, LWPFMT, 0},
155
	{"time", "TIME", NULL, USER, cputime, 0, CHAR, NULL, 0},
156
	{"time", "TIME", NULL, USER, cputime, 0, CHAR, NULL, 0},
156
	{"tpgid", "TPGID", NULL, 0, kvar, KOFF(ki_tpgid), UINT, PIDFMT, 0},
157
	{"tpgid", "TPGID", NULL, 0, kvar, KOFF(ki_tpgid), UINT, PIDFMT, 0},
157
	{"tsid", "TSID", NULL, 0, kvar, KOFF(ki_tsid), UINT, PIDFMT, 0},
158
	{"tsid", "TSID", NULL, 0, kvar, KOFF(ki_tsid), UINT, PIDFMT, 0},
(-)print.c (-1 / +3 lines)
Lines 124-130 Link Here
124
			    k->ki_p->ki_comm,
124
			    k->ki_p->ki_comm,
125
			    (showthreads && k->ki_p->ki_numthreads > 1) ? "/" : "",
125
			    (showthreads && k->ki_p->ki_numthreads > 1) ? "/" : "",
126
			    (showthreads && k->ki_p->ki_numthreads > 1) ? k->ki_p->ki_tdname : "");
126
			    (showthreads && k->ki_p->ki_numthreads > 1) ? k->ki_p->ki_tdname : "");
127
		} else
127
		} else if (showthreads && k->ki_p->ki_numthreads > 1)
128
			asprintf(&str, "%s/%s", k->ki_p->ki_comm, k->ki_p->ki_tdname);
129
		else
128
			str = strdup(k->ki_p->ki_comm);
130
			str = strdup(k->ki_p->ki_comm);
129
131
130
		return (str);
132
		return (str);

Return to bug 174848