From: Kirk McKusick Date: Fri, 30 Apr 1993 00:17:35 +0000 (-0800) Subject: use sysctl to start and stop profiling X-Git-Tag: BSD-4_4-Snapshot-Development~1882 X-Git-Url: https://git.subgeniuskitty.com/unix-history/.git/commitdiff_plain/fb8a29c57f80ab97d2ed03306f7cbba243685003 use sysctl to start and stop profiling SCCS-vsn: usr.sbin/kgmon/kgmon.c 5.16 --- diff --git a/usr/src/usr.sbin/kgmon/kgmon.c b/usr/src/usr.sbin/kgmon/kgmon.c index 9561eeaec0..3599ad44dc 100644 --- a/usr/src/usr.sbin/kgmon/kgmon.c +++ b/usr/src/usr.sbin/kgmon/kgmon.c @@ -12,11 +12,12 @@ char copyright[] = #endif /* not lint */ #ifndef lint -static char sccsid[] = "@(#)kgmon.c 5.15 (Berkeley) %G%"; +static char sccsid[] = "@(#)kgmon.c 5.16 (Berkeley) %G%"; #endif /* not lint */ #include #include +#include #include #include #include @@ -104,12 +105,19 @@ void setprof(int state) { struct gmonparam *p = (struct gmonparam *)nl[N_GMONPARAM].n_value; - - if (kvm_write(kd, (u_long)&p->state, (void *)&state, sizeof(state)) != - sizeof(state)) - (void)fprintf(stderr, - "kgmon: warning: can't turn profiling %s\n", - state == GMON_PROF_OFF ? "off" : "on"); + int mib[3], sz; + + sz = sizeof(state); + if (!kflag) { + mib[0] = CTL_KERN; + mib[1] = KERN_PROF; + mib[2] = GPROF_STATE; + if (sysctl(mib, 3, NULL, NULL, &state, sz) >= 0) + return; + } else if (kvm_write(kd, (u_long)&p->state, (void *)&state, sz) == sz) + return; + (void)fprintf(stderr, "kgmon: warning: cannot turn profiling %s\n", + state == GMON_PROF_OFF ? "off" : "on"); } /* @@ -278,7 +286,11 @@ main(int argc, char **argv) #endif if (system == NULL) system = _PATH_UNIX; - openmode = (bflag || hflag || pflag || rflag) ? O_RDWR : O_RDONLY; + if (!kflag) + openmode = rflag ? O_RDWR : O_RDONLY; + else + openmode = + (bflag || hflag || pflag || rflag) ? O_RDWR : O_RDONLY; kd = kvm_openfiles(system, kmemf, NULL, openmode, errbuf); if (kd == NULL) { if (openmode == O_RDWR) { @@ -294,11 +306,7 @@ main(int argc, char **argv) (void)fprintf(stderr, "kgmon: kernel opened read-only\n"); if (rflag) (void)fprintf(stderr, "-r supressed\n"); - if (bflag) - (void)fprintf(stderr, "-b supressed\n"); - if (hflag) - (void)fprintf(stderr, "-h supressed\n"); - rflag = bflag = hflag = 0; + rflag = 0; } if (kvm_nlist(kd, nl) < 0) { (void)fprintf(stderr, "kgmon: %s: no namelist\n", system); @@ -324,13 +332,13 @@ main(int argc, char **argv) else disp = mode; if (pflag) { - if (openmode == O_RDONLY && mode == GMON_PROF_ON) + if (kflag && openmode == O_RDONLY && mode == GMON_PROF_ON) (void)fprintf(stderr, "data may be inconsistent\n"); dumpstate(&gmonparam); } if (rflag) reset(&gmonparam); - if (openmode == O_RDWR) + if (!kflag || openmode == O_RDWR) setprof(disp); (void)fprintf(stdout, "kernel profiling is %s.\n", disp == GMON_PROF_OFF ? "off" : "running");