[C.CC USERS] placed variables?
Patrick J.G.C. Weemeeuw
pweemeeuw at telenet.be
Wed Aug 11 14:16:41 BST 2010
YES! Beauty! Exactly what I want.
I was already working towards a solution with 2 processes, which is much more occam-style than placed variables, but this is so much more elegant.
thanks a lot
-- Patrick
On Wed, Aug 11, 2010 at 02:29:16PM +0900, Carl Ritson wrote:
> Hi Patrick,
>
> On 2010/08/09, at 21:01, Patrick J.G.C. Weemeeuw wrote:
>
> > I can't solve that with channels, because I want this timer to be unsynchronized, and I want to access it from several places in the code, exactly like the TIMER
> > process. I think that to achieve something like this, I have no choice but to bypass the regular occam mechanisms, and access memory directly.
>
>
> What you want can be done with channels: each process needing access to the extended time counter is a client to the timekeeper process which multiplexes their requests using an alternation construct (PRI ALT).
>
> I believe you probably want something like the code below.
>
> Note: I have changed the INT64 to an INT32.
> If you update every 1000ms (once per second), then a 32-bit counter will last several decades (think unix timestamp).
>
> PROC timekeeper ([]CHAN SIGNAL req, []CHAN INT32 resp)
> INITIAL INT32 now IS 0:
> TIMER tim:
> INT next.update:
> SEQ
> tim ? next.update
> next.update := next.update PLUS clockresolution
>
> WHILE TRUE
> PRI ALT
>
> -- when time moves past next.update
> tim ? AFTER next.update
> SEQ
> -- maintain 'now' here, for example:
> now := now + 1
> next.update := next.update PLUS clockresolution
>
> -- respond to requests for clock
> ALT i = 0 FOR SIZE req
> req[i] ? SIGNAL
> resp[i] ! now
> :
>
> PROC client (CHAN SIGNAL time.req, CHAN INT32 time.resp)
> INT32 now:
> SEQ
> -- update now to latest timer value
> time.req ! SIGNAL
> time.resp ? now
> -- do something with now ...
> serial.write.string (TX0, "time: ")
> serial.write.int (TX0, now) -- NOTE: this will need to be different for INT32
> serial.write.newline (TX0)
> delay (clockresolution)
> :
>
> PROC main ()
> [1]CHAN SIGNAL time.req:
> [1]CHAN INT32 time.resp:
> PAR
> heartbeat ()
> timekeeper (time.req, time.resp)
> client (time.req[0], time.resp[0])
> :
>
> Hope this helps.
>
> Carl
More information about the users
mailing list