[Haskell-cafe] How to redirect a handle within a thread (GHC
6.4.1 runtime)?
Robert Dockins
robdockins at fastmail.fm
Wed Jan 18 16:06:06 EST 2006
On Jan 18, 2006, at 2:59 PM, Benjamin Franksen wrote:
> On Wednesday 18 January 2006 19:01, Dimitry Golubovsky wrote:
>> Is it possible to redirect a Handle (say stdout) somewhere only
>> within a running thread (started with forkIO) not touching the same
>> handle for the main and other threads?
>>
>> I have a lot of code written with putStr(Ln) which was used in a
>> program acting as a filter, i. e. stdout was redirected by the
>> invoking shell. Now I want to run this code within a thread in other
>> program, but output must go to a file (or a pipe, or anywhere else a
>> file descriptor may be opened for). So fdToHandle is not good because
>> I need to modify the `stdout' only for that thread, not to create a
>> new Handle. Rewriting the code is not a convenient way (but will be
>> done if nothing else helps) because then I will need to pass that
>> handle around.
>
> Isn't this _the_ real-world example perfectly matching Robert Dockins'
> 'threadlocal' proposal?
Yes, actually. This is precisely the use case that got me thinking
about threadlocal storage in the first place. I'm working on Shellac
(http://www.mail-archive.com/haskell@haskell.org/msg17871.html) and
it turns out that redirecting the standard output handle for a
specific thread would be really nice. The obvious alternative is to
pass in a function of type (String -> IO ()) and pass it around, and
make sure to use it instead of putStr and friends. The non-obvious
alternative is some unsafePerformIO hackery, as just posted. Either
way, its ugly.
[snip]
Rob Dockins
Speak softly and drive a Sherman tank.
Laugh hard; it's a long way to the bank.
-- TMBG
More information about the Haskell-Cafe
mailing list