<div dir="ltr">You need a single thread that mediates access to the &quot;peek state&quot;. It will be fine, and thread-safe if you do it that way and you can even make it kill-safe if you want. (You&#39;ll get a whole new set of channels for doing the communication.)<div>
<br></div><div>Robby</div></div><div class="gmail_extra"><br><br><div class="gmail_quote">On Tue, Aug 13, 2013 at 9:48 AM, Jonathan Schuster <span dir="ltr">&lt;<a href="mailto:schuster@ccs.neu.edu" target="_blank">schuster@ccs.neu.edu</a>&gt;</span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr"><div><div>Thanks for the feedback, all. Wrapping the channel with my own custom logic was definitely the approach I was thinking about if I wrote it on my own, so I&#39;m going forward with that.<br>
<br></div>

Having thought about it more, even without getting the peeked value this wrapper wouldn&#39;t be thread-safe: one thread could see a &quot;non-empty&quot; event, but then another thread reads the value immediately so that the first thread sees an empty channel when it goes to read the value. That forces me to conclude that even the &quot;non-empty&quot; event would not be of general use. Since I&#39;m working with a single reader/single writer system, though, the wrapper approach will work for my purposes.<br>


<br></div>Thanks again. <br></div><div class="gmail_extra"><br><br><div class="gmail_quote"><div><div class="h5">On Mon, Aug 12, 2013 at 6:52 PM, Eli Barzilay <span dir="ltr">&lt;<a href="mailto:eli@barzilay.org" target="_blank">eli@barzilay.org</a>&gt;</span> wrote:<br>


</div></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div><div class="h5"><div>An hour ago, Hendrik Boom wrote:<br>
&gt; On Mon, Aug 12, 2013 at 04:11:14PM -0400, Eli Barzilay wrote:<br>
&gt; &gt; An easy way to get around such things is to add a level of<br>
&gt; &gt; indirection: wrap the original channel in another one where you<br>
&gt; &gt; implement your own peeking.<br>
&gt;<br>
&gt; Once you peek, if you decde that&#39;s not what you want, might you want<br>
&gt; to let independent threads peek the same element and decie they do<br>
&gt; want it?<br>
&gt;<br>
&gt; There&#39;s got to be some kind of rejecting release if a peek holds the<br>
&gt; stream until accepted.<br>
<br>
</div>The point is that the wrapper reads as usual, and it implements the<br>
peeking -- so in the wrapper there is no need to release the the<br>
value.<br>
<div><br>
<br>
10 minutes ago, Robby Findler wrote:<br>
&gt; Guys: the main thing to keep in mind when programming with CML is<br>
&gt; that you can jut build your own sync abstractions easily. <br>
&gt;<br>
&gt; In this case you would have a separate thread that mediates all<br>
&gt; access to one of these channels and that makes it easy to get such<br>
&gt; concerns right.<br>
&gt;<br>
&gt; Don&#39;t just rely on the built in abstractions tho!<br>
<br>
</div>Yes -- that.<br>
</div></div><div><div><div><div class="h5"><br>
--<br>
          ((lambda (x) (x x)) (lambda (x) (x x)))          Eli Barzilay:<br>
                    <a href="http://barzilay.org/" target="_blank">http://barzilay.org/</a>                   Maze is Life!<br>
<br></div></div><div class="im">
____________________<br>
  Racket Users list:<br>
  <a href="http://lists.racket-lang.org/users" target="_blank">http://lists.racket-lang.org/users</a><br>
</div></div></div></blockquote></div><br></div>
<br>____________________<br>
  Racket Users list:<br>
  <a href="http://lists.racket-lang.org/users" target="_blank">http://lists.racket-lang.org/users</a><br>
<br></blockquote></div><br></div>