Index: /trunk/include/iprt/req.h
===================================================================
--- /trunk/include/iprt/req.h	(revision 24099)
+++ /trunk/include/iprt/req.h	(revision 24100)
@@ -152,4 +152,6 @@
      */
     RTSEMEVENT              EventSem;
+    /** Set if busy (pending or processing requests). */
+    bool volatile           fBusy;
 } RTREQQUEUE;
 
@@ -363,4 +365,13 @@
 RTDECL(int) RTReqWait(PRTREQ pReq, unsigned cMillies);
 
+/**
+ * Checks if the queue is busy or not.
+ *
+ * The caller is responsible for dealing with any concurrent submitts.
+ *
+ * @returns true if busy, false if idle.
+ * @param   pQueue              The queue.
+ */
+RTDECL(bool) RTReqIsBusy(PRTREQQUEUE pQueue);
 
 #endif /* IN_RING3 */
Index: /trunk/src/VBox/Runtime/common/misc/req.cpp
===================================================================
--- /trunk/src/VBox/Runtime/common/misc/req.cpp	(revision 24099)
+++ /trunk/src/VBox/Runtime/common/misc/req.cpp	(revision 24100)
@@ -66,5 +66,5 @@
 
     int rc = RTSemEventCreate(&(*ppQueue)->EventSem);
-    if (rc != VINF_SUCCESS)
+    if (RT_SUCCESS(rc))
         RTMemFree(*ppQueue);
 
@@ -86,13 +86,13 @@
      */
     if (!pQueue)
-    {
-        AssertFailed();
-        return VERR_INVALID_PARAMETER;
-    }
+        return VINF_SUCCESS;
+    AssertPtr(pQueue);
     RTSemEventDestroy(pQueue->EventSem);
+    pQueue->EventSem = NIL_RTSEMEVENT;
     RTMemFree(pQueue);
     return VINF_SUCCESS;
 }
 RT_EXPORT_SYMBOL(RTReqDestroyQueue);
+
 
 /**
@@ -133,5 +133,7 @@
         if (!pReqs)
         {
-            /** @note We currently don't care if the entire time wasted here is larger than cMillies */
+            ASMAtomicWriteBool(&pQueue->fBusy, false); /* this aint 100% perfect, but it's good enough for now... */
+            /** @todo We currently don't care if the entire time wasted here is larger than
+             *        cMillies */
             rc = RTSemEventWait(pQueue->EventSem, cMillies);
             if (rc != VINF_SUCCESS)
@@ -139,4 +141,5 @@
             continue;
         }
+        ASMAtomicWriteBool(&pQueue->fBusy, true);
 
         /*
@@ -677,4 +680,5 @@
         pNext = pQueue->pReqs;
         pReq->pNext = pNext;
+        ASMAtomicWriteBool(&pQueue->fBusy, true);
     } while (!ASMAtomicCmpXchgPtr((void * volatile *)&pQueue->pReqs, (void *)pReq, (void *)pNext));
 
@@ -902,2 +906,24 @@
 }
 
+
+/**
+ * Checks if the queue is busy or not.
+ *
+ * The caller is responsible for dealing with any concurrent submitts.
+ *
+ * @returns true if busy, false if idle.
+ * @param   pQueue              The queue.
+ */
+RTDECL(bool) RTReqIsBusy(PRTREQQUEUE pQueue)
+{
+    AssertPtrReturn(pQueue, false);
+
+    if (ASMAtomicReadBool(&pQueue->fBusy))
+        return true;
+    if (ASMAtomicReadPtr((void * volatile *)&pQueue->pReqs) != NULL)
+        return true;
+    if (ASMAtomicReadBool(&pQueue->fBusy))
+        return true;
+    return false;
+}
+RT_EXPORT_SYMBOL(RTReqIsBusy);
