<html><head><meta http-equiv="Content-Type" content="text/html charset=utf-8"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class=""><br class=""><div><blockquote type="cite" class=""><div class="">Il giorno 12 nov 2015, alle ore 12:24, Simon Marlow <<a href="mailto:marlowsd@gmail.com" class="">marlowsd@gmail.com</a>> ha scritto:</div><div class=""><br style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""><span style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; float: none; display: inline !important;" class="">When you call a C function from Haskell, the Haskell thread that called it *is* suspended, until the C call returns.  So I'm not sure exactly what it is you want to do - maybe you could describe in more detail?</span><br style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""><br style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""></div></blockquote><div><br class=""></div><div><div>Yes, the haskell thread is suspended but it will be resumed when the C code returns.</div></div><div>If you see the haskell + C code as a single computation, nothing gets suspended,</div><div>you just switch environment and language.</div><div><br class=""></div><div><div>I’m sorry for the vagueness in my question. At the time we had a blind review of </div><div>a paper pending so I couldn’t give more details because some reviewer could be</div><div>a member of mailing lists like this.</div></div><div><br class=""></div><div>Now I can explain at a little bit higher level what I was talking about.</div><div>There are a few places in the haskell concurrency libraries where</div><div>haskell threads gets suspended until something happens.</div><div>MVars suspend on reads, STM transactions block after a retry to wait for</div><div>the change of some TVar, and so on…</div><div>Each case is internally treated explicitly by the runtime. By looking at the</div><div>implementation I see that there is a concept of “Blocking Queue”, and</div><div>each TSO can be added to one of these queues. Each TSO also has</div><div>a why_blocked flag that tells why it is blocked, with all these cases explicitly</div><div>enumerated (e.g. BlockedOnCCall and BlockedOnSTM).</div><div><br class=""></div><div>We are implementing some kind of concurrency primitive, which is similar in spirit</div><div>to the STM but with a number of differences, and we’d need access to</div><div>a primitive to block the thread exactly as it happens with the readMVar function</div><div>or the retry action of the STM: simply put a thread to sleep until something happens.</div><div><br class=""></div><div>We are implementing a concurrency primitive, so everything has to be fast and low-overhead.</div><div>As Edward pointed out, it sounds like premature optimization to a priori exclude</div><div>the possibility to implement our primitive on top of MVars. For this reason, that</div><div>is the way that we are exploring in the last days.</div><div><br class=""></div><div>Nevertheless, it does seem strange to us that the GHC runtime doesn’t expose </div><div>some generic way to do something that is needed by so many subsystems.</div><div>What do you think about this? Are we missing something?</div><div><br class=""></div><div>Thank you for your help,</div><div><br class=""></div><blockquote type="cite" class=""><div class=""><span style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; float: none; display: inline !important;" class="">Cheers,</span><br style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""><span style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; float: none; display: inline !important;" class="">Simon</span><br style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""></div></blockquote></div><br class=""><div class="">Greetings,</div><div class="">Nicola</div></body></html>