! Clock process
option "-low"
include "moose:mouse.inc"
externalintegerfnspec free store
recordformat clockreqfm (record (messagefm) msg,
Integer ms)
ownrecord (mailboxfm) clock
ownrecord (semaphorefm) server
Begin
record (queuefm) q
record (clockreqfm)name m
record (interrupthandlerfm) ih
integer now,i,count=0
label x
record (dictfm)name e
putstring("Clock process started: "); put long(free store); putsym(10)
setup semaphore (server)
setup mailbox (clock,server)
e == poa_logdict
e == e_alt while e_alt ## nil
i = Make Entry ("CLOCK_REQ",e)
if i = 0 start
Putstring("Clock process failed to add CLOCK_REQ");putsym(10)
Stop
Finish
integer (i) = addr(clock)
setup queue(q)
setup interrupt handler (ih, addr(x))
add interrupt handler(ih,6)
cycle
semaphorewait(server)
signalsemaphore(server)
m == receivemessage(clock)
if m==nil start
semaphorewait(server)
if count>0 start
now = realtime
i = 0
cycle
i = i+1
m == dequeue(q)
if m_ms<=now start
sendmessage(m,m_msg_reply,nil)
count = count-1
else
enqueue(m,q)
finish
repeatuntil i>=count
finish
elseif m_ms<=realtime
sendmessage(m,m_msg_reply,nil)
else
enqueue(m,q); count = count+1
finish
repeat
x:
intsignalsemaphore(server)
returnfrominterrupt
end