The only progress I made was to start this thread on the ghc-users mailing list:

http://www.haskell.org/pipermail/glasgow-haskell-users/2014-July/025107.html

The #1 issue I have is that it's not clear what changed in the transition from ghc-7.6 to ghc-7.8 that caused this problem. I think if we understood that we can better understand the potential solutions.

The worst case scenario (if the problem is can't be resolved) is that I just change the type of `spawn` to:

    spawn :: Buffer a -> Managed (Output a, Input a, STM ())

... where that will automatically `seal` the action when done. It's not as useful, but at least it will avoid the exception.

On 8/16/14, 2:14 PM, Tony Day wrote:
Any progress on this Gabe?

I was thinking of diving in and exploring weak references if no immediate solution has presented itself.

Knowing absolutely zero about them, to what extent could I apply equational reasoning to the minimum code, given the effects in there?

I took the liberty of adding this as an open issue on github.

On Monday, July 14, 2014 5:04:48 AM UTC+10, Gabriel Gonzalez wrote:

    Alright, so even when I switched to the safe `mkWeakTVar` I still
    see the exact same issue.  I've also reduced the minimal
    reproducing program to:

        import Pipes.Concurrent

        main = do
            (_, input) <- spawn Unbounded
            atomically $ recv input

    It seems like something has fundamentally changed about how weak
    references interact with STM transactions in ghc-7.8. Right now I
    am trying to see if there is some other way to accomplish the same
    behavior without weak references.

    On 7/7/14, 3:53 PM, Michael Thompson wrote:
    The bit about user input was nonsense; the example wasn't using
    the `user` it defined.  Here is a more minimal main (with the
    same `worker`):

        main = do
            (output, input) <- spawn (Bounded 1)
            a1  <- async $ runEffect $ fromInput input  >-> worker 1
            a2  <- async $ runEffect $ yield 1 >->  toOutput output
            wait a1
            wait a2

          $ ./work
         Worker #1: Processed 1
         work: thread blocked indefinitely in an STM transaction

    It works if a higher `Bounded` or if `Unbounded` is chosen; it
    works if the second `wait` is dropped, etc.
    The most striking difference was the use of `Unbounded` in the
    good version and `Bounded` in the separate module.



-- You received this message because you are subscribed to the
    Google Groups "Haskell Pipes" group.
    To unsubscribe from this group and stop receiving emails from it,
    send an email to [email protected] <javascript:>.
    To post to this group, send email to [email protected]
    <javascript:>.

--
You received this message because you are subscribed to the Google Groups "Haskell Pipes" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected] <mailto:[email protected]>. To post to this group, send email to [email protected] <mailto:[email protected]>.

--
You received this message because you are subscribed to the Google Groups "Haskell 
Pipes" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To post to this group, send email to [email protected].

Reply via email to