Re: deprecating gdk threads



On 7/29/2012 12:09 PM, Matthias Clasen wrote:
I've put patches for deprecating the gdk threading api at
https://bugzilla.gnome.org/show_bug.cgi?id=680754
Review appreciated.


I'd like to bring up the issue of how language bindings should cope with this.

Basically, the consensus from previous discussions even in language bindings, it is up to application authors to handle callbacks coming in another threads by wrapping code which needs to manipulate GTK into function/closure and schedule its execution via GLib.idle_add(). While this works generally pretty well (except that it puts the burden of knowing that the callback might be invoked in non-main thread to the application developer), there is unresolved issue with regard to destructors/finalizers.

Higher level languages typically use some form of garbage collection and thus the time when finalizers are invoked are not deterministic. AFAIK python invokes finalizer callbacks from separate thread, Lua uses the same thread which is currently executing the Lua context, I'm not sure about other languages but I guess that it is similar. In the end, this means that finalizers (which typically invoke g_object_unref()) can be invoked in the context of any thread and application/binding has generally little control over this.

AFAICS, this does not play nice with gdk threads deprecation, because one way to solve the GC finalization problems was to gdk_threads_enter() before entering g_object_unref() call.

One way to solve this would be to put the burden on the bindings implementation, and force the bindings to queue g_object_unref() calls using g_idle_add() to be executed in the main thread. This seems to be rather ineffective though.

Another way to solve this problem might be inside GDK itself, which might check whether native window disposal function needs to be transferred to the main thread and if yes, do it internally and transparently. The advantages are:

+ it is done only when needed (eg only on Win32/Quartz/whatever, only when called from 'bad' thread, only when g_object_unref() actually results in window destruction)
+ much more error prone

- the actual native window destroy function can be called 'asynchronously' from the POV of the caller.
- someone has to implement this :-(


Thanks for reading and for any and all comments.

pavel




[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]