[comp.sys.next] nlist initialization?

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.edu

johnsot@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)