Index: /trunk/src/VBox/Main/src-server/DataStreamImpl.cpp
===================================================================
--- /trunk/src/VBox/Main/src-server/DataStreamImpl.cpp	(revision 74822)
+++ /trunk/src/VBox/Main/src-server/DataStreamImpl.cpp	(revision 74823)
@@ -78,10 +78,12 @@
     HRESULT hrc = S_OK;
 
-    m_aBufferSize        = aBufferSize;
     m_hSemEvtDataAvail   = NIL_RTSEMEVENT;
     m_hSemEvtBufSpcAvail = NIL_RTSEMEVENT;
+    m_pBuffer            = NULL;
     int vrc = RTSemEventCreate(&m_hSemEvtDataAvail);
     if (RT_SUCCESS(vrc))
         vrc = RTSemEventCreate(&m_hSemEvtBufSpcAvail);
+    if (RT_SUCCESS(vrc))
+        vrc = RTCircBufCreate(&m_pBuffer, aBufferSize);
 
     if (RT_FAILURE(vrc))
@@ -111,9 +113,10 @@
     if (!autoUninitSpan.uninitDone())
     {
-        m_aBuffer.clear();
         if (m_hSemEvtDataAvail != NIL_RTSEMEVENT)
             RTSemEventDestroy(m_hSemEvtDataAvail);
         if (m_hSemEvtBufSpcAvail != NIL_RTSEMEVENT)
             RTSemEventDestroy(m_hSemEvtBufSpcAvail);
+        if (m_pBuffer != NULL)
+            RTCircBufDestroy(m_pBuffer);
         m_hSemEvtDataAvail = NIL_RTSEMEVENT;
         m_hSemEvtBufSpcAvail = NIL_RTSEMEVENT;
@@ -131,5 +134,5 @@
 {
     AutoReadLock alock(this COMMA_LOCKVAL_SRC_POS);
-    *aReadSize = (ULONG)m_aBuffer.size();
+    *aReadSize = (ULONG)RTCircBufUsed(m_pBuffer);
     return S_OK;
 }
@@ -160,5 +163,5 @@
 
     int vrc = VINF_SUCCESS;
-    while (   !m_aBuffer.size()
+    while (   !RTCircBufUsed(m_pBuffer)
            && !m_fEos
            && RT_SUCCESS(vrc))
@@ -175,7 +178,9 @@
     HRESULT hrc = S_OK;
     if (   RT_SUCCESS(vrc)
-        && m_aBuffer.size())
-    {
-        size_t cbCopy = RT_MIN(aSize, m_aBuffer.size());
+        && RTCircBufUsed(m_pBuffer))
+    {
+
+        size_t off = 0;
+        size_t cbCopy = RT_MIN(aSize, RTCircBufUsed(m_pBuffer));
         if (cbCopy != aSize)
         {
@@ -183,6 +188,17 @@
             aData.resize(cbCopy);
         }
-        aData.insert(aData.begin(), m_aBuffer.begin(), m_aBuffer.begin() + cbCopy);
-        m_aBuffer.erase(m_aBuffer.begin(), m_aBuffer.begin() + cbCopy);
+
+        while (cbCopy)
+        {
+            void *pvSrc = NULL;
+            size_t cbThisCopy = 0;
+
+            RTCircBufAcquireReadBlock(m_pBuffer, cbCopy, &pvSrc, &cbThisCopy);
+            memcpy(&aData.front() + off, pvSrc, cbThisCopy);
+            RTCircBufReleaseReadBlock(m_pBuffer, cbThisCopy);
+
+            cbCopy -= cbThisCopy;
+            off    += cbThisCopy;
+        }
         vrc = RTSemEventSignal(m_hSemEvtBufSpcAvail);
         AssertRC(vrc);
@@ -192,5 +208,5 @@
         Assert(   RT_FAILURE(vrc)
                || (   m_fEos
-                   && !m_aBuffer.size()));
+                   && !RTCircBufUsed(m_pBuffer)));
 
         aData.resize(0);
@@ -222,6 +238,8 @@
     AssertReturn(!m_fEos, VERR_INVALID_STATE);
 
+    *pcbWritten = 0;
+
     int vrc = VINF_SUCCESS;
-    while (   m_aBuffer.size() == m_aBufferSize
+    while (   !RTCircBufFree(m_pBuffer)
            && RT_SUCCESS(vrc))
     {
@@ -234,10 +252,22 @@
     if (RT_SUCCESS(vrc))
     {
-        Assert(m_aBuffer.size() < m_aBufferSize);
-        size_t cbCopy = RT_MIN(cbWrite, m_aBufferSize - m_aBuffer.size());
-        if (m_aBuffer.capacity() < m_aBuffer.size() + cbWrite)
-            m_aBuffer.reserve(m_aBuffer.size() + cbWrite);
-        memcpy(&m_aBuffer.front() + m_aBuffer.size(), pvBuf, cbCopy);
+        const uint8_t *pbBuf = (const uint8_t *)pvBuf;
+        size_t cbCopy = RT_MIN(cbWrite, RTCircBufFree(m_pBuffer));
+
         *pcbWritten = cbCopy;
+
+        while (cbCopy)
+        {
+            void *pvDst = NULL;
+            size_t cbThisCopy = 0;
+
+            RTCircBufAcquireWriteBlock(m_pBuffer, cbCopy, &pvDst, &cbThisCopy);
+            memcpy(pvDst, pbBuf, cbThisCopy);
+            RTCircBufReleaseWriteBlock(m_pBuffer, cbThisCopy);
+
+            cbCopy -= cbThisCopy;
+            pbBuf  += cbThisCopy;
+        }
+
         RTSemEventSignal(m_hSemEvtDataAvail);
     }
