hubert@uw-entropy.ms.washington.edu (Steve Hubert) (06/06/89)
Can anyone tell me how to do what I am obviously attempting to do below
on the next?  These few lines are from sendmail 5.61.  I presume that
the Mach nlist format is preventing this from working.  The error I get
(twice) is "type mismatch in initialization," with a line number
pointing to the closing brace of the initialization.  I tried it with
the -bsd flag and it doesn't change.
#include <nlist.h>
struct	nlist Nl[] =
{
	{ "_avenrun" },
#define	X_AVENRUN	0
	{ 0 },
};
Steve Hubert
Networks and Distributed Computing, Univ. of Wash.
hubert@cac.washington.edujohnsot@mist.CS.ORST.EDU (Tim G. Johnson) (06/06/89)
In article <1499@uw-entropy.ms.washington.edu> hubert@cac.washington.edu (Steve Hubert) writes: > >I presume that the Mach nlist format is preventing this from working. >The error I get (twice) is "type mismatch in initialization," with a line >number pointing to the closing brace of the initialization. I tried it >with the -bsd flag and it doesn't change. Since the name in the nlist specification in nlist.h now resides within a union within the struct, you need to add an extra set of brackets around the name declarations: struct nlist Nl[] = { { { "_avenrun" } }, #define X_AVENRUN 0 { { "" } } } I used this declaration to try to get the load average on the NeXT. I was able to nlist into /vmunix (/mach) to get the proper offset in Nl.value, but when I did a lseek into /dev/kmem, I never got the load average. If you figure actually get a valid reading, let me know. Thanks. (BTW, try looking up _mach_factor too. I dunno what it is really, though. /usr/ucb/w will show the mach factor with the -m flag.) Tim G. Johnson Computer Science Dept. johnsot@CS.ORST.EDU 308 Weatherford Hall Oregon State University hplabs!hp-pcd!orstcs!johnsot Corvallis, OR 97331 Corvallis, OR 97331 tektronix!orstcs!johnsot (503) 758-9639 (503) 754-3273 johnsot@oregon-state.BITNET
avie@wb1.cs.cmu.edu (Avadis Tevanian) (06/06/89)
In article <10985@orstcs.CS.ORST.EDU> johnsot@mist.CS.ORST.EDU (Tim G. Johnson) writes: >but when I did a lseek into /dev/kmem, I never got the load average. >If you figure actually get a valid reading, let me know. Thanks. >(BTW, try looking up _mach_factor too. I dunno what it is really, though. >/usr/ucb/w will show the mach factor with the -m flag.) > Mach doesn't use any floating point internally, so it stores the load average as a scaled integer, with a scale factor of 1000 (LSCALE in sys/kernel.h). The Mach Factor is an interesting number I made up a couple of years ago. It is intended to take into account multiprocessors, and is a measure of the expected number of processors that would be available to your application if you were to run it. For example, if there was one compute bound thread in a single cpu system, the Mach Factor would be .5 (expect 1/2 of 1 cpu). If you had 1 thread running on 2 processor system, you could expect to get 1 whole cpu, thus a Mach Factor of 1, if there were 2 threads on that same system, you could expect to get 2/3rd of a cpu (3 threads would share 2 processors if you launched a new thread), hence a Mach Factor of 0.6666. -- Avadis Tevanian, Jr. (Avie) Manager, System Software Group / Chief Operating System Scientist NeXT, Inc. avie@cs.cmu.edu or avie@NeXT.com --
dls@mace.cc.purdue.edu (David L Stevens) (06/06/89)
	I run a version of rwhod on 0.9 that reads and prints the load
average correctly. Diffs from the the 4.3 rwhod follow. The load average
scaling should probably be done from "LSCALE" directly, but if memory
serves, I ran into some problems in sys/kernel.h that made this way much
easier. They probably aren't insurmountable, but just not worth it to me
when I was doing it...
*** 4.3BSD rwhod.c		Tue Jun  6 10:39:57 1989
--- /usr/src/etc/rwhod.c	Thu May 18 13:39:09 1989
***************
*** 51,60 ****
  
  struct	nlist nl[] = {
  #define	NL_AVENRUN	0
! 	{ "_avenrun" },
  #define	NL_BOOTTIME	1
! 	{ "_boottime" },
! 	0
  };
  
  /*
--- 51,60 ----
  
  struct	nlist nl[] = {
  #define	NL_AVENRUN	0
! 	{ { "_avenrun" } },
  #define	NL_BOOTTIME	1
! 	{ { "_boottime" } },
! 	{ {0} }
  };
  
  /*
***************
*** 80,86 ****
  #define	RWHODIR		"/usr/spool/rwho"
  
  int	onalrm();
! char	*strcpy(), *sprintf(), *malloc();
  char	*whittle();
  long	lseek();
  int	getkmem();
--- 80,89 ----
  #define	RWHODIR		"/usr/spool/rwho"
  
  int	onalrm();
! char	*strcpy(), *malloc();
! #ifndef	NeXT
! char	 *sprintf();
! #endif	/* not NeXT */
  char	*whittle();
  long	lseek();
  int	getkmem();
***************
*** 255,265 ****
  	struct stat stb;
  	register struct whoent *we = mywd.wd_we, *wlast;
  	int cc;
! #ifdef	sun
  	long avenrun[3];
! #else	NOT sun
  	double avenrun[3];
! #endif	sun
  	time_t now = time(0);
  	register struct neighbor *np;
  
--- 258,268 ----
  	struct stat stb;
  	register struct whoent *we = mywd.wd_we, *wlast;
  	int cc;
! #if defined(sun) || defined(NeXT)
  	long avenrun[3];
! #else	/* NOT (sun || NeXT) */
  	double avenrun[3];
! #endif	/* sun || NeXT */
  	time_t now = time(0);
  	register struct neighbor *np;
  
***************
*** 321,331 ****
  	(void) lseek(kmemf, (long)nl[NL_AVENRUN].n_value, L_SET);
  	(void) read(kmemf, (char *)avenrun, sizeof (avenrun));
  	for (i = 0; i < 3; i++)
! #ifdef	sun
  		mywd.wd_loadav[i] = htonl((u_long)(((double)avenrun[i]/FSCALE) * 100.));
! #else	NOT sun
  		mywd.wd_loadav[i] = htonl((u_long)(avenrun[i] * 100));
! #endif	sun
  	cc = (char *)we - (char *)&mywd;
  	mywd.wd_sendtime = htonl(time(0));
  	mywd.wd_vers = WHODVERSION;
--- 324,339 ----
  	(void) lseek(kmemf, (long)nl[NL_AVENRUN].n_value, L_SET);
  	(void) read(kmemf, (char *)avenrun, sizeof (avenrun));
  	for (i = 0; i < 3; i++)
! #if	defined(sun)
  		mywd.wd_loadav[i] = htonl((u_long)(((double)avenrun[i]/FSCALE) * 100.));
! #endif	/* sun */
! #if defined(NeXT)
! /* LSCALE must match sys/kernel.h!!! */
! /* divide by (LSCALE/100) (from sys/kernel.h, LSCALE == 1000) */
! 		mywd.wd_loadav[i] = htonl((avenrun[i]+5)/10);
! #else
  		mywd.wd_loadav[i] = htonl((u_long)(avenrun[i] * 100));
! #endif
  	cc = (char *)we - (char *)&mywd;
  	mywd.wd_sendtime = htonl(time(0));
  	mywd.wd_vers = WHODVERSION;
-- 
					+-DLS  (dls@mace.cc.purdue.edu)