Index: /trunk/src/libs/xpcom18a4/ipc/ipcd/extensions/dconnect/src/ipcDConnectService.cpp
===================================================================
--- /trunk/src/libs/xpcom18a4/ipc/ipcd/extensions/dconnect/src/ipcDConnectService.cpp	(revision 39634)
+++ /trunk/src/libs/xpcom18a4/ipc/ipcd/extensions/dconnect/src/ipcDConnectService.cpp	(revision 39635)
@@ -53,9 +53,12 @@
 
 #ifdef VBOX
-#include <map>
-#include <list>
+# include <map>
+# include <list>
+# include <iprt/err.h>
+# include <iprt/req.h>
+# include <iprt/mem.h>
 #endif /* VBOX */
 
-#if defined(DCONNECT_MULTITHREADED)
+#if defined(DCONNECT_MULTITHREADED) && !defined(DCONNECT_WITH_IPRT_REQ_POOL)
 
 #include "nsIThread.h"
@@ -2869,5 +2872,5 @@
 //-----------------------------------------------------------------------------
 
-#if defined(DCONNECT_MULTITHREADED)
+#if defined(DCONNECT_MULTITHREADED)  && !defined(DCONNECT_WITH_IPRT_REQ_POOL)
 
 class DConnectWorker : public nsIRunnable
@@ -2977,5 +2980,5 @@
 }
 
-#endif // defined(DCONNECT_MULTITHREADED)
+#endif // defined(DCONNECT_MULTITHREADED) && !defined(DCONNECT_WITH_IPRT_REQ_POOL)
 
 //-----------------------------------------------------------------------------
@@ -2986,4 +2989,7 @@
  , mDisconnected(PR_TRUE)
  , mStubQILock(NULL)
+#if defined(DCONNECT_WITH_IPRT_REQ_POOL)
+ , mhReqPool(NIL_RTREQPOOL)
+#endif
 {
 }
@@ -3018,4 +3024,8 @@
   PR_DestroyLock(mStubLock);
   PR_DestroyLock(mLock);
+#if defined(DCONNECT_WITH_IPRT_REQ_POOL)
+  RTReqPoolRelease(mhReqPool);
+  mhReqPool = NIL_RTREQPOOL;
+#endif
 }
 
@@ -3062,4 +3072,18 @@
 
 #if defined(DCONNECT_MULTITHREADED)
+# if defined(DCONNECT_WITH_IPRT_REQ_POOL)
+  int vrc = RTReqPoolCreate(1024 /*cMaxThreads*/, 10*RT_MS_1SEC /*cMsMinIdle*/,
+                            8 /*cThreadsPushBackThreshold */, RT_MS_1SEC /* cMsMaxPushBack */,
+                            "dconnect", &mhReqPool);
+  if (RT_FAILURE(vrc))
+  {
+    mhReqPool = NIL_RTREQPOOL;
+    return NS_ERROR_FAILURE;
+  }
+
+  /// @todo check where this is used.
+  mDisconnected = PR_FALSE;
+
+# else
 
   mPendingMon = nsAutoMonitor::NewMonitor("DConnect pendingQ monitor");
@@ -3086,4 +3110,5 @@
   }
 
+# endif
 #else
 
@@ -3109,4 +3134,14 @@
 
 #if defined(DCONNECT_MULTITHREADED)
+# if defined(DCONNECT_WITH_IPRT_REQ_POOL)
+
+#  if defined(DCONNECT_STATS)
+  /// @todo print pool stats.
+#  endif
+
+  RTReqPoolRelease(mhReqPool);
+  mhReqPool = NIL_RTREQPOOL;
+
+# else
 
   {
@@ -3138,4 +3173,5 @@
   nsAutoMonitor::DestroyMonitor(mPendingMon);
 
+# endif
 #endif
 
@@ -3410,4 +3446,15 @@
 
 #if defined(DCONNECT_MULTITHREADED)
+# if defined(DCONNECT_WITH_IPRT_REQ_POOL)
+
+  void *pvDataDup = RTMemDup(aData, aDataLen);
+  if (RT_UNLIKELY(!pvDataDup))
+    return NS_ERROR_OUT_OF_MEMORY;
+  int rc = RTReqPoolCallVoidNoWait(mhReqPool, (PFNRT)ProcessMessageOnWorkerThread, 4,
+                                   this, aSenderID, pvDataDup, aDataLen);
+  if (RT_FAILURE(rc))
+    return NS_ERROR_FAILURE;
+
+# else
 
   nsAutoMonitor mon(mPendingMon);
@@ -3441,4 +3488,5 @@
   }
 
+# endif
 #else
 
@@ -3543,4 +3591,18 @@
 
 //-----------------------------------------------------------------------------
+
+#if defined(DCONNECT_WITH_IPRT_REQ_POOL)
+/**
+ * Function called by the request thread pool to process a incoming request in
+ * the context of a worker thread.
+ */
+/* static */ DECLCALLBACK(void)
+ipcDConnectService::ProcessMessageOnWorkerThread(ipcDConnectService *aThis, PRUint32 aSenderID, void *aData, PRUint32 aDataLen)
+{
+  if (!aThis->mDisconnected)
+    aThis->OnIncomingRequest(aSenderID, (const DConnectOp *)aData, aDataLen);
+  RTMemFree(aData);
+}
+#endif
 
 void
Index: /trunk/src/libs/xpcom18a4/ipc/ipcd/extensions/dconnect/src/ipcDConnectService.h
===================================================================
--- /trunk/src/libs/xpcom18a4/ipc/ipcd/extensions/dconnect/src/ipcDConnectService.h	(revision 39634)
+++ /trunk/src/libs/xpcom18a4/ipc/ipcd/extensions/dconnect/src/ipcDConnectService.h	(revision 39635)
@@ -40,4 +40,7 @@
 #if !defined(DCONNECT_SINGLETHREADED) && !defined(DCONNECT_MULTITHREADED)
 #define DCONNECT_MULTITHREADED
+# ifdef VBOX
+//#  define DCONNECT_WITH_IPRT_REQ_POOL - needs testing
+# endif
 #endif
 
@@ -59,4 +62,9 @@
 
 #if defined(DCONNECT_MULTITHREADED)
+# if defined(DCONNECT_WITH_IPRT_REQ_POOL)
+
+#  include <iprt/req.h>
+
+# else /* !DCONNECT_WITH_IPRT_REQ_POOL*/
 
 #include "ipcList.h"
@@ -80,4 +88,5 @@
 };
 
+# endif // !DCONNECT_WITH_IPRT_REQ_POOL
 #endif // DCONNECT_MULTITHREADED
 
@@ -275,5 +284,9 @@
 
 #if defined(DCONNECT_MULTITHREADED)
+# if defined(DCONNECT_WITH_IPRT_REQ_POOL)
+  static DECLCALLBACK(void) ProcessMessageOnWorkerThread(ipcDConnectService *aThis, PRUint32 aSenderID, void *aData, PRUint32 aDataLen);
+# else
   NS_HIDDEN_(nsresult) CreateWorker();
+# endif
 #endif
 
@@ -310,4 +323,10 @@
 
 #if defined(DCONNECT_MULTITHREADED)
+# if defined(DCONNECT_WITH_IPRT_REQ_POOL)
+
+  /** Request pool. */
+  RTREQPOOL mhReqPool;
+
+# else
 
   friend class DConnectWorker;
@@ -323,5 +342,5 @@
   // monitor used to wait on changes in mWaitingWorkers.
   PRMonitor *mWaitingWorkersMon;
-
+# endif
 #endif
 
