<p dir="ltr">Hello, Rob.</p>
<p dir="ltr">We are using forkProcess for similar reason: "share" complex immutable state, that takes much time to be created, and process isolation. I wrote "share" because big part of the structure is not in pinned memory, thus it would be shared up to GC, that will relocate this structures. But in our case its OK, because we can allow multiplying of structure, and reduced initialization time outterweights other problems.</p>
<p dir="ltr">However in case if we need real sharing then we'd had to use other structures based on the storage pinned memory. </p>
<p dir="ltr">We never experienced deadlocks in our case. However there are known problems with forkProcess like:</p>
<p dir="ltr"><a href="https://ghc.haskell.org/trac/ghc/ticket/9347">https://ghc.haskell.org/trac/ghc/ticket/9347</a></p>
<p dir="ltr">and there were few topics in this mailing list, so you could get in a problematic case.</p>
<p dir="ltr">--<br>
Alexander</p>
<div class="gmail_quote">On Feb 21, 2015 3:59 AM, "Rob Leslie" <<a href="mailto:rob@mars.org">rob@mars.org</a>> wrote:<br type="attribution"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Hi folks,<br>
<br>
I’d love to get a sense of the prevailing wisdom with respect to forkProcess from System.Posix.Process.<br>
<br>
I’m building a multithreaded (STM) application with potentially many threads simultaneously reading and writing to pieces of (an otherwise rather large) shared state. Occasionally I would like to record a whole snapshot of that state, and it seems to me a natural way to accomplish this is to fork a process (eliminating all the other threads) and perform a read-only dump of the state. This dump can be time-consuming, which is why I’d rather not have contention with other threads that may be trying to modify the state while I’m dumping.<br>
<br>
My experience with forkProcess so far is that sometimes it works brilliantly, and other times it just deadlocks. I’m at a loss to understand what the problem is, but the deadlock seems to occur before the new process gets any control -- certainly before it has started to access any of the shared state.<br>
<br>
I’m aware of the giant warning in the forkProcess documentation, but I’m not sure if or how it could explain the behavior I’m seeing. Has anyone else used forkProcess successfully?<br>
<br>
It’s possible too that I’m running into something related to the way I’m setting up a pipe to receive messages from the forked process. Here is what I’m doing:<br>
<br>
> runInForkedProcess :: ((Text -> IO ()) -> IO ()) -><br>
>                       Consumer Text IO () -> IO Bool<br>
> runInForkedProcess iof consumer = do<br>
>   process <- newEmptyMVar<br>
>   result <- newEmptyMVar<br>
><br>
>   let handler = Catch $ do<br>
>         status <- getProcessStatus False False =<< readMVar process<br>
>         case status of<br>
>           Just (Exited code) -> void $ tryPutMVar result (code == ExitSuccess)<br>
>           Just Terminated{}  -> void $ tryPutMVar result False<br>
>           _                  -> return ()<br>
><br>
>   bracket (installHandler processStatusChanged handler Nothing)<br>
>     (\former -> installHandler processStatusChanged former Nothing) $ \_ -> do<br>
><br>
>     (input, output) <- createPipe<br>
><br>
>     processId <- forkProcess $ do<br>
>       closeFd input<br>
>       bracket (fdToHandle output) hClose $ \outHandle -> do<br>
>         hSetBuffering outHandle NoBuffering<br>
>         iof (hPutStrLn outHandle)<br>
>     putMVar process processId<br>
><br>
>     closeFd output<br>
><br>
>     bracket (fdToHandle input) hClose $ \inHandle -> do<br>
>       hSetBuffering inHandle NoBuffering<br>
>       runEffect $ fromHandle inHandle >-> for cat (yield . T.pack) >-> consumer<br>
><br>
>     takeMVar result<br>
<br>
Does anyone have any advice?<br>
<br>
Many thanks,<br>
<br>
--<br>
Rob Leslie<br>
<a href="mailto:rob@mars.org">rob@mars.org</a><br>
<br>
<br>
_______________________________________________<br>
Haskell-Cafe mailing list<br>
<a href="mailto:Haskell-Cafe@haskell.org">Haskell-Cafe@haskell.org</a><br>
<a href="http://mail.haskell.org/cgi-bin/mailman/listinfo/haskell-cafe" target="_blank">http://mail.haskell.org/cgi-bin/mailman/listinfo/haskell-cafe</a><br>
</blockquote></div>