<div dir="ltr"><div>We have forkIOWithUnmask[1] and forkOnWithUnmask[2], but we don't have forkOSWithUnmask. This proposal would add it:</div><div><br></div><div><div> -- | Like 'forkIOWithUnmask', but the child thread is a bound thread,</div>
<div> -- as with 'forkOS'.</div><div> forkOSWithUnmask :: ((forall a . IO a -> IO a) -> IO ()) -> 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,'Bitstream Vera Sans',Helvetica,sans-serif">For GHC < 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,'Bitstream Vera Sans',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,'Bitstream Vera Sans',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,'Bitstream Vera Sans',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,'Bitstream Vera Sans',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,'Bitstream Vera Sans',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,'Bitstream Vera Sans',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,'Bitstream Vera Sans',Helvetica,sans-serif">, however.</span><br>
</div><div><span style="font-size:13px;background-color:rgb(255,255,221);font-family:Verdana,Arial,'Bitstream Vera Sans',Helvetica,sans-serif"><br></span></div><div style><span style="font-size:13px;background-color:rgb(255,255,221);font-family:Verdana,Arial,'Bitstream Vera Sans',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 >= 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 -> IO () -> IO ()</div><div> forkModeWithUnmask :: ThreadMode</div><div> -> ((forall a. IO a -> IO a) -> IO ())</div>
<div> -> 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 "Add forkOSUnmasked" is a mistake (should be "Add forkOSWithUnmask"), 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,'Bitstream Vera Sans',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>