VirtualBox

Changeset 74823 in vbox for trunk/src/VBox/Main


Ignore:
Timestamp:
Oct 12, 2018 6:42:01 PM (6 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
125776
Message:

Main: bugref:9152 Implement the convertToStream API [missing file]

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Main/src-server/DataStreamImpl.cpp

    r74777 r74823  
    7878    HRESULT hrc = S_OK;
    7979
    80     m_aBufferSize        = aBufferSize;
    8180    m_hSemEvtDataAvail   = NIL_RTSEMEVENT;
    8281    m_hSemEvtBufSpcAvail = NIL_RTSEMEVENT;
     82    m_pBuffer            = NULL;
    8383    int vrc = RTSemEventCreate(&m_hSemEvtDataAvail);
    8484    if (RT_SUCCESS(vrc))
    8585        vrc = RTSemEventCreate(&m_hSemEvtBufSpcAvail);
     86    if (RT_SUCCESS(vrc))
     87        vrc = RTCircBufCreate(&m_pBuffer, aBufferSize);
    8688
    8789    if (RT_FAILURE(vrc))
     
    111113    if (!autoUninitSpan.uninitDone())
    112114    {
    113         m_aBuffer.clear();
    114115        if (m_hSemEvtDataAvail != NIL_RTSEMEVENT)
    115116            RTSemEventDestroy(m_hSemEvtDataAvail);
    116117        if (m_hSemEvtBufSpcAvail != NIL_RTSEMEVENT)
    117118            RTSemEventDestroy(m_hSemEvtBufSpcAvail);
     119        if (m_pBuffer != NULL)
     120            RTCircBufDestroy(m_pBuffer);
    118121        m_hSemEvtDataAvail = NIL_RTSEMEVENT;
    119122        m_hSemEvtBufSpcAvail = NIL_RTSEMEVENT;
     
    131134{
    132135    AutoReadLock alock(this COMMA_LOCKVAL_SRC_POS);
    133     *aReadSize = (ULONG)m_aBuffer.size();
     136    *aReadSize = (ULONG)RTCircBufUsed(m_pBuffer);
    134137    return S_OK;
    135138}
     
    160163
    161164    int vrc = VINF_SUCCESS;
    162     while (   !m_aBuffer.size()
     165    while (   !RTCircBufUsed(m_pBuffer)
    163166           && !m_fEos
    164167           && RT_SUCCESS(vrc))
     
    175178    HRESULT hrc = S_OK;
    176179    if (   RT_SUCCESS(vrc)
    177         && m_aBuffer.size())
    178     {
    179         size_t cbCopy = RT_MIN(aSize, m_aBuffer.size());
     180        && RTCircBufUsed(m_pBuffer))
     181    {
     182
     183        size_t off = 0;
     184        size_t cbCopy = RT_MIN(aSize, RTCircBufUsed(m_pBuffer));
    180185        if (cbCopy != aSize)
    181186        {
     
    183188            aData.resize(cbCopy);
    184189        }
    185         aData.insert(aData.begin(), m_aBuffer.begin(), m_aBuffer.begin() + cbCopy);
    186         m_aBuffer.erase(m_aBuffer.begin(), m_aBuffer.begin() + cbCopy);
     190
     191        while (cbCopy)
     192        {
     193            void *pvSrc = NULL;
     194            size_t cbThisCopy = 0;
     195
     196            RTCircBufAcquireReadBlock(m_pBuffer, cbCopy, &pvSrc, &cbThisCopy);
     197            memcpy(&aData.front() + off, pvSrc, cbThisCopy);
     198            RTCircBufReleaseReadBlock(m_pBuffer, cbThisCopy);
     199
     200            cbCopy -= cbThisCopy;
     201            off    += cbThisCopy;
     202        }
    187203        vrc = RTSemEventSignal(m_hSemEvtBufSpcAvail);
    188204        AssertRC(vrc);
     
    192208        Assert(   RT_FAILURE(vrc)
    193209               || (   m_fEos
    194                    && !m_aBuffer.size()));
     210                   && !RTCircBufUsed(m_pBuffer)));
    195211
    196212        aData.resize(0);
     
    222238    AssertReturn(!m_fEos, VERR_INVALID_STATE);
    223239
     240    *pcbWritten = 0;
     241
    224242    int vrc = VINF_SUCCESS;
    225     while (   m_aBuffer.size() == m_aBufferSize
     243    while (   !RTCircBufFree(m_pBuffer)
    226244           && RT_SUCCESS(vrc))
    227245    {
     
    234252    if (RT_SUCCESS(vrc))
    235253    {
    236         Assert(m_aBuffer.size() < m_aBufferSize);
    237         size_t cbCopy = RT_MIN(cbWrite, m_aBufferSize - m_aBuffer.size());
    238         if (m_aBuffer.capacity() < m_aBuffer.size() + cbWrite)
    239             m_aBuffer.reserve(m_aBuffer.size() + cbWrite);
    240         memcpy(&m_aBuffer.front() + m_aBuffer.size(), pvBuf, cbCopy);
     254        const uint8_t *pbBuf = (const uint8_t *)pvBuf;
     255        size_t cbCopy = RT_MIN(cbWrite, RTCircBufFree(m_pBuffer));
     256
    241257        *pcbWritten = cbCopy;
     258
     259        while (cbCopy)
     260        {
     261            void *pvDst = NULL;
     262            size_t cbThisCopy = 0;
     263
     264            RTCircBufAcquireWriteBlock(m_pBuffer, cbCopy, &pvDst, &cbThisCopy);
     265            memcpy(pvDst, pbBuf, cbThisCopy);
     266            RTCircBufReleaseWriteBlock(m_pBuffer, cbThisCopy);
     267
     268            cbCopy -= cbThisCopy;
     269            pbBuf  += cbThisCopy;
     270        }
     271
    242272        RTSemEventSignal(m_hSemEvtDataAvail);
    243273    }
Note: See TracChangeset for help on using the changeset viewer.

© 2025 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette