[Gtk2hs-users] ANNOUNCE: GHC 6.12.3 Release Candidate 1

Axel Simon Axel.Simon at in.tum.de
Thu May 27 14:22:24 EDT 2010


On 27.05.2010, at 19:50, Bulat Ziganshin wrote:

> Hello Axel,
>
> Thursday, May 27, 2010, 8:42:08 PM, you wrote:
>
>> - you use -threaded to compile your program
>> - you only use postGUISync and postGUIAsync from threads different to
>> the Gtk2Hs thread
>
>> Is this true? If yes, I'll give you an elaboration on how threads are
>> supposed to work in Gtk+ (I think I finally understood this!) and  
>> what
>> I've changed in 0.11.0.
>
> i'm among (probably many) developers who interested to hear it. i
> believe that gtk2hs uses thread where it was initialized as main (this
> thread should be bound so it's either main thread or one created with
> runInBoundThread/forkOS) and the everything should either run in this
> thread directly, or in signal hadlers (that are executed in this
> thread) or via postGUISync/postGUIAsync. moreover postGUISync can't be
> used inside main GUI thread due to locking
>
> as you may remember, once i proposed to add wrapper that is equal to
> id in main GUI thread but equal to postGUISync in other threads. or
> even better, wrap all gtk2hs operations in this wrapper

Yes, I should perhaps dig that up and implement it. I actually suspect  
that Christian ran either into this problem or that he doesn't compile  
with -threaded. Hopefully it's one of those two options and not  
another concurrency bug in Gtk2Hs.

So the story with the threads is as follows:

You can use just a single thread. This is done when you compile  
without -threaded. You need to do the 'addIdle 50 >> yield' trick.

You can use the -threaded option to ghc or you use ghci. Now there  
exists one lock for the whole of Gtk+.

This lock  must be acquired before gtk_init is called. (This is what I  
fixed before the release: without it, it worked on Unix but not on  
Windows.) The lock remains acquired by the OS thread that calls Gtk+.  
In particular, it remains acquire as long as signals are pending and  
dispatched.

The only time this look is released is when Gtk+ enters its main loop.  
It may then block on input or run an idle handler.

During this time, it is possible for a different OS thread (or any odd  
Haskell thread that may or may not run in a different OS thread) to  
acquire the lock, modify some widget state and release the lock.  
However, most widget methods call also to the OS and accessing the  
Win32 API from more than one OS thread is not possible due to Win32  
using some thread-local state. Thus, using this method for concurrent  
updates is not recommended.

Enter postGUIAsync. This method will add an idle handler to the Gtk+  
main loop (this is done by glib in a thread safe way) which executes  
an action from the idle handler. This idle handler will be called from  
the main loop and thus be in the Gtk+ OS thread. The action can  
therefore safely access all widget methods. Since the action is  
performed in the Gtk+ OS thread, no expensive computation should be  
done, merely the widgets should be updated.

I hope this helps to clarify the thread situation in Gtk+.

Cheers,
Axel


More information about the Glasgow-haskell-users mailing list