#include #include #include #include #include #include "lavd.h" #include "timer.h" struct ExecBase *ExecBase; struct MsgPort *RequestPort = NULL; static char PortName[] = "lavd"; main() { lavdMsg *Mesg; int Stop = 0; int L1 = 0, L2 = 0, L3 = 0; struct timeval Start; /* Startup time. */ struct timeval Now; /* Current time. */ ExecBase = OpenLibrary("exec.library", 36L); if (!timer_open()){ PutStr("Cannot open timer.\n"); goto exitmain; } if ((RequestPort = CreateMsgPort()) == NULL) { PutStr("Cannot create message port.\n"); goto exitmain; } /* * This is a critical section - if a lavd process is adding it's * port, another cannot also do so at the same time, because * neither will see the others port in the FindPort, and so two * will end up running at once. */ Forbid(); if (FindPort(PortName)) { Permit(); PutStr("Already running.\n"); goto exitmain; } RequestPort->mp_Node.ln_Name = "lavd"; RequestPort->mp_Node.ln_Pri = 0; AddPort(RequestPort); Permit(); GetSysTime(&Start); while (! Stop){ ULONG Sig; timer_start (250000); /* 1/4 of a second. */ Sig = Wait(1L<mp_SigBit | 1L<mp_SigBit); if (Sig & 1L<mp_SigBit){ Forbid(); while ((Mesg = (lavdMsg *) GetMsg (RequestPort)) != NULL){ switch(Mesg->Class){ case LAV_STOP: Stop = 1; break; case LAV_LOAD: Mesg->L1 = L1 / 1000; break; case LAV_ALL: GetSysTime (&Now); Mesg->Uptime = Now.tv_secs - Start.tv_secs; /* Fall though \/ */ case LAV_LOADS: Mesg->L1 = L1 / 1000; Mesg->L2 = L2 / 1000; Mesg->L3 = L3 / 1000; break; case LAV_UP: GetSysTime (&Now); Mesg->Uptime = Now.tv_secs - Start.tv_secs; break; default: break; } ReplyMsg(Mesg); } Permit(); } if (Sig & 1L<mp_SigBit){ int Count = 0; struct Node *node; Disable(); for (node = ExecBase->TaskReady.lh_Head; node->ln_Succ; node = node->ln_Succ){ Count++; } Enable(); Count *= 100000; L1 *= 120; L1 += Count; L1 /= 121; L2 *= 1200; L2 += Count; L2 /= 1201; L3 *= 3600; L3 += Count; L3 /= 3601; } } RemPort(RequestPort); exitmain: timer_close(); if (RequestPort) { DeleteMsgPort(RequestPort); } CloseLibrary(ExecBase); exit(0); }