int machine_init(struct statics * statics) { static struct var v; /* fill in the statics information */ statics->procstate_names = procstatenames; statics->cpustate_names = cpustatenames; statics->memory_names = memorynames; /* get the list of symbols we want to access in the kernel */ if (nlist(UNIX, nlst)) { (void) fprintf(stderr, "Unable to nlist %s\n", UNIX); return (-1); } /* make sure they were all found */ if (check_nlist(nlst) > 0) return (-1); /* open kernel memory */ if ((kmem = open(KMEM, O_RDONLY)) == -1) { perror(KMEM); return (-1); } /* get the symbol values out of kmem */ /* NPROC Tuning parameter for max number of processes */ (void) getkval(nlst[X_V].n_value, &v, sizeof(struct var), nlst[X_V].n_name); nproc = v.v_proc; /* stash away certain offsets for later use */ mpid_offset = nlst[X_MPID].n_value; nproc_offset = nlst[X_NPROC].n_value; avenrun_offset = nlst[X_AVENRUN].n_value; anoninfo_offset = nlst[X_ANONINFO].n_value; total_offset = nlst[X_TOTAL].n_value; /* JJ this may need to be changed */ sysinfo_offset = nlst[X_SYSINFO].n_value; /* allocate space for proc structure array and array of pointers */ bytes = nproc * sizeof(struct prpsinfo); pbase = (struct prpsinfo *) malloc(bytes); pref = (struct prpsinfo **) malloc(nproc * sizeof(struct prpsinfo *)); /* Just in case ... */ if (pbase == (struct prpsinfo *) NULL || pref == (struct prpsinfo **) NULL) { (void) fprintf(stderr, "%s: can't allocate sufficient memory\n", myname); return (-1); } if (!(proc_dir = opendir(PROCFS))) { (void) fprintf(stderr, "Unable to open %s\n", PROCFS); return (-1); } if (chdir(PROCFS)) { /* handy for later on when we're reading it */ (void) fprintf(stderr, "Unable to chdir to %s\n", PROCFS); return (-1); } /* all done! */ return (0); }
machine_init(struct statics *statics) { register int i = 0; register int pagesize; if ((kmem = open(KMEM, O_RDONLY)) == -1) { perror(KMEM); return(-1); } if ((mem = open(MEM, O_RDONLY)) == -1) { perror(MEM); return(-1); } #ifdef DOSWAP if ((swap = open(SWAP, O_RDONLY)) == -1) { perror(SWAP); return(-1); } #endif /* get the list of symbols we want to access in the kernel */ (void) nlist(VMUNIX, nlst); if (nlst[0].n_type == 0) { fprintf(stderr, "top: nlist failed\n"); return(-1); } /* make sure they were all found */ if (i > 0 && check_nlist(nlst) > 0) { return(-1); } /* get the symbol values out of kmem */ (void) getkval(nlst[X_PROC].n_value, (int *)(&proc), sizeof(proc), nlst[X_PROC].n_un.n_name); (void) getkval(nlst[X_NPROC].n_value, &nproc, sizeof(nproc), nlst[X_NPROC].n_un.n_name); (void) getkval(nlst[X_HZ].n_value, (int *)(&hz), sizeof(hz), nlst[X_HZ].n_un.n_name); /* (void) getkval(nlst[X_CCPU].n_value, (int *)(&ccpu), sizeof(ccpu), * nlst[X_CCPU].n_un.n_name); */ /* stash away certain offsets for later use */ mpid_offset = nlst[X_MPID].n_value; avenrun_offset = nlst[X_AVENRUN].n_value; total_offset = nlst[X_TOTAL].n_value; cp_time_offset = nlst[X_CP_TIME].n_value; /* this is used in calculating WCPU -- calculate it ahead of time */ /* ccpu = mach_load_avg(); * logcpu = log((double)(ccpu)/LOAD_SCALE); */ /* allocate space for proc structure array and array of pointers */ bytes = nproc * sizeof(struct proc); pbase = (struct proc *)malloc(bytes); pref = (struct proc_unix *)malloc((nproc+1) * sizeof(struct proc_unix *)); /* Just in case ... */ if (pbase == (struct proc *)NULL || pref == (struct proc_unix *)NULL) { fprintf(stderr, "top: can't allocate sufficient memory\n"); return(-1); } /* get the page size with "getpagesize" and calculate pageshift from it */ pagesize = getpagesize(); pageshift = ceil(log(pagesize)/log(2.0)); /* we only need the amount of log(2)1024 for our conversion */ pageshift -= LOG1024; /* fill in the statics information */ statics->procstate_names = procstatenames; statics->cpustate_names = cpustatenames; statics->memory_names = memorynames; /* all done! */ return(0); }
int machine_init (struct statics *statics) { int i; static struct var v; /* fill in the statics information */ statics->procstate_names = procstatenames; statics->cpustate_names = cpustatenames; statics->memory_names = memorynames; /* get the list of symbols we want to access in the kernel */ if (nlist (UNIX, nlst)) { (void) fprintf (stderr, "Unable to nlist %s\n", UNIX); return (-1); } /* make sure they were all found */ if (check_nlist (nlst) > 0) return (-1); /* open kernel memory */ if ((kmem = open (KMEM, O_RDONLY)) == -1) { perror (KMEM); return (-1); } /* Open the sar driver device node. */ if ((sar = open(SAR, O_RDONLY)) == -1) { perror (SAR); return (-1); } /* get the symbol values out of kmem */ /* NPROC Tuning parameter for max number of processes */ (void) getkval (nlst[X_V].n_value, &v, sizeof (struct var), nlst[X_V].n_name); nproc = v.v_proc; /* stash away certain offsets for later use */ mpid_offset = nlst[X_MPID].n_value; nproc_offset = nlst[X_NPROC].n_value; avenrun_offset = nlst[X_AVENRUN].n_value; anoninfo_offset = nlst[X_ANONINFO].n_value; total_offset = nlst[X_TOTAL].n_value; /* allocate space for proc structure array and array of pointers */ bytes = nproc * sizeof (struct prpsinfo); pbase = (struct prpsinfo *) malloc (bytes); pref = (struct prpsinfo **) malloc (nproc * sizeof (struct prpsinfo *)); /* Just in case ... */ if (pbase == (struct prpsinfo *) NULL || pref == (struct prpsinfo **) NULL) { (void) fprintf (stderr, "%s: can't allocate sufficient memory\n", myname); return (-1); } if (!(procdir = opendir (PROCFS))) { (void) fprintf (stderr, "Unable to open %s\n", PROCFS); return (-1); } if (chdir (PROCFS)) { /* handy for later on when we're reading it */ (void) fprintf (stderr, "Unable to chdir to %s\n", PROCFS); return (-1); } /* Set up the pointers to the sysinfo data area. */ spa.uvcp = (caddr_t) &cpu_state[0]; spa.uvsp = (caddr_t) &cpu_sysinfo[0]; timedata.lnext = &timedata; timedata.llast = &timedata; for (i = 0; i < HASHSZ; i++) { hash[i].hnext = (timedata_t *)&hash[i]; hash[i].hlast = (timedata_t *)&hash[i]; } /* all done! */ return (0); }