[libdispatch-dev] libdispatch port to FreeBSD (was: [libdispatch-changes] [27] trunk/src)

Robert Watson robert at fledge.watson.org
Mon Sep 14 13:05:10 PDT 2009

Dear all--

I have committed an initial autoconf/automake/libtool build framework to 
libdispatch svn, and a first cut at conditionally compiling Apple-specific 
pieces of libdispatch.  This allows libdispatch to build on both FreeBSD and 
Mac OS X Snow Leopard.

Some notes for FreeBSD hackers:

- Several kqueue extensions (EVFILT_USER, NOTE_TRIGGER, EV_RECEIPT, and
   EV_DISPATCH) are required in the FreeBSD kernel, and hopefully will go into
   the FreeBSD tree in the next couple of days.

- Blocks are definitely not yet supported -- there seems to be a lot of
   interest, so I'm optimistic.  As compilers aren't my forte, any assistance
   in this department would be most appreciated. :-)

- On FreeBSD, there is no support for Apple's pthread work queue primitive, so
   I'm using the fallback worker code in libdispatch.  The FreeBSD kernel
   community needs to have a conversation about the right way to address this
   requirement, but in the mean time the worker model should be fine.

- There are also some kqueue events present in FreeBSD but not in Mac OS X;
   these may require tweaks to libdispatch to fully support by GCD-aware
   applications using these FreeBSD events.

- I have developed and tested on a 32-bit Intel system; the comments below on
   -march on Mac OS X likely apply for FreeBSD/amd64 users as well.

Some notes for Mac OS X hackers:

- For now, you will need to hand-trim the -march line from src/Makefile.
   This should be fixed soon by some further autoconf work.

- When I use the externally-built dylib on Snow Leopard, test programs spin.
   This may be due to interference between the libSystem dispatch code and the
   dylib -- possibly forcing the use of pthread_create_key rather than reserved
   keys would help.

- I have not attempted to configure/build for Leopard as yet, but this change
   should make that a lot easier.  EVFILT_USER is likely the biggest obstacle.

Some notes for Linux hackers:

- The lack of kqueue support is the critical obstacle in a port to Linux.  It
   may be that a kqueue emulation library based on epoll (or even libevent)
   could fill this gap.  If someone wants to look at this, pay very careful
   attention to kqueue semantics, as libdispatch relies on them heavily.

Please consider this a work-in-progress -- don't be surprised when it doesn't 
build, let alone work.  :-)

Finally: this work would not have been possible without the support of Jordan 
Hubbard, Kevin Van Vechten, Dave Zarzycki, Bill Siegrist, and Apple.  I am 
surprised by how easily the porting has gone so far -- it's a credit to their 
careful planning and quality of implementation that it has gone so smoothly.

Thanks also to Peter O'Gorman and Colin Percival for their assistance with 
auto*, my nemesis.

With any luck, there will be more good porting news to report in the near 


Robert N M Watson
Computer Laboratory
University of Cambridge

---------- Forwarded message ----------
Date: Mon, 14 Sep 2009 11:46:19 -0700 (PDT)
From: source_changes at macosforge.org
Reply-To: libdispatch-dev at lists.macosforge.org
To: libdispatch-changes at lists.macosforge.org
Subject: [libdispatch-changes] [27] trunk/src


       robert at fledge.watson.org

       2009-09-14 11:46:18 -0700 (Mon, 14 Sep 2009)

   Log Message

Port of libdispatch to the FreeBSD operating system, which consisted of
disabling various Mac OS X-specific portions of the library (such as Mach),
providing portable versions of certain services internally (POSIX semaphores
instead of Mach semaphores, clock_gettime() instead of mac_absolute_time()),
and providing an autoconf/automake/libtool build infrastructure.  This is
just a first cut, refinement to follow.

Conditionalize portions of the libdispatch build as follows:

 	If Mach is present, support Mach ports throughout libdispatch.

 	If defined, add the 'constructor' attribute to libdispatch_init so
 	that it runs as part of library initialization.  This is not needed
 	in Mac OS X libSystem due to explicit invocation of libpthread_init
 	by libsyscall, but is for a stand-alone library.

 	Conditionally support kqueue events that are not present on FreeBSD.

 	Expand the scope of this existing macro to allow libdispatch to
 	build without legacy.c.

 	Wrap mach_absolute_time() in _dispatch_absolute_time(), and
 	provide a portable clock_gettime() implementation.  Some further
 	refinment will be required here.

 	Only use non-portable assembly optimizations of dispatch semaphores
 	if supported.

 	Use POSIX semaphores if Mach semaphores aren't present; further
 	ifdef'ing possibly required here.  If neither HAVE_MACH nor
 	HAVE_SEM_INIT are present, the compile will fail.

 	Only define Mac OS X crashreporter state if requested.

 	Only compile in support for pthread work queues if present;
 	otherwise force use of normal worker threads.

 	If defined, use non-portable allocation of pthread keys--otherwise,
 	use pthread_create_key().

 	Only use non-portable assembly optimizations if dispatch thread-
 	specific data if this is defined.

 	If not present, use compat/malloc_zone.h which implements the malloc
 	zone APIs using normal malloc(3).

Also fix some portability nits for building, such as casting before using
long as a format string for several types.  Note that this port will not
build or run on a stock FreeBSD release or svn distribution yet, as it
relies on kqueue extensions not committed back to FreeBSD yet.

There are several known issues, such as how best to map CLOCK_UPTIME or
CLOCK_MONOTONIC struct timespec timestamps into a Mach absolute time
int64_t number space.  Also, the POSIX semaphore ifdefing is adequate but
not complete.

   Modified Paths

  *  trunk/src/benchmark.c
  *  trunk/src/dispatch.h
  *  trunk/src/internal.h
  *  trunk/src/legacy.h
  *  trunk/src/os_shims.h
  *  trunk/src/private.h
  *  trunk/src/queue.c
  *  trunk/src/queue_internal.h
  *  trunk/src/semaphore.c
  *  trunk/src/semaphore_internal.h
  *  trunk/src/shims.c
  *  trunk/src/source.c
  *  trunk/src/source.h
  *  trunk/src/source_private.h
  *  trunk/src/time.c


     Modified: trunk/src/benchmark.c (26 => 27)

More information about the libdispatch-dev mailing list