Changeset 74823 in vbox for trunk/src/VBox/Main
- Timestamp:
- Oct 12, 2018 6:42:01 PM (6 years ago)
- svn:sync-xref-src-repo-rev:
- 125776
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Main/src-server/DataStreamImpl.cpp
r74777 r74823 78 78 HRESULT hrc = S_OK; 79 79 80 m_aBufferSize = aBufferSize;81 80 m_hSemEvtDataAvail = NIL_RTSEMEVENT; 82 81 m_hSemEvtBufSpcAvail = NIL_RTSEMEVENT; 82 m_pBuffer = NULL; 83 83 int vrc = RTSemEventCreate(&m_hSemEvtDataAvail); 84 84 if (RT_SUCCESS(vrc)) 85 85 vrc = RTSemEventCreate(&m_hSemEvtBufSpcAvail); 86 if (RT_SUCCESS(vrc)) 87 vrc = RTCircBufCreate(&m_pBuffer, aBufferSize); 86 88 87 89 if (RT_FAILURE(vrc)) … … 111 113 if (!autoUninitSpan.uninitDone()) 112 114 { 113 m_aBuffer.clear();114 115 if (m_hSemEvtDataAvail != NIL_RTSEMEVENT) 115 116 RTSemEventDestroy(m_hSemEvtDataAvail); 116 117 if (m_hSemEvtBufSpcAvail != NIL_RTSEMEVENT) 117 118 RTSemEventDestroy(m_hSemEvtBufSpcAvail); 119 if (m_pBuffer != NULL) 120 RTCircBufDestroy(m_pBuffer); 118 121 m_hSemEvtDataAvail = NIL_RTSEMEVENT; 119 122 m_hSemEvtBufSpcAvail = NIL_RTSEMEVENT; … … 131 134 { 132 135 AutoReadLock alock(this COMMA_LOCKVAL_SRC_POS); 133 *aReadSize = (ULONG) m_aBuffer.size();136 *aReadSize = (ULONG)RTCircBufUsed(m_pBuffer); 134 137 return S_OK; 135 138 } … … 160 163 161 164 int vrc = VINF_SUCCESS; 162 while ( ! m_aBuffer.size()165 while ( !RTCircBufUsed(m_pBuffer) 163 166 && !m_fEos 164 167 && RT_SUCCESS(vrc)) … … 175 178 HRESULT hrc = S_OK; 176 179 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)); 180 185 if (cbCopy != aSize) 181 186 { … … 183 188 aData.resize(cbCopy); 184 189 } 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 } 187 203 vrc = RTSemEventSignal(m_hSemEvtBufSpcAvail); 188 204 AssertRC(vrc); … … 192 208 Assert( RT_FAILURE(vrc) 193 209 || ( m_fEos 194 && ! m_aBuffer.size()));210 && !RTCircBufUsed(m_pBuffer))); 195 211 196 212 aData.resize(0); … … 222 238 AssertReturn(!m_fEos, VERR_INVALID_STATE); 223 239 240 *pcbWritten = 0; 241 224 242 int vrc = VINF_SUCCESS; 225 while ( m_aBuffer.size() == m_aBufferSize243 while ( !RTCircBufFree(m_pBuffer) 226 244 && RT_SUCCESS(vrc)) 227 245 { … … 234 252 if (RT_SUCCESS(vrc)) 235 253 { 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 241 257 *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 242 272 RTSemEventSignal(m_hSemEvtDataAvail); 243 273 }
Note:
See TracChangeset
for help on using the changeset viewer.