Integrating ghc's rts into other single-threaded frameworks

Wolfgang Thaller wolfgang.thaller at gmx.net
Thu May 6 00:20:50 EDT 2004


> So here's what I don't understand: we make a non-blocking call to 
> gtk+'s
> main loop

So far, so good.

> (which makes a blocking call in a new OS thread).

With (the current version of) GHC's threaded RTS, there's only one OS 
thread involved until you spawn a second thread (with forkIO or 
forkOS).

> So we get
> callbacks from gtk in this other thread, which is fine.

I'd expect you to get the callbacks in the same thread as the call-out, 
that is in your main thread (the same thread that was used to run the 
"main" action).

> However if we
> launch any other Haskell threads that want to update the GUI in any way
> they need to make calls in the GUI OS thread. But the GUI OS thread is
> not in Haskell land at this point, it's blocked in a call to the gtk+
> main loop.

Correct. GTK will need to help you a bit here for this to work.
Many GUI toolkits offer a "post event to main event loop" function that 
may be called from any thread, at any time. You could use that to send 
a StablePtr (IO ()) to the GUI thread.
You could also use a pipe to send that StablePtr to the GUI thread (I'm 
sure you can make GTK's event loop wait until a file descriptor is 
readable).
I don't think that this machinery should take more than ten or twenty 
lines of code to implement.
The absolute worst-case scenario involves registering a timer callback 
with GTK and regularily polling a Chan (IO ())...

Cheers,

Wolfgang



More information about the Glasgow-haskell-users mailing list