Index: /trunk/src/VBox/Additions/common/VBoxGuest/VBoxGuest-darwin.cpp
===================================================================
--- /trunk/src/VBox/Additions/common/VBoxGuest/VBoxGuest-darwin.cpp	(revision 50687)
+++ /trunk/src/VBox/Additions/common/VBoxGuest/VBoxGuest-darwin.cpp	(revision 50688)
@@ -650,12 +650,12 @@
 
 /**
- * Just a plug
+ * Perform pending wake ups in work loop context.
  */
 static void
-interruptHandler(OSObject *pOwner, IOInterruptEventSource *pSrc, int cInts)
-{
-    NOREF(pOwner);
-    NOREF(pSrc);
-    NOREF(cInts);
+deferredInterruptHandler(OSObject *pOwner, IOInterruptEventSource *pSrc, int cInts)
+{
+    NOREF(pOwner); NOREF(pSrc); NOREF(cInts);
+
+    VBoxGuestWaitDoWakeUps(&g_DevExt);
 }
 
@@ -664,5 +664,5 @@
  */
 static bool
-checkForInterrupt(OSObject *pOwner, IOFilterInterruptEventSource *pSrc)
+directInterruptHandler(OSObject *pOwner, IOFilterInterruptEventSource *pSrc)
 {
     if (!pSrc)
@@ -670,5 +670,5 @@
 
     bool fTaken = VBoxGuestCommonISR(&g_DevExt);
-    if (!fTaken)
+    if (!fTaken) /** @todo r=bird: This looks bogus as we might actually be sharing interrupts with someone. */
         printf("VBoxGuestCommonISR error\n");
 
@@ -685,6 +685,6 @@
 
     m_pInterruptSrc = IOFilterInterruptEventSource::filterInterruptEventSource(this,
-                                                                               &interruptHandler,
-                                                                               &checkForInterrupt,
+                                                                               &deferredInterruptHandler,
+                                                                               &directInterruptHandler,
                                                                                pProvider);
 
Index: /trunk/src/VBox/Additions/common/VBoxGuest/VBoxGuest.cpp
===================================================================
--- /trunk/src/VBox/Additions/common/VBoxGuest/VBoxGuest.cpp	(revision 50687)
+++ /trunk/src/VBox/Additions/common/VBoxGuest/VBoxGuest.cpp	(revision 50688)
@@ -3089,9 +3089,9 @@
     RTSpinlockReleaseNoInts(pDevExt->EventSpinlock);
 
-#if defined(VBOXGUEST_USE_DEFERRED_WAKE_UP) && !defined(RT_OS_WINDOWS)
+#if defined(VBOXGUEST_USE_DEFERRED_WAKE_UP) && !defined(RT_OS_DARWIN) && !defined(RT_OS_WINDOWS)
     /*
      * Do wake-ups.
      * Note. On Windows this isn't possible at this IRQL, so a DPC will take
-     *       care of it.
+     *       care of it.  Same on darwin, doing it in the work loop callback.
      */
     VBoxGuestWaitDoWakeUps(pDevExt);
Index: /trunk/src/VBox/Additions/common/VBoxGuest/VBoxGuestInternal.h
===================================================================
--- /trunk/src/VBox/Additions/common/VBoxGuest/VBoxGuestInternal.h	(revision 50687)
+++ /trunk/src/VBox/Additions/common/VBoxGuest/VBoxGuestInternal.h	(revision 50688)
@@ -38,5 +38,5 @@
 /** @def VBOXGUEST_USE_WAKE_UP_LIST
  * Defer wake-up of waiting thread when defined. */
-#if defined(RT_OS_SOLARIS) || defined(RT_OS_WINDOWS) || defined(DOXYGEN_RUNNING)
+#if defined(RT_OS_DARWIN) || defined(RT_OS_SOLARIS) || defined(RT_OS_WINDOWS) || defined(DOXYGEN_RUNNING)
 # define VBOXGUEST_USE_DEFERRED_WAKE_UP
 #endif
