#4810: Versions of bracket without masking acquire action
---------------------------------+------------------------------------------
Reporter: mitar | Owner:
Type: proposal | Status: new
Priority: normal | Milestone:
Component: libraries/base | Version: 7.0.1
Keywords: | Testcase:
Blockedby: | Difficulty:
Os: Unknown/Multiple | Blocking:
Architecture: Unknown/Multiple | Failure: None/Unknown
---------------------------------+------------------------------------------
Comment(by mitar):
Replying to [comment:3 simonmar]:
> but can't you just transform that to
I do not see a way. This is an example from a library where user can use
bracket to wrap my library calls but then I am "unable" to use bracket
inside my library (and I want to use bracket because I want that my
function to be interruptible). What I want to do is to tell the user that
best practice is to use unmasked version of a bracket when using my
library because I do take care of cleaning myself. But of course user
should use bracket because it should cleanup things. This is somewhat a
motivation behind all this. How to give an user a simple suggestion what
to use when calling my library. It should be an acquire-use-release
approach, but I would like to have acquire interruptible for the user (at
least in my best practice suggestion, user could still of course mask
everything if this is the best for him/her, but currently user does not
have this option to choose, it is always masked with bracket). And I also
want this acquire and release parts to be available separately to the
user.
Maybe I have to do one step back and rethink everything. I started from
bracket and now I am trying to modify a bracket to suit my needs by maybe
it should be simply something else to begin with.
> That wouldn't be safe either, because there would be a window at the end
of the acquire action with exceptions unblocked.
True. It seems the correct approach is not that whole acquire action is
unmasked, but that somewhere internally it can be unmasked (where acquire
action can make sure everything is correctly handled).
> Right, so here you can receive an exception after the `forkIO`, and
`doSomethingWithThread` will not be executed.
This is not the problem. The problem is that `killThread` is not executed.
> Wouldn't that solve your problem?
Yes. In my particular instance it would. Please add also a version for
`forkOnIO`.
But I still argue that we need also:
{{{
bracketWithUnmask :: ((forall a. IO a -> IO a) -> IO a) -> (a -> IO b) ->
(a -> IO c) -> IO c
}}}
Although it seems it will not be useful in my case as I would have to
change type signature for acquire function.
--
Ticket URL: <http://hackage.haskell.org/trac/ghc/ticket/4810#comment:4>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler
_______________________________________________
Glasgow-haskell-bugs mailing list
[email protected]
http://www.haskell.org/mailman/listinfo/glasgow-haskell-bugs