BSD 4_2 release
[unix-history] / usr / src / ucb / gprof / hertz.c
#ifndef lint
static char *sccsid = "@(#)hertz.c 1.1 (Berkeley) 1/11/83";
#endif lint
/*
* discover the tick frequency of the machine
*/
#include <nlist.h>
#include <stdio.h>
struct nlist nl[] = {{"_hz"}, /* clock ticks per second */
{0}};
hertz()
{
int kmem; /* file descriptor for /dev/kmem */
long lseek();
long seeked; /* return value from lseek() */
long hz; /* buffer for reading from system */
int red; /* return value from read() */
int closed; /* return value from close() */
# define VMUNIX "/vmunix" /* location of the system namelist */
nlist(VMUNIX, nl);
if (nl[0].n_type == 0) {
fprintf(stderr, "no %s namelist entry for _hz\n", VMUNIX);
return 0;
}
# define KMEM "/dev/kmem" /* location of the system data space */
kmem = open(KMEM, 0);
if (kmem == -1) {
perror("hertz()");
fprintf(stderr, "open(\"%s\", 0)", KMEM);
return 0;
}
seeked = lseek(kmem, nl[0].n_value, 0);
if (seeked == -1) {
fprintf(stderr, "can't lseek(kmem, 0x%x, 0)\n", nl[0].n_value);
return 0;
}
red = read(kmem, &hz, sizeof hz);
if (red != sizeof hz) {
fprintf(stderr, "read(kmem, 0x%x, %d) returned %d\n",
&hz, sizeof hz, red);
return 0;
}
closed = close(kmem);
if (closed != 0) {
perror("hertz()");
fprintf(stderr, "close(\"%s\")", KMEM);
return 0;
}
return hz;
}