// GateConUser.bcpl -- talks to the Gateway control process
// Last modified March 6, 1979 10:44 PM by Boggs
get "Pup0.decl"
get "Pup1.decl"
get "GateConServ.decl"
external
[
// outgoing procedures
CreateGateConCtx; GateConVersion; GateConSummary
RestartGateway; HaltGateway; RestartGateConUser
// incoming procedures
OpenLevel1Socket; CloseLevel1Socket; GetBuf; ReleasePBI
Zero; MoveBlock; Allocate; Free; Enqueue
ReadCalendar; DoubleSubtract; Divide32x16
InitializeContext; Block; SetTimer; TimerHasExpired
Ws; Wss; PutTemplate; Confirm
SendCommand
// incoming statics
sysZone; ctxQ; gcNet; gcHost; gcName; oldStatsQ
]
static @gcu
structure GCU: // gcu -> this 'global frame' for Gate Control User
[
soc word // -> PupSoc
stats word // -> GateControl Stats block
timer word // update stats when this expires
]
manifest lenGCU = size GCU/16
//----------------------------------------------------------------------------
let CreateGateConCtx() be
//----------------------------------------------------------------------------
[
Enqueue(ctxQ, InitializeContext(Allocate(sysZone, 150), 150, GateConCtx))
gcu = Allocate(sysZone, lenGCU); Zero(gcu, lenGCU)
gcu>>GCU.soc = Allocate(sysZone, lenPupSoc); OpenLevel1Socket(gcu>>GCU.soc)
]
//----------------------------------------------------------------------------
and RestartGateConUser() be
//----------------------------------------------------------------------------
[
SetTimer(lv gcu>>GCU.timer, 0)
if gcu>>GCU.stats ne 0 then
[ Enqueue(oldStatsQ, gcu>>GCU.stats); gcu>>GCU.stats = 0 ]
]
//----------------------------------------------------------------------------
and GateConCtx(ctx) be //a context
//----------------------------------------------------------------------------
[
Block() repeatuntil TimerHasExpired(lv gcu>>GCU.timer) & gcHost ne 0
SetTimer(lv gcu>>GCU.timer, 500)
let pbi = SendCommand(GetBuf(gcu>>GCU.soc), ptStats, pupOvBytes, 1)
if pbi ne 0 then
[
let stats = lv pbi>>PBI.pup.words
if pbi>>PBI.pup.type eq ptAck &
stats>>Stats.version eq gcStatsVersion then
[
if gcu>>GCU.stats then Enqueue(oldStatsQ, gcu>>GCU.stats)
let lenStatBlock = (pbi>>PBI.pup.length-pupOvBytes+1)/2
gcu>>GCU.stats = Allocate(sysZone, lenStatBlock)
MoveBlock(gcu>>GCU.stats, lv pbi>>PBI.pup.words, lenStatBlock)
]
ReleasePBI(pbi)
]
] repeat
//----------------------------------------------------------------------------
and GateConVersion(stream) be
//----------------------------------------------------------------------------
[
let stats = gcu>>GCU.stats; if stats eq 0 return
PutTemplate(stream, "$S [$UO#$UO#]: $S", gcName, gcNet, gcHost,
lv stats>>Stats.versionText)
if stats>>Stats.startTime↑0 ne 0 then
[
let interval = vec 1; ReadCalendar(interval)
DoubleSubtract(interval, lv stats>>Stats.startTime)
let secs = Divide32x16(interval, 60)
let mins = Divide32x16(interval, 60)
PutTemplate(stream, " up $D:$2F0D:$2F0D", interval!1, mins, secs)
]
]
//----------------------------------------------------------------------------
and GateConSummary(stream) be
//----------------------------------------------------------------------------
[
let stats = gcu>>GCU.stats; if stats eq 0 return
PutTemplate(stream, "Free PBIs: $D ", stats>>Stats.freePBIs)
if stats>>Stats.freePages ne 0 then
PutTemplate(stream, "Free Pages: $D ", stats>>Stats.freePages)
]
//----------------------------------------------------------------------------
and RestartGateway() be GCSCommand("*NRestart Gateway", ptRestart)
//----------------------------------------------------------------------------
//----------------------------------------------------------------------------
and HaltGateway() be GCSCommand("*NHalt Gateway", ptHalt)
//----------------------------------------------------------------------------
//----------------------------------------------------------------------------
and GCSCommand(string, type) be
//----------------------------------------------------------------------------
[
unless Confirm(string) return
let soc = vec lenPupSoc; OpenLevel1Socket(soc)
let pbi = SendCommand(GetBuf(soc), type, pupOvBytes)
if pbi eq 0 % pbi>>PBI.pup.type ne ptAck then
Ws("*NThe Gateway Control Server doesn't answer.")
if pbi then ReleasePBI(pbi)
CloseLevel1Socket(soc)
]