If you have two streams of time/value pairs - using MVars as write-once
sampling variables - and both streams are fed from another thread (e.g.
timers firing), and you want to merge these two streams into a single stream
with monotonic time stamps, then you want to be able to check if at time t
an occurrence exists in a stream. In the case an old time was read but not
yet written to an mvar, this could lead to the merged stream not being
monotonic. At least in my C# prototype that was the case, I used many very
high frequency timers to stress test the merger, and this bug popped up. I
found similar code in the Reactive library, but Reactive is much more clever
operationally (and semantically) than my little prototype so it might not be
a problem. But if it is, I guess it can be solved by introducing another
MVar to indicate "I'm reading time", at least I solved it in the C#
prototype in that way.


On Sat, Feb 14, 2009 at 8:01 PM, Paul Johnson <p...@cogito.org.uk> wrote:

> I'm not entirely sure what you are trying to achieve here.  Presumably you
> want v to contain the (value, time) pair as soon as possible after time "t".
>  Of course it won't be instantaneous.  So another thread could observe that
> at time (t+delta) the variable "v" does not yet contain (x,t).  Is this a
> problem?
>
> Atomic transactions won't work because "getCurrentTime" is of type "IO
> Time", whereas anything inside "atomic" has to be of type "STM a".
>
> In theory you could lock out context switches by messing around with the
> GHC runtime, but if you are running on a multicore machine then that won't
> work either.
>
> Paul.
>
>
_______________________________________________
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe

Reply via email to