Index: /trunk/include/VBox/GuestHost/SharedClipboard.h
===================================================================
--- /trunk/include/VBox/GuestHost/SharedClipboard.h	(revision 82533)
+++ /trunk/include/VBox/GuestHost/SharedClipboard.h	(revision 82534)
@@ -205,5 +205,5 @@
 SHCLEVENTID ShClEventIDGenerate(PSHCLEVENTSOURCE pSource);
 SHCLEVENTID ShClEventGetLast(PSHCLEVENTSOURCE pSource);
-int ShClEventRegister(PSHCLEVENTSOURCE pSource, SHCLEVENTID idEvent);
+/*int ShClEventRegister(PSHCLEVENTSOURCE pSource, SHCLEVENTID idEvent);*/
 int ShClEventUnregister(PSHCLEVENTSOURCE pSource, SHCLEVENTID idEvent);
 int ShClEventWait(PSHCLEVENTSOURCE pSource, SHCLEVENTID idEvent, RTMSINTERVAL uTimeoutMs, PSHCLEVENTPAYLOAD *ppPayload);
Index: /trunk/src/VBox/GuestHost/SharedClipboard/clipboard-common.cpp
===================================================================
--- /trunk/src/VBox/GuestHost/SharedClipboard/clipboard-common.cpp	(revision 82533)
+++ /trunk/src/VBox/GuestHost/SharedClipboard/clipboard-common.cpp	(revision 82534)
@@ -443,4 +443,6 @@
  * @param   uID                 Event ID to signal.
  * @param   pPayload            Event payload to associate. Takes ownership. Optional.
+ *
+ * @note    Caller must enter crit sect protecting the event source!
  */
 int ShClEventSignal(PSHCLEVENTSOURCE pSource, SHCLEVENTID uID,
Index: /trunk/src/VBox/HostServices/SharedClipboard/VBoxSharedClipboardSvc-x11.cpp
===================================================================
--- /trunk/src/VBox/HostServices/SharedClipboard/VBoxSharedClipboardSvc-x11.cpp	(revision 82533)
+++ /trunk/src/VBox/HostServices/SharedClipboard/VBoxSharedClipboardSvc-x11.cpp	(revision 82534)
@@ -189,13 +189,10 @@
     if (pReq)
     {
-        const SHCLEVENTID uEvent = ShClEventIDGenerate(&pClient->EventSrc);
-
         pReq->pv        = pData->pvData;
         pReq->cb        = pData->cbData;
         pReq->pcbActual = pcbActual;
-        pReq->uEvent    = uEvent;
-
-        rc = ShClEventRegister(&pClient->EventSrc, uEvent);
-        if (RT_SUCCESS(rc))
+        const SHCLEVENTID idEvent = ShClEventIdGenerateAndRegister(&pClient->EventSrc);
+        pReq->uEvent    = idEvent;
+        if (idEvent)
         {
             rc = ShClX11ReadDataFromX11(&pClient->State.pCtx->X11, pData->uFormat, pReq);
@@ -203,5 +200,5 @@
             {
                 PSHCLEVENTPAYLOAD pPayload;
-                rc = ShClEventWait(&pClient->EventSrc, uEvent, 30 * 1000, &pPayload);
+                rc = ShClEventWait(&pClient->EventSrc, idEvent, 30 * 1000, &pPayload);
                 if (RT_SUCCESS(rc))
                 {
@@ -213,5 +210,10 @@
             }
 
-            ShClEventUnregister(&pClient->EventSrc, uEvent);
+            ShClEventUnregister(&pClient->EventSrc, idEvent);
+        }
+        else
+        {
+            RTMemFree(pReq);
+            rc = VERR_GENERAL_FAILURE;
         }
     }
@@ -295,6 +297,8 @@
         }
 
+        RTCritSectEnter(&pCtx->pClient->CritSect);
         rc2 = ShClEventSignal(&pCtx->pClient->EventSrc, pReq->uEvent, pPayload);
         AssertRC(rc2);
+        RTCritSectLeave(&pCtx->pClient->CritSect);
     }
 
Index: /trunk/src/VBox/HostServices/SharedClipboard/VBoxSharedClipboardSvc.cpp
===================================================================
--- /trunk/src/VBox/HostServices/SharedClipboard/VBoxSharedClipboardSvc.cpp	(revision 82533)
+++ /trunk/src/VBox/HostServices/SharedClipboard/VBoxSharedClipboardSvc.cpp	(revision 82534)
@@ -1236,5 +1236,7 @@
     if (RT_SUCCESS(rc))
     {
+        RTCritSectEnter(&pClient->CritSect);
         rc = ShClEventSignal(&pClient->EventSrc, uEvent, pPayload);
+        RTCritSectLeave(&pClient->CritSect);
         if (RT_FAILURE(rc))
             ShClPayloadFree(pPayload);
