Axel,  this is great news, many thanks for working on it!

I'm interested in using Cairo from multiple threads.  What exactly is 
supported there?  Can I run an arbitrary Render operation on any thread 
I like?

Cheers,
        Simon

On 22/11/09 19:58, Axel Simon wrote:
> Dear Simon, Duncan,
>
> -threaded now works with Gtk2Hs. See below.
>
>
> On Tue, 2009-11-10 at 14:14 +0000, Simon Marlow wrote:
>> On 10/11/2009 13:52, Axel Simon wrote:
>
>>>> Does the traceback in my original message give you enough information?
>>>> (reproduced at the end of this message)
>>>
>>> Well, you omitted 'various' stuff. I agree that something is calling
>>> back into C when it shouldn't. Are there any function names between
>>> frame 6 and 44 that would give me a clue where we've been negligent?
>>
>> Ah yes, sorry.  Here's the full trace:
>>
>> (gdb) where
>> #0  0x0000003c0aa0af19 in pthread_cond_wait@@GLIBC_2.3.2 () from
>> /lib64/libpthread.so.0
>> #1  0x00000000005ac6e9 in waitCondition ()
>> #2  0x00000000005c67ab in waitForReturnCapability ()
>> #3  0x00000000005a3f17 in rts_lock ()
>> #4  0x00000000004ce397 in SystemziGlibziGObject_d1wV ()
>> #5  0x0000003c10cd8eed in ?? () from /usr/lib64/libgtk-x11-2.0.so.0
>> #6  0x0000003c0ba0d6a8 in g_object_unref () from /lib64/libgobject-2.0.so.0
>> #7  0x0000003c10ccebc7 in gtk_tree_view_remove_column () from
>
> I understand now where this error is. There is a call in your program to
> cellLayoutSetAttributes. This function installs certain callbacks that
> Gtk+ tries to free in the stack trace above. The call stack above is
> triggered by
>
>> #41 0x0000003c0ba0d632 in g_object_unref ()
> from /lib64/libgobject-2.0.so.0
>> #42 0x00000000005abdfd in runAllCFinalizers ()
>
> ... and I suppose runAllCFinalizers is the GC and an 'unsafe' call from
> Haskell. Thus, it is actually only possible  to use the C function
> freeHaskellPtr. I do that now.
>
>
>>     (3) use Haskell finalizers with idleAdd as a temporary workaround.
>>
>> (3) is by far the easiest solution, but it may have unacceptable
>> performance, I'd interested to know if that's the case.  The runtime
>> does batch multiple finalizers so they don't each get a separate Haskell
>> thread, so it might not be too bad.
>>
>> I'm not completely averse to doing (1) if it's absolutely necessary, but
>> I'd like to do something that avoids having a dependency on a future
>> version of GHC.  And all things being equal, we should avoid adding new
>> features to GHC because they're hard to remove again.
>
> So now there are two kinds of finalizers:
>
> (1) those that directly free the C GObject which are used in Cairo and
> (in the future) Pango, Pixbuf, and all other libraries whose objects do
> not call back into Haskell.
>
> (2) all finalizers of Gtk+ and libraries that build upon Gtk+
> (sourceview, etc). These call a special finalizer that enqueues the
> object to be finalized into an array and install a an g_idle_add handler
> that will run the finalizers from the main iteration loop of Gtk+ and,
> thus, from the right thread and from a safe call.
>
> All objects in (2) can therefore call back to Haskell while they are
> being destroyed. I have therefore moved the possibility to add a WeakRef
> (a function that is called when a GObject is finalized) to from GObject
> to Graphics.UI.Gtk.Abstract.Object which means they can only be
> installed on objects that fall into category (2).
>
> So the darcs version of Gtk2Hs with -threaded should now work as
> expected. You're still responsible to call Gtk2Hs function from the same
> Haskell thread. But you can create Cairo drawings and Pagno stuff in
> different threads and pass them to the main thread.
>
> Cheers,
> Axel.
>
>


------------------------------------------------------------------------------
Let Crystal Reports handle the reporting - Free Crystal Reports 2008 30-Day 
trial. Simplify your report design, integration and deployment - and focus on 
what you do best, core application coding. Discover what's new with
Crystal Reports now.  http://p.sf.net/sfu/bobj-july
_______________________________________________
Gtk2hs-devel mailing list
Gtk2hs-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/gtk2hs-devel

Reply via email to