Files

294 lines
7.6 KiB
C
Raw Permalink Normal View History

2026-07-06 18:01:36 +01:00
/*
SPYBW.C
Written by SteveT
Started on 20/7/92
Part of Spy to monitor CPU band width usage.
*/
#include <plib.h>
#include <hwif.h>
#define DLG_WIDTH 190
#define DLG_HEIGHT 49
#define DLG_LINE 13
#define STACK_SIZE 500
GLREF_D TEXT *DatCommandPtr;
GLREF_D VOID *winHandle;
GLREF_D TEXT *DatProcessNamePtr;
LOCAL_D UINT TaskCount;
LOCAL_D INT Debug=FALSE;
LOCAL_D UINT oldPri;
LOCAL_D INT winId;
LOCAL_D HANDLE bwPid;
LOCAL_D HANDLE spyPid;
LOCAL_D VOID *TimCB;
LOCAL_D ULONG bwTotal;
LOCAL_D UINT bwCount;
LOCAL_D ULONG bwCabTotal;
LOCAL_D UINT bwCabCount;
LOCAL_D UINT bwCabBase;
LOCAL_D ULONG bwCabDisplayTotal;
LOCAL_D UINT bwCabDisplayCount;
LOCAL_D UINT bwCabDisplayBase;
LOCAL_D UWORD LastCount;
LOCAL_D UWORD SampleCount;
LOCAL_D UBYTE TaskStack[STACK_SIZE];
/***********************************************************/
/* This section of code is used by the task to measure the */
/* available band width. */
/***********************************************************/
LOCAL_C VOID MonitorLoop(VOID)
{
UINT i;
p_unmarka();
FOREVER
{
for(i=0;i<500;i++);
TaskCount++;
}
}
/*********************/
/* Main body of code */
/*********************/
LOCAL_C VOID DebugInfo(VOID)
{
TEXT buf[80];
p_atos(&buf[0],"%u/%u",LastCount,SampleCount);
wInfoMsg(&buf[0]);
}
GLDEF_C VOID DisableReads(UINT flag)
{
UINT tmp;
tmp=P_SCR_DISABLE_READS;
p_iow(winHandle,P_FSET,&tmp,&flag);
}
LOCAL_C INT CreateDialog(VOID)
{
W_WINDATA windata;
INT w_id;
windata.extent.width=DLG_WIDTH;
windata.extent.height=DLG_HEIGHT;
windata.extent.tl.x=(240-DLG_WIDTH)>>1;
windata.extent.tl.y=(80-DLG_HEIGHT)>>1;
w_id=wCreateWindow(0,W_WIN_EXTENT,&windata,1);
wInitialiseWindowTree(w_id);
return(w_id);
}
LOCAL_C VOID pTxt(UINT line,TEXT *txt,ULONG *pTotal,INT count,INT count2)
{
P_RECT rect;
TEXT buf[20];
ULONG Percentage,lCount;
rect.tl.x=4;
rect.br.x=96;
rect.tl.y=DLG_LINE+3+line*10;
rect.br.y=rect.tl.y+8;
gPrintBoxText(&rect,7,G_TEXT_ALIGN_LEFT,0,txt,p_slen(txt));
buf[0]=0;
if (bwCount>0 && count!=0)
{
lCount=(ULONG)(count==-1?1:count);
Percentage=(*pTotal)*100l;
Percentage/=lCount;
Percentage/=(ULONG)SampleCount;
if (count!=0)
{
if (count2>=0)
p_atos(&buf[0],"%U%% [%u-%u]",Percentage,count2,count+count2);
else
p_atos(&buf[0],count>0?"%U%% [%u]":"%U%%",Percentage,count);
}
}
rect.tl.x=rect.br.x;
rect.br.x=DLG_WIDTH-6;
gPrintBoxText(&rect,7,G_TEXT_ALIGN_LEFT,0,&buf[0],p_slen(&buf[0]));
}
LOCAL_C VOID redrawWin(UINT update)
{
P_RECT rect;
ULONG tmp;
if (update)
gCreateTempGC0(winId);
else
{
wBeginRedrawWinGC0(winId);
gBorder(W_BORD_CORNER_4|W_BORD_SHADOW_D|W_BORD_SHADOW_ON);
rect.tl.x=4;
rect.br.x=DLG_WIDTH-6;
rect.tl.y=3;
rect.br.y=11;
gPrintBoxText(&rect,7,G_TEXT_ALIGN_CENTRE,0,"Available CPU band width",24);
gDrawLine(1,DLG_LINE,DLG_WIDTH-2,DLG_LINE);
}
pTxt(0,"Average",&bwTotal,bwCount,-1);
tmp=LastCount;
pTxt(1,"Last",&tmp,-1,-1);
pTxt(2,"<Cntrl>\002B",&bwCabDisplayTotal,bwCabDisplayCount,bwCabDisplayBase);
if (update)
gFreeTempGC();
else
wEndRedraw();
}
LOCAL_C VOID GetCount(UWORD *pCount)
{
LONG time;
WORD tstat;
p_presume(bwPid);
time=10l;
TaskCount=0;
p_ioc(TimCB,P_FREAD,&tstat,&time);
p_waitstat(&tstat);
*pCount=TaskCount;
if (TaskCount>SampleCount)
SampleCount=TaskCount;
p_psuspend(bwPid);
p_allowoff();
}
LOCAL_C VOID InitBW(VOID)
{
UWORD oldSample,Count2;
INT i;
f_leave(bwPid=p_ptask("SYS$SPY",E_MAX_PRIORITY-1,MonitorLoop,&TaskStack[STACK_SIZE-1]));
f_open(&TimCB,"TIM:",-1);
spyPid=p_getpid();
oldPri=p_getpri(spyPid);
p_setpri(spyPid,E_MAX_PRIORITY);
if (SampleCount==0)
for(i=0;i<5;i++)
{ /* If no matching samples in 5 then just take the best so far */
oldSample=SampleCount;
GetCount(&Count2);
if (Count2==oldSample || (Count2+1)==oldSample || Count2==(oldSample+1))
break; /* Two matching samples, must be good! */
}
p_setpri(bwPid,E_MIN_PRIORITY);
p_setpri(spyPid,E_PRIORITY_WSERV-1);
}
#ifdef JPIC
#pragma save,ENTER_CALL
#endif
LOCAL_C INT xMonitorBandWidth(VOID)
{
WS_EV event;
bwCabDisplayCount=bwCabCount=bwCount=bwCabDisplayBase=bwCabBase=LastCount=0;
bwCabDisplayTotal=bwCabTotal=bwTotal=0;
DisableReads(TRUE);
winId=CreateDialog();
redrawWin(FALSE);
wFlush();
InitBW();
wGetEvent(&event);
FOREVER
{
p_ioyield();
if (event.type!=E_FILE_PENDING)
{
p_iowait();
if (event.type==WM_KEY)
{
if (event.p.key.keycode==27)
break;
if (event.p.key.keycode==(W_SPECIAL_KEY|'p'))
wClientPosition(0,0);
else if (event.p.key.keycode==(W_SPECIAL_KEY|'b'))
{
p_sound(-5,320);
bwCabDisplayTotal=bwCabTotal;
bwCabDisplayCount=bwCabCount;
bwCabDisplayBase=bwCabBase;
bwCabTotal=0;
bwCabCount=0;
bwCabBase=bwCount;
redrawWin(TRUE);
}
else if (event.p.key.keycode=='d')
Debug=!Debug;
}
else switch (event.type)
{
case WM_REDRAW:
if (event.handle!=1)
wInfoMsg("Redraw to unknown window!");
else
redrawWin(FALSE);
break;
case WM_FOREGROUND:
case WM_BACKGROUND:
p_setpri(spyPid,E_PRIORITY_WSERV-1);
break;
}
wGetEvent(&event);
}
else
{
GetCount(&LastCount);
if (Debug)
DebugInfo();
bwTotal+=LastCount;
if (bwCount++==9999)
bwCount=1;
bwCabTotal+=LastCount;
bwCabCount++;
redrawWin(TRUE);
wFlush();
}
}
return(0);
}
#ifdef JPIC
#pragma restore
#endif
GLDEF_C VOID MonitorBandWidth(VOID)
{
INT err;
TEXT *name;
name=DatProcessNamePtr;
bwPid=spyPid=0;
DatProcessNamePtr=0;
if (wCaptureKey(W_SPECIAL_KEY|'b',W_PSION_MODIFIER|W_CTRL_MODIFIER,W_PSION_MODIFIER|W_CTRL_MODIFIER)<0)
wInfoMsg("'b' key capture failed");
wDisableLeaves(FALSE);
err=p_enter1(xMonitorBandWidth);
wDisableLeaves(TRUE);
p_close(TimCB);
wCancelCaptureKey(W_SPECIAL_KEY|'b',W_PSION_MODIFIER|W_CTRL_MODIFIER,W_PSION_MODIFIER|W_CTRL_MODIFIER);
if (bwPid>0)
p_pkill(bwPid,0);
wCloseWindowTree(winId);
DisableReads(FALSE);
if (spyPid>0)
p_setpri(spyPid,oldPri);
if (err<0)
p_notifyerr(err,"Band width monitor failed",NULL,NULL,NULL);
DatProcessNamePtr=name;
wDisableLeaves(FALSE);
}