[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