<div dir="ltr"><div>We have forkIOWithUnmask[1] and forkOnWithUnmask[2], but we don&#39;t have forkOSWithUnmask.  This proposal would add it:</div><div><br></div><div><div>    -- | Like &#39;forkIOWithUnmask&#39;, but the child thread is a bound thread,</div>


<div>    -- as with &#39;forkOS&#39;.</div><div>    forkOSWithUnmask :: ((forall a . IO a -&gt; IO a) -&gt; IO ()) -&gt; IO ThreadId</div><div>    forkOSWithUnmask io = forkOS (io unsafeUnmask)</div><div><br></div><div><span style="font-size:13px;background-color:rgb(255,255,221);font-family:Verdana,Arial,&#39;Bitstream Vera Sans&#39;,Helvetica,sans-serif">For GHC &lt; 7.8, </span><tt style="font-size:13px;background-color:rgb(255,255,221)">forkOSWithUnmask</tt><span style="font-size:13px;background-color:rgb(255,255,221);font-family:Verdana,Arial,&#39;Bitstream Vera Sans&#39;,Helvetica,sans-serif"> can be achieved using </span><tt style="font-size:13px;background-color:rgb(255,255,221)">forkOS</tt><span style="font-size:13px;background-color:rgb(255,255,221);font-family:Verdana,Arial,&#39;Bitstream Vera Sans&#39;,Helvetica,sans-serif"> and </span><a href="http://hackage.haskell.org/packages/archive/base/4.6.0.1/doc/html/Control-Exception.html#v:block" style="text-decoration:none;color:rgb(187,0,0);border-bottom-width:1px;border-bottom-style:dotted;border-bottom-color:rgb(187,187,187);font-family:Verdana,Arial,&#39;Bitstream Vera Sans&#39;,Helvetica,sans-serif;font-size:13px;background-color:rgb(255,255,221)" target="_blank"><span style="background-image:url(http://hackage.haskell.org/trac-htdocs/extlink.gif);padding-left:12px;background-repeat:no-repeat no-repeat"> </span>block</a>[3]<span style="font-size:13px;background-color:rgb(255,255,221);font-family:Verdana,Arial,&#39;Bitstream Vera Sans&#39;,Helvetica,sans-serif">, but </span><tt style="font-size:13px;background-color:rgb(255,255,221)">block</tt><span style="font-size:13px;background-color:rgb(255,255,221);font-family:Verdana,Arial,&#39;Bitstream Vera Sans&#39;,Helvetica,sans-serif"> is removed in GHC 7.8. </span><tt style="font-size:13px;background-color:rgb(255,255,221)">unsafeUnmask</tt><span style="font-size:13px;background-color:rgb(255,255,221);font-family:Verdana,Arial,&#39;Bitstream Vera Sans&#39;,Helvetica,sans-serif"> can still be imported from </span><tt style="font-size:13px;background-color:rgb(255,255,221)"><a href="http://GHC.IO" target="_blank">GHC.IO</a></tt><span style="font-size:13px;background-color:rgb(255,255,221);font-family:Verdana,Arial,&#39;Bitstream Vera Sans&#39;,Helvetica,sans-serif">, however.</span><br>


</div><div><span style="font-size:13px;background-color:rgb(255,255,221);font-family:Verdana,Arial,&#39;Bitstream Vera Sans&#39;,Helvetica,sans-serif"><br></span></div><div style><span style="font-size:13px;background-color:rgb(255,255,221);font-family:Verdana,Arial,&#39;Bitstream Vera Sans&#39;,Helvetica,sans-serif">Impact: virtually no compatibility break (just adds a new definition), but we will probably want to update the async package[4] at some point, adding </span><font face="Verdana, Arial, Bitstream Vera Sans, Helvetica, sans-serif">asyncBoundWithUnmask and withAsyncBoundWithUnmask.  Such an addition would not require base &gt;= 4.7 in async, as we could use the `block` workaround described above.</font></div>

<div style><font face="Verdana, Arial, Bitstream Vera Sans, Helvetica, sans-serif"><br></font></div><div style><font face="Verdana, Arial, Bitstream Vera Sans, Helvetica, sans-serif">The biggest objection I can imagine would be that we now have six basic ways to fork a thread: forkIO, forkOn, forkOS, and their fork*WithUnmask variants.  Libraries like async end up having to replicate all these.  Perhaps in the future, we should consolidate forkIO, forkOn, and forkOS:</font></div>

</div><div style><font face="Verdana, Arial, Bitstream Vera Sans, Helvetica, sans-serif"><br></font></div><div style><font face="Verdana, Arial, Bitstream Vera Sans, Helvetica, sans-serif"><div>    data ThreadMode</div><div>

      = ForkIO</div><div>      | ForkOn Int</div><div>      | ForkBound</div><div><br></div><div>    forkMode :: ThreadMode -&gt; IO () -&gt; IO ()</div><div>    forkModeWithUnmask :: ThreadMode</div><div>                       -&gt; ((forall a. IO a -&gt; IO a) -&gt; IO ())</div>

<div>                       -&gt; IO ThreadId</div><div><br></div><div style>But for now, adding forkOSWithUnmask mirrors forkIOWithUnmask and forkOnWithUnmask, which are already in place.</div><div style><br></div><div style>

Ticket: <a href="http://hackage.haskell.org/trac/ghc/ticket/8010">http://hackage.haskell.org/trac/ghc/ticket/8010</a> .  The title &quot;Add forkOSUnmasked&quot; is a mistake (should be &quot;Add forkOSWithUnmask&quot;), but the patch should be right.</div>

</font></div><div style><span style="font-size:13px;background-color:rgb(255,255,221);font-family:Verdana,Arial,&#39;Bitstream Vera Sans&#39;,Helvetica,sans-serif"><br></span></div><div> [1]: <a href="http://hackage.haskell.org/packages/archive/base/latest/doc/html/Control-Concurrent.html#v:forkIOWithUnmask" target="_blank">http://hackage.haskell.org/packages/archive/base/latest/doc/html/Control-Concurrent.html#v:forkIOWithUnmask</a></div>


<div> [2]: <a href="http://hackage.haskell.org/packages/archive/base/latest/doc/html/Control-Concurrent.html#v:forkOnWithUnmask" target="_blank">http://hackage.haskell.org/packages/archive/base/latest/doc/html/Control-Concurrent.html#v:forkOnWithUnmask</a></div>


<div> [3]: <a href="http://hackage.haskell.org/packages/archive/base/4.6.0.1/doc/html/Control-Exception.html#v:block" target="_blank">http://hackage.haskell.org/packages/archive/base/4.6.0.1/doc/html/Control-Exception.html#v:block</a></div>


<div> [4]: <a href="http://hackage.haskell.org/packages/archive/async/latest/doc/html/Control-Concurrent-Async.html" target="_blank">http://hackage.haskell.org/packages/archive/async/latest/doc/html/Control-Concurrent-Async.html</a></div>


</div>