v05i033: xtacho, Patch1
Shinji Sumimoto
sumi at minako.stars.flab.fujitsu.co.jp
Thu Nov 30 15:50:23 AEST 1989
Submitted-by: ucbcad!uunet.UU.NET!sumi%minako.stars.flab.fujitsu.junet
Posting-number: Volume 5, Issue 33
Archive-name: xtacho/patch1
Patch-To: xtacho: Volume 4, Issue 63 (July 19, 1989)
----- Shinji Sumimoto
Fujitsu Laboratories Ltd.
Artificial Intelligence Laboratory
sumi at minako.stars.flab.fujitsu.co.jp -------
------ Followings are new patch ------
Submitted-by: sumi at minako.stars.flab.fujitsu.co.jp (Shinji Sumimoto)
Posting-number: Volume 1.
Archive-name: xtacho/patch1
Original-Archive: (v04i063: xtacho -- x cpu tachometer, Part01/01
Date: 19 Jul 89 23:29:32 GMT)
This is a patch to improve xtacho that was posted by Kazuhiko Shutoh
(e-mail: shutoh at isl.yamaha.co.jp).
This improves following improvements:
1) Triple tachometer display.
Xtachos displays System, User, Idle tachometers from the left side.
2) Support a system without rstat library.
Xtachos gets the data from /dev/kmem
This xtachos works well on Sun-3(SunOS 4.0,X11R3) and 4.3BSD(X11R3).
These patches consist of following files:
README--- You already know
patch1--- patch file to xtachos
patch.sh- shell script for making xtachos
Any comments and bug fixes are welcome.
Have fun !
----- Shinji Sumimoto
Fujitsu Laboratories Ltd.
Artificial Intelligence Laboratory
sumi at minako.stars.flab.fujitsu.co.jp -------
------------- cut here --------------
#!/bin/sh
# shar: Shell Archiver (v1.22)
#
# Run the following text with /bin/sh to create:
# README
# patch.sh
# patch1
#
echo "x - extracting README (Text)"
sed 's/^X//' << 'SHAR_EOF' > README &&
XSubmitted-by: sumi at minako.stars.flab.fujitsu.co.jp (Shinji Sumimoto)
XPosting-number: Volume 1,
XArchive-name: xtacho/patch1
X
XThese patches to xtacho improve following improvements:
X
X 1) Triple tachometer display.
X Xtachos displays System, User, Idle tachometers from the left side.
X
X 2) Support a system without rstat library.
X xtachos gets the data from /dev/kmem
X
XThis xtachos works well on Sun-3(SunOS 4.0,X11R3) and 4.3BSD(X11R3).
X
XThese patches consist of following files:
X
X README--- You already know
X patch1--- patch file to xtachos
X patch.sh- shell script for making xtachos
X
X
XTODO:
X Please execute patch.sh, this automatically replaces
X xtacho files, and make xtachos files.
X And edit a Makefile in following way:
X (defaults: It's for sun)
X
X - If your system has a rstat library,
X please adds compiler option -DRSTAT.(in defaults)
X
X - If your system does not have a rstat liibrary,
X please remove -DRSTAT.
X Program gets a data from /dev/kmem
X
X And executes make command.
X
X Have fun !
X
SHAR_EOF
chmod 0644 README || echo "restore of README fails"
echo "x - extracting patch.sh (Text)"
sed 's/^X//' << 'SHAR_EOF' > patch.sh &&
X#!/bin/sh
Xcat patch1 | patch
Xmv xtacho.c xtachos.c
Xmv xtacho.h xtachos.h
SHAR_EOF
chmod 0755 patch.sh || echo "restore of patch.sh fails"
echo "x - extracting patch1 (Text)"
sed 's/^X//' << 'SHAR_EOF' > patch1 &&
XIndex: Makefile
X*** Makefile.xtacho Sat Nov 25 18:26:19 1989
X--- Makefile Sat Nov 25 18:31:17 1989
X***************
X*** 1,4 ****
X! # SCCS ID @(#)Makefile 1.7 7/14/89
X #
X # Makefile - Makefile for xtacho
X #
X--- 1,4 ----
X! # SCCS ID @(#)Makefile 1.5 7/12/89
X #
X # Makefile - Makefile for xtacho
X #
X***************
X*** 9,20 ****
X # comment and the author's name is retained. The author assumes no
X # responsibility for lost sleep as a consequence of use of this software.
X #
X! # Send any comments, bug reports, etc. to: shutoh at isl.yamaha.JUNET or,
X! # for oversea: shutoh%isl.yamaha.JUNET%kddlab at uunet.uu.net
X #
X #
X CC = /bin/cc
X! CFLAGS = -f68881 -O
X DESTDIR = /usr/bin/X11
X MANDIR = /usr/man/mann
X #
X--- 9,26 ----
X # comment and the author's name is retained. The author assumes no
X # responsibility for lost sleep as a consequence of use of this software.
X #
X! # Send any comments, bug reports, etc. to shutoh at isl.yamaha.JUNET
X #
X #
X CC = /bin/cc
X! # for machines with rstat library
X! # for sun-3
X! CFLAGS = -f68881 -O -DRSTAT
X! # for sun-4
X! #CFLAGS = -O -DRSTAT
X! # for BSD without rstat library
X! #CFLAGS = -O
X!
X DESTDIR = /usr/bin/X11
X MANDIR = /usr/man/mann
X #
X***************
X*** 25,36 ****
X # Libraries for X11R3
X #
X LIBS = -lXaw -lXmu -lXt -lX11 -lm -lrpcsvc
X
X ##############################################################################
X! PROGRAMS = ./xtacho
X! SRCS = ./xtacho.c
X! OBJS = ./xtacho.o
X! LOCALHDRS = ./xtacho.h ./xtacho.icon
X EXTERNHDRS = /usr/include/stdio.h \
X /usr/include/math.h \
X /usr/include/rpcsvc/rstat.h \
X--- 31,44 ----
X # Libraries for X11R3
X #
X LIBS = -lXaw -lXmu -lXt -lX11 -lm -lrpcsvc
X+ # without rstat library
X+ #LIBS = -lXaw -lXmu -lXt -lX11 -lm
X
X ##############################################################################
X! PROGRAMS = ./xtachos
X! SRCS = ./xtachos.c
X! OBJS = ./xtachos.o
X! LOCALHDRS = ./xtachos.h ./xtacho.icon
X EXTERNHDRS = /usr/include/stdio.h \
X /usr/include/math.h \
X /usr/include/rpcsvc/rstat.h \
XIndex: xtacho.c
X*** xtacho.c Sat Nov 25 18:26:21 1989
X--- xtachos.c Sat Nov 25 18:32:28 1989
X***************
X*** 1,9 ****
X! static char sccsid[] = "@(#)xtacho.c 1.9 7/18/89";
X
X /*
X * xtacho - The cpu load tachometer for X11
X *
X * Author: Kazuhiko Shutoh, 1989.
X *
X * Permission to use, copy, modify and distribute without charge this software,
X * documentation, images, etc. is granted, provided that this comment and the
X--- 1,10 ----
X! static char sccsid[] = "@(#)xtachos.c 1.5 7/12/89";
X
X /*
X * xtacho - The cpu load tachometer for X11
X *
X * Author: Kazuhiko Shutoh, 1989.
X+ * Revised by Shinji Sumimoto, 1989/9 (xtachos)
X *
X * Permission to use, copy, modify and distribute without charge this software,
X * documentation, images, etc. is granted, provided that this comment and the
X***************
X*** 10,20 ****
X * author's name is retained. The author assumes no responsibility for lost
X * sleep as a consequence of use of this software.
X *
X! * Send any comments, bug reports, etc. to: shutoh at isl.yamaha.JUNET or,
X! * for oversea: shutoh%isl.yamaha.JUNET%kddlab at uunet.uu.net
X! *
X */
X
X #include <X11/Intrinsic.h>
X #include <X11/StringDefs.h>
X #include <X11/Shell.h>
X--- 11,28 ----
X * author's name is retained. The author assumes no responsibility for lost
X * sleep as a consequence of use of this software.
X *
X! * Send any comments, bug reports, etc. to shutoh at isl.yamaha.JUNET
X! *
X */
X
X+ #include <stdio.h>
X+ #include <math.h>
X+ #ifdef RSTAT
X+ #include <rpcsvc/rstat.h>
X+ #else /* 4.3 BSD */
X+ #include <nlist.h>
X+ #include <sys/dk.h>
X+ #endif
X #include <X11/Intrinsic.h>
X #include <X11/StringDefs.h>
X #include <X11/Shell.h>
X***************
X*** 22,34 ****
X #include <X11/Label.h>
X #include <X11/Command.h>
X #include <X11/Form.h>
X! #include <stdio.h>
X! #include <math.h>
X! #include <rpcsvc/rstat.h>
X! #include "xtacho.h"
X #include "xtacho.icon"
X
X XtCallbackProc redraw_callback();
X XtTimerCallbackProc PollingCpuStatus();
X void SetupTacho();
X void GetGraphicContexts();
X--- 30,40 ----
X #include <X11/Label.h>
X #include <X11/Command.h>
X #include <X11/Form.h>
X! #include "xtachos.h"
X #include "xtacho.icon"
X
X XtCallbackProc redraw_callback();
X+ XtCallbackProc Destroy();
X XtTimerCallbackProc PollingCpuStatus();
X void SetupTacho();
X void GetGraphicContexts();
X***************
X*** 41,56 ****
X void DrawSingleNumber();
X void DrawNeedle();
X
X! Widget toplevel, base, info, meter;
X! GC gcForeground, gcBackground, gcNeedle;
X
X char hostname[MAXCHARS];
X unsigned char monitor_item;
X long update;
X! Cardinal current_status = 0;
X! Cardinal old_status = 0;
X! Cardinal old_status_time = 0;
X
X main(argc, argv)
X int argc;
X char **argv;
X--- 47,75 ----
X void DrawSingleNumber();
X void DrawNeedle();
X
X! Widget toplevel, base, info[3], meter[3];
X! GC gcForeground, gcBackground, gcNeedle[3];
X
X char hostname[MAXCHARS];
X unsigned char monitor_item;
X long update;
X! Cardinal current_status[3] = { 0,0,0 };
X! Cardinal old_status[3] = { 0,0,0 };
X! Cardinal old_status_time[3] = { 0,0,0 };
X! #ifndef RSTAT
X! struct statstime {
X! long cp_time[4];
X! int tmp;
X! } ;
X! struct nlist nl[]= {
X! {"_cp_time"},
X! {""},
X! };
X
X+ #define KERNEL_NAME "/vmunix"
X+ #define MEM_NAME "/dev/kmem"
X+ int mfd;
X+ #endif
X main(argc, argv)
X int argc;
X char **argv;
X***************
X*** 57,63 ****
X {
X
X Arg args[10];
X! Cardinal i;
X XtIntervalId intervalId;
X XtTranslations newTranslations;
X static XtActionsRec redrawActions[] = {
X--- 76,82 ----
X {
X
X Arg args[10];
X! Cardinal i, j;
X XtIntervalId intervalId;
X XtTranslations newTranslations;
X static XtActionsRec redrawActions[] = {
X***************
X*** 69,75 ****
X <ResReq>: expose()";
X
X struct statstime cpu_status;
X! char label[MAXCHARS];
X
X
X toplevel = XtInitialize("xtacho", "XTacho", NULL, 0, &argc, argv);
X--- 88,94 ----
X <ResReq>: expose()";
X
X struct statstime cpu_status;
X! char label[3][MAXCHARS];
X
X
X toplevel = XtInitialize("xtacho", "XTacho", NULL, 0, &argc, argv);
X***************
X*** 84,130 ****
X SetupTacho(argc, argv);
X
X base = XtCreateManagedWidget("base", formWidgetClass, toplevel, NULL, 0);
X
X! switch (monitor_item) {
X! case USER_CPU:
X! sprintf(label, "%s : User", hostname);
X! break;
X
X- case SYSTEM_CPU:
X- sprintf(label, "%s : System", hostname);
X- break;
X-
X- case IDLE_CPU:
X- sprintf(label, "%s : Idle", hostname);
X- break;
X-
X- default:
X- break;
X- }
X-
X- i = 0;
X- XtSetArg(args[i], XtNlabel, label);i++;
X- XtSetArg(args[i], XtNwidth, 100);i++;
X- info = XtCreateManagedWidget("info", labelWidgetClass, base, args, i);
X-
X- i = 0;
X- XtSetArg(args[i], XtNwidth, 100);i++;
X- XtSetArg(args[i], XtNheight, 100);i++;
X- XtSetArg(args[i], XtNborderWidth, 0);i++;
X- XtSetArg(args[i], XtNfromVert, info);i++;
X- meter = XtCreateManagedWidget("meter", boxWidgetClass, base, args, i);
X-
X- GetGraphicContexts(meter);
X-
X XtAddActions(redrawActions, XtNumber(redrawActions));
X newTranslations = XtParseTranslationTable(overrideTranslations);
X- XtOverrideTranslations(meter, newTranslations);
X
X! rstat(hostname, &cpu_status);
X!
X! old_status_time = cpu_status.cp_time[monitor_item];
X!
X!
X /* Interval timer start */
X
X intervalId = XtAddTimeOut(update, PollingCpuStatus, NULL);
X--- 103,150 ----
X SetupTacho(argc, argv);
X
X base = XtCreateManagedWidget("base", formWidgetClass, toplevel, NULL, 0);
X+ sprintf(label[0], "%s : User", hostname);
X+ sprintf(label[1], "System");
X+ sprintf(label[2], "Idle");
X+ for(j = 0; j < 3; j++) {
X+ i = 0;
X+ XtSetArg(args[i], XtNlabel, label[j]);i++;
X+ XtSetArg(args[i], XtNwidth, 100);i++;
X+ if(j!=0) {
X+ XtSetArg(args[i], XtNfromHoriz, info[j-1]);i++;
X+ }
X+ info[j] = XtCreateManagedWidget("info", labelWidgetClass, base, args, i);
X+ }
X+ for(j = 0; j < 3; j++) {
X+ i = 0;
X+ XtSetArg(args[i], XtNwidth, 100);i++;
X+ XtSetArg(args[i], XtNheight, 100);i++;
X+ XtSetArg(args[i], XtNborderWidth, 0);i++;
X+ XtSetArg(args[i], XtNfromVert, info[j]);i++;
X+ if(j!=0) {
X+ XtSetArg(args[i], XtNfromHoriz, meter[j-1]);i++;
X+ }
X+ meter[j] = XtCreateManagedWidget("meter", boxWidgetClass, base, args, i);
X
X! GetGraphicContexts(meter[j], j);
X! }
X! #ifdef RSTAT
X! rstat(hostname, &cpu_status);
X! #else
X! sys_init();
X! get_stat(&cpu_status.cp_time[0]);
X! #endif
X! cpu_status.cp_time[0] = cpu_status.cp_time[0] + cpu_status.cp_time[1];
X! cpu_status.cp_time[1] = cpu_status.cp_time[2];
X! cpu_status.cp_time[2] = cpu_status.cp_time[3];
X
X XtAddActions(redrawActions, XtNumber(redrawActions));
X newTranslations = XtParseTranslationTable(overrideTranslations);
X
X! for(j = 0; j < 3; j++) {
X! XtOverrideTranslations(meter[j], newTranslations);
X! old_status_time[j] = cpu_status.cp_time[j];
X! }
X /* Interval timer start */
X
X intervalId = XtAddTimeOut(update, PollingCpuStatus, NULL);
X***************
X*** 169,176 ****
X }
X
X void
X! GetGraphicContexts(w)
X Widget w;
X {
X
X Arg args[2];
X--- 189,197 ----
X }
X
X void
X! GetGraphicContexts(w, j)
X Widget w;
X+ Cardinal j;
X {
X
X Arg args[2];
X***************
X*** 189,195 ****
X gcv.foreground = args[0].value;
X gcv.foreground = args[0].value;
X gcv.function = GXinvert;
X! gcNeedle = XtGetGC(w, GCFunction, &gcv);
X }
X
X void
X--- 210,216 ----
X gcv.foreground = args[0].value;
X gcv.foreground = args[0].value;
X gcv.function = GXinvert;
X! gcNeedle[j] = XtGetGC(w, GCFunction, &gcv);
X }
X
X void
X***************
X*** 224,229 ****
X--- 245,251 ----
X Cardinal d_ry;
X Cardinal d_width;
X Cardinal d_height;
X+ Cardinal j;
X
X
X XtSetArg(args[0], XtNwidth, 0);
X***************
X*** 253,261 ****
X /* Draw gauge */
X
X DrawGauge(w, gcForeground, d_rx, d_ry);
X
X- DrawNeedle(w, gcNeedle, current_status);
X-
X }
X
X void
X--- 275,289 ----
X /* Draw gauge */
X
X DrawGauge(w, gcForeground, d_rx, d_ry);
X+ for(j=0; j < 3; j++) {
X+ if(meter[j] == w) {
X+ goto find;
X+ }
X+ }
X+ return;
X+ find:
X+ DrawNeedle(w, gcNeedle[j], current_status[j]);
X
X }
X
X void
X***************
X*** 446,480 ****
X {
X
X struct statstime system_status;
X! Cardinal load_count, step;
X
X /* Get new CpuTime */
X!
X rstat(hostname, &system_status);
X! current_status = (double) (system_status.cp_time[monitor_item] - old_status_time) / ((double) update / 2000.0);
X! old_status_time = system_status.cp_time[monitor_item];
X
X! if (current_status > 100)
X! current_status /= 2;
X!
X! if (current_status != old_status) {
X /* Move Needle */
X
X! if (current_status < old_status)
X step = -1;
X else
X step = 1;
X
X! for (load_count = old_status; load_count != current_status; load_count += step)
X! DrawNeedle(meter, gcNeedle, load_count);
X
X! for (load_count = old_status + step; load_count != current_status + step; load_count += step)
X! DrawNeedle(meter, gcNeedle, load_count);
X
X! }
X
X XtAddTimeOut(update, PollingCpuStatus, NULL);
X
X- old_status = current_status;
X-
X }
X--- 474,544 ----
X {
X
X struct statstime system_status;
X! Cardinal load_count, step, j, tmp;
X
X /* Get new CpuTime */
X! #ifdef RSTAT
X rstat(hostname, &system_status);
X! #else
X! get_stat(&system_status.cp_time[0]);
X! #endif
X! system_status.cp_time[0] = system_status.cp_time[0] + system_status.cp_time[1];
X! system_status.cp_time[1] = system_status.cp_time[2];
X! system_status.cp_time[2] = system_status.cp_time[3];
X! tmp = 0;
X! for(j = 0; j < 3; j++) {
X! tmp += (system_status.cp_time[j] - old_status_time[j]) ;
X! }
X!
X! for(j = 0; j < 3; j++) {
X! current_status[j] = (double) (system_status.cp_time[j] - old_status_time[j]) / ((double) tmp / 100.0);
X! old_status_time[j] = system_status.cp_time[j];
X!
X! if (current_status[j] > 100)
X! current_status[j] /= 2;
X
X! if (current_status[j] != old_status[j]) {
X /* Move Needle */
X
X! if (current_status[j] < old_status[j])
X step = -1;
X else
X step = 1;
X
X! for (load_count = old_status[j]; load_count != current_status[j]; load_count += step)
X! DrawNeedle(meter[j], gcNeedle[j], load_count);
X
X! for (load_count = old_status[j] + step; load_count != current_status[j] + step; load_count += step)
X! DrawNeedle(meter[j], gcNeedle[j], load_count);
X
X! }
X
X+ old_status[j] = current_status[j];
X+ }
X+
X XtAddTimeOut(update, PollingCpuStatus, NULL);
X
X }
X+
X+ #ifndef RSTAT
X+ /* get CPU status from kernel */
X+ sys_init()
X+ {
X+ nlist("/vmunix", nl);
X+ if(nl[0].n_type == 0) {
X+ fprintf(stderr, "no namelist in %s\n", KERNEL_NAME);
X+ exit(1);
X+ }
X+ if((mfd = open(MEM_NAME, 0)) < 0) {
X+ fprintf(stderr, "fali to open %s\n", MEM_NAME);
X+ exit(1);
X+ }
X+ }
X+ get_stat(mem_ad)
X+ int *mem_ad;
X+ {
X+ lseek(mfd, nl[0].n_value, 0);
X+ read(mfd, mem_ad, 16);
X+ }
X+
X+ #endif
SHAR_EOF
chmod 0644 patch1 || echo "restore of patch1 fails"
exit 0
#--------------------- end of file ---------------------
More information about the Comp.sources.x
mailing list