====== Grand Central Dispatch (GCD) on FreeBSD ======
This is a status and quick-start page on using Apple's Grand Central Dispatch (GCD) technology on the %%FreeBSD%% operating system. GCD support on %%FreeBSD%% was added by RobertWatson and StaceySon; the port is maintained by StanislavSedov.
===== Status =====
GCD support is considered production-worthy on %%FreeBSD%% 8.1 and later, and requires recent versions of the ''%%llvm-devel%%'' and ''%%compiler-rt%%'' ports. The kernel extensions required to support ''%%libdispatch%%'' first appeared in %%FreeBSD%% 8.1.
^ Branch ^ Date ^ Minimum SVN revision ^
| 7-STABLE | unsupported | unsupported |
| 8-STABLE | 2009-11-01 | r198732 |
| 9-CURRENT | 2009-09-18 | r197293 |
Experimental patches exist to add pthread workqueue support to the %%FreeBSD%% 9.x kernel, but are not present in shipped kernels (including 9-CURRENT).
===== Quick-start =====
- Install %%FreeBSD%% 8.1 (or later).
- Install the ''%%devel/libdispatch%%'' port, which will install ''%%llvm-devel%%'' and ''%%compiler-rt%%'' as dependencies.
''%%libdispatch%%'' works fine with ''%%gcc%%'' as shipped with %%FreeBSD%% for the function-centric interface dispatch APIs, but to use C Blocks you will need to build with ''%%clang -fblocks%%''. Also, ''%%llvm-gcc4%%'' (derived from Apple's gcc) and will work but is unsupported upstream.
As of version 10.0, %%FreeBSD%% ships with clang and compiler_rt in the base system so GCD is available out of the box. On Tier-2 platforms, where clang is not yet shipped by default, support for blocks has been added to GCC in base.
To build applications with ''%%libdispatch%%'', add ''%%-I/usr/local/include%%'' to compiler command lines, and ''%%-L/usr/local/lib -ldispatch%%'' to linker command lines.
===== A simple GCD program =====
This program schedules deferred execution of a C block that prints a message and exits:
#include
#include
#include
#include
int
main(int argc, char *argv[])
{
dispatch_queue_t q;
dispatch_time_t t;
q = dispatch_get_main_queue();
t = dispatch_time(DISPATCH_TIME_NOW, 5LL * NSEC_PER_SEC);
// Print a message and exit after 5 seconds.
dispatch_after(t, q, ^{
printf("block_dispatch\n");
exit(0);
});
dispatch_main();
return (0);
}
Compile this with:
clang -Wall -Werror -fblocks -L/usr/local/lib -I/usr/local/include -o test test.c -ldispatch
===== The same program, without C Blocks =====
Here's a similar program, performing the same work but using deferred functions rather than C Blocks:
#include
#include
#include
#include
void
deferred_code(__unused void *arg)
{
printf("block_dispatch\n");
exit(0);
}
int
main(int argc, char *argv[])
{
dispatch_queue_t q;
dispatch_time_t t;
q = dispatch_get_main_queue();
t = dispatch_time(DISPATCH_TIME_NOW, 5LL * NSEC_PER_SEC);
dispatch_after_f(t, q, NULL, deferred_code);
dispatch_main();
return (0);
}
Compile this with:
gcc -Wall -Werror -I/usr/local/include -L/usr/local/lib -o test2 test2.c -ldispatch
===== Experimental Patches =====
* [[https://reviews.freebsd.org/D3189|D3189]] based on Stacy Son's [[http://people.freebsd.org/~sson/thrworkq/|PThread Workqueues for FreeBSD 9.0]]
===== Useful references =====
[[http://youtu.be/nhbA9jZyYO4|Demo with GCD in action]]
''%%libdispatch%%'' ships with informative man pages describing not just the API, but also how to structure programs around GCD.
[[http://www.freebsd.org/news/status/report-2009-04-2009-09.html#Grand-Central-Dispatch---FreeBSD-port|April-September 2009 FreeBSD status report - Grand Central Dispatch port]] - status on the %%FreeBSD%% port of GCD
[[http://libdispatch.macosforge.org/|Mac OS X Forge - open source libdispatch home]] - libdispatch subversion repository and mailing lists
[[http://web.archive.org/web/20090920043909/http://images.apple.com/macosx/technology/docs/GrandCentral_TB_brief_20090903.pdf|Grand Central Dispatch: Technology Brief]] - a white paper from Apple introducing GCD.
Mac OS X Reference Library: Concurrency Programming Guide - a guide to concurrent programming on Mac OS X, much of which also applies to %%FreeBSD%% with the GCD port installed.
Mac Dev Center: Grand Central Dispatch Reference - reference material on GCD from Apple.
Mac OS Reference Library: Dispatch_Samples - sample code using GCD from Apple.
{{GrandCentralDispatch/20090918-devsummit-gcd-public.pdf?linkonly|20090918-devsummit-gcd-public.pdf}} - 2008 DevSummit Presentation