diff options
author | Mike Buland <mike@xagasoft.com> | 2024-08-05 12:44:59 -0700 |
---|---|---|
committer | Mike Buland <mike@xagasoft.com> | 2024-08-05 12:44:59 -0700 |
commit | caee572ff94822ca2ed354fcb79ca04ed9adf388 (patch) | |
tree | 4d5253c310e99a09852863024250a22d810ead7b /src/stable/myriadstream.cpp | |
parent | 5f183d4a0e7caa529db09f32848314360cecfd91 (diff) | |
download | libbu++-caee572ff94822ca2ed354fcb79ca04ed9adf388.tar.gz libbu++-caee572ff94822ca2ed354fcb79ca04ed9adf388.tar.bz2 libbu++-caee572ff94822ca2ed354fcb79ca04ed9adf388.tar.xz libbu++-caee572ff94822ca2ed354fcb79ca04ed9adf388.zip |
Perhaps fixed a Myriad race condition.0.0.1
If so, this will fix the issue where streams randomly truncate when
accessed by multiple threads.
Diffstat (limited to 'src/stable/myriadstream.cpp')
-rw-r--r-- | src/stable/myriadstream.cpp | 25 |
1 files changed, 13 insertions, 12 deletions
diff --git a/src/stable/myriadstream.cpp b/src/stable/myriadstream.cpp index 50c6924..3c78bb0 100644 --- a/src/stable/myriadstream.cpp +++ b/src/stable/myriadstream.cpp | |||
@@ -19,7 +19,8 @@ using Bu::Fmt; | |||
19 | #endif | 19 | #endif |
20 | #include "bu/sio.h" | 20 | #include "bu/sio.h" |
21 | 21 | ||
22 | #define TRACE( x ) Bu::println("%1:%2: %3: %4 - %5").arg(__FILE__).arg( __LINE__ ).arg(__PRETTY_FUNCTION__).arg(rMyriad.sStore.getLocation()).arg(x) | 22 | // #define TRACE( x ) Bu::println("%1:%2: %3: %4 - %5").arg(__FILE__).arg( __LINE__ ).arg(__PRETTY_FUNCTION__).arg(rMyriad.sStore.getLocation()).arg(x) |
23 | #define TRACE( x ) (void)0 | ||
23 | 24 | ||
24 | Bu::MyriadStream::MyriadStream( Bu::Myriad &rMyriad, | 25 | Bu::MyriadStream::MyriadStream( Bu::Myriad &rMyriad, |
25 | Bu::Myriad::Stream *pStream ) : | 26 | Bu::Myriad::Stream *pStream ) : |
@@ -55,8 +56,8 @@ Bu::size Bu::MyriadStream::read( void *pBuf, Bu::size nBytes ) | |||
55 | sio << "MyriadStream: read: " << __LINE__ << ": Started, asked to read " << nBytes << "b." | 56 | sio << "MyriadStream: read: " << __LINE__ << ": Started, asked to read " << nBytes << "b." |
56 | << sio.nl; | 57 | << sio.nl; |
57 | #endif | 58 | #endif |
58 | if( nBytes > (Bu::size)pStream->iSize-iPos ) | 59 | if( nBytes > (Bu::size)pStream->getSize()-iPos ) |
59 | nBytes = pStream->iSize-iPos; | 60 | nBytes = pStream->getSize()-iPos; |
60 | if( nBytes <= 0 ) | 61 | if( nBytes <= 0 ) |
61 | return 0; | 62 | return 0; |
62 | int iLeft = nBytes; | 63 | int iLeft = nBytes; |
@@ -92,7 +93,7 @@ Bu::size Bu::MyriadStream::read( void *pBuf, Bu::size nBytes ) | |||
92 | rMyriad.iBlockSize - iPos%rMyriad.iBlockSize, | 93 | rMyriad.iBlockSize - iPos%rMyriad.iBlockSize, |
93 | iLeft | 94 | iLeft |
94 | ), | 95 | ), |
95 | pStream->iSize-iPos | 96 | pStream->getSize()-iPos |
96 | ); | 97 | ); |
97 | #ifdef MYRIAD_STREAM_DEBUG | 98 | #ifdef MYRIAD_STREAM_DEBUG |
98 | sio << "MyriadStream: read: " << __LINE__ << ": Copying out bytes: " | 99 | sio << "MyriadStream: read: " << __LINE__ << ": Copying out bytes: " |
@@ -166,14 +167,14 @@ Bu::size Bu::MyriadStream::write( const void *pBuf, Bu::size nBytes ) | |||
166 | // There are two main writing modes when it comes down to it. | 167 | // There are two main writing modes when it comes down to it. |
167 | // Overwrite mode and append mode. Append is what pretty much always | 168 | // Overwrite mode and append mode. Append is what pretty much always |
168 | // happens when creating a new stream. | 169 | // happens when creating a new stream. |
169 | if( iPos < pStream->iSize ) | 170 | if( iPos < pStream->getSize() ) |
170 | { | 171 | { |
171 | int iAmnt = Bu::buMin( | 172 | int iAmnt = Bu::buMin( |
172 | Bu::buMin( | 173 | Bu::buMin( |
173 | rMyriad.iBlockSize - iPos%rMyriad.iBlockSize, | 174 | rMyriad.iBlockSize - iPos%rMyriad.iBlockSize, |
174 | iLeft | 175 | iLeft |
175 | ), | 176 | ), |
176 | pStream->iSize-iPos | 177 | pStream->getSize()-iPos |
177 | ); | 178 | ); |
178 | #ifdef MYRIAD_STREAM_DEBUG | 179 | #ifdef MYRIAD_STREAM_DEBUG |
179 | sio << "MyriadStream: write (ovr): " << __LINE__ << ": Copying in bytes: " | 180 | sio << "MyriadStream: write (ovr): " << __LINE__ << ": Copying in bytes: " |
@@ -208,9 +209,9 @@ Bu::size Bu::MyriadStream::write( const void *pBuf, Bu::size nBytes ) | |||
208 | iAmnt | 209 | iAmnt |
209 | ); | 210 | ); |
210 | iPos += iAmnt; | 211 | iPos += iAmnt; |
211 | TRACE(Bu::String("Stream=%1 - pStream->iSize(%2) += iAmnt(%3)").arg(pStream->iId).arg( pStream->iSize ).arg(iAmnt).end()); | 212 | TRACE(Bu::String("Stream=%1 - pStream->iSize(%2) += iAmnt(%3)").arg(pStream->iId).arg( pStream->getSize() ).arg(iAmnt).end()); |
212 | pStream->iSize += iAmnt; | 213 | pStream->growTo( pStream->getSize()+iAmnt ); |
213 | TRACE(Bu::String("Stream=%1 - pStream->iSize = %2").arg(pStream->iId).arg( pStream->iSize ).end()); | 214 | TRACE(Bu::String("Stream=%1 - pStream->iSize = %2").arg(pStream->iId).arg( pStream->getSize() ).end()); |
214 | rMyriad.headerChanged(); | 215 | rMyriad.headerChanged(); |
215 | pBuf = &((char *)pBuf)[iAmnt]; | 216 | pBuf = &((char *)pBuf)[iAmnt]; |
216 | iLeft -= iAmnt; | 217 | iLeft -= iAmnt; |
@@ -237,12 +238,12 @@ void Bu::MyriadStream::setPos( Bu::size pos ) | |||
237 | 238 | ||
238 | void Bu::MyriadStream::setPosEnd( Bu::size pos ) | 239 | void Bu::MyriadStream::setPosEnd( Bu::size pos ) |
239 | { | 240 | { |
240 | iPos = pStream->iSize-pos; | 241 | iPos = pStream->getSize()-pos; |
241 | } | 242 | } |
242 | 243 | ||
243 | bool Bu::MyriadStream::isEos() | 244 | bool Bu::MyriadStream::isEos() |
244 | { | 245 | { |
245 | return iPos >= pStream->iSize; | 246 | return iPos >= pStream->getSize(); |
246 | } | 247 | } |
247 | 248 | ||
248 | bool Bu::MyriadStream::isOpen() | 249 | bool Bu::MyriadStream::isOpen() |
@@ -299,7 +300,7 @@ void Bu::MyriadStream::setSize( Bu::size iSize ) | |||
299 | 300 | ||
300 | Bu::size Bu::MyriadStream::getSize() const | 301 | Bu::size Bu::MyriadStream::getSize() const |
301 | { | 302 | { |
302 | return pStream->iSize; | 303 | return pStream->getSize(); |
303 | } | 304 | } |
304 | 305 | ||
305 | Bu::size Bu::MyriadStream::getBlockSize() const | 306 | Bu::size Bu::MyriadStream::getBlockSize() const |