On Apr 19, 2011, at 11:04 AM, Marius Zwicker wrote:


Am 19.04.2011 um 18:27 schrieb Dave Zarzycki:


On Apr 19, 2011, at 9:09 AM, Dave Zarzycki wrote:

On Apr 19, 2011, at 8:07 AM, Marius Zwicker wrote:

I thought the main queue is available as a mean to be sure some blocks execute on the main thread (e.g. when updating the GUI is only possible while being on the main thread).

Marius,

That is only true if-and-only-if GCD is working in compatibility mode with Cocoa GUI logic, which for legacy reasons is bound to the main thread. If dispatch_main() is called, then GCD turns the main queue into a normal serial queue, with all of the performance advantages thereof.

P.S. – This is covered in the dispatch_main() man page:

COMPATIBILITY
     Cocoa applications need not call dispatch_main().  Blocks submitted to
     the main queue will be executed as part of the "common modes" of the
     application's main NSRunLoop or CFRunLoop.  However, blocks submitted to
     the main queue in applications using dispatch_main() are not guaranteed
     to execute on the main thread.

Thanks a lot for the information. I will try to implement similar functionality when using gui frameworks needing a "real" main thread as well. I assume the portions you were talking about can be found when searching for the DISPATCH_COCOA_COMPAT macro.

Marius,

Indeed! :-)

In short, we worked with our GUI team to have a kernel handle (in this case a Mach port, but it could easily be a Unix descriptor too). When that handle receives a message (or becomes readable in the case of a Unix descriptor), then they promise to call _dispatch_main_queue_callback_4CF() where CF is the common shorthand for the name of the library calling this API. You'd want to add your own equivalent with whatever arguments make sense. For example: _dispatch_main_queue_callback_4{GTK,KDE,X11,etc}(). We use the _4[A-Z][A-Z0-9*] suffix style to signify one-to-one contracts with other subsystems, and not general purpose API.

davez