diff options
author | Mike Buland <eichlan@xagasoft.com> | 2010-04-19 15:16:53 +0000 |
---|---|---|
committer | Mike Buland <eichlan@xagasoft.com> | 2010-04-19 15:16:53 +0000 |
commit | 668737effd601778fba74edec14d22dd5b87457a (patch) | |
tree | 9ca6b88518cea29244dc92a219c20060cff8d593 /src/myriad.cpp | |
parent | fc2943ed980306244749d8d13796eaff690917b6 (diff) | |
download | libbu++-668737effd601778fba74edec14d22dd5b87457a.tar.gz libbu++-668737effd601778fba74edec14d22dd5b87457a.tar.bz2 libbu++-668737effd601778fba74edec14d22dd5b87457a.tar.xz libbu++-668737effd601778fba74edec14d22dd5b87457a.zip |
CacheStoreMyriad is written, it's pretty much a copy of CacheStoreNids since
Nids and Myriad pretty much share an API. However, there seems to be a bug in
Myriad when a Myriad file is created and filled with data immediately, the
header stream is mis-linking one of the blocks again.
Diffstat (limited to 'src/myriad.cpp')
-rw-r--r-- | src/myriad.cpp | 69 |
1 files changed, 49 insertions, 20 deletions
diff --git a/src/myriad.cpp b/src/myriad.cpp index 58270c5..77b481d 100644 --- a/src/myriad.cpp +++ b/src/myriad.cpp | |||
@@ -34,7 +34,12 @@ Bu::Myriad::Myriad( Bu::Stream &sStore ) : | |||
34 | 34 | ||
35 | Bu::Myriad::~Myriad() | 35 | Bu::Myriad::~Myriad() |
36 | { | 36 | { |
37 | updateHeader(); | 37 | if( !hActiveBlocks.isEmpty() ) |
38 | { | ||
39 | sio << "Bu::Myriad::~Myriad(): Error: There are " | ||
40 | << hActiveBlocks.getSize() << " unsynced blocks!" << sio.nl; | ||
41 | } | ||
42 | sync(); | ||
38 | 43 | ||
39 | for( StreamArray::iterator i = aStreams.begin(); i; i++ ) | 44 | for( StreamArray::iterator i = aStreams.begin(); i; i++ ) |
40 | { | 45 | { |
@@ -46,7 +51,13 @@ void Bu::Myriad::sync() | |||
46 | { | 51 | { |
47 | updateHeader(); | 52 | updateHeader(); |
48 | 53 | ||
49 | // Later, also flush all caches. | 54 | for( BlockHash::iterator i = hActiveBlocks.begin(); i; i++ ) |
55 | { | ||
56 | if( (*i)->bChanged ) | ||
57 | { | ||
58 | syncBlock( *i ); | ||
59 | } | ||
60 | } | ||
50 | } | 61 | } |
51 | 62 | ||
52 | void Bu::Myriad::initialize() | 63 | void Bu::Myriad::initialize() |
@@ -206,16 +217,19 @@ void Bu::Myriad::initialize( int iBlockSize, int iPreAllocate ) | |||
206 | this->iBlocks = iPreAllocate; | 217 | this->iBlocks = iPreAllocate; |
207 | 218 | ||
208 | pStr->iSize = sStore.tell(); | 219 | pStr->iSize = sStore.tell(); |
209 | sio << "Myriad: Actual end of header stream = " << pStr->iSize << sio.nl; | 220 | // sio << "Myriad: Actual end of header stream = " << pStr->iSize << sio.nl; |
210 | 221 | ||
211 | pStr->iSize = iHeaderSize; | 222 | pStr->iSize = iHeaderSize; |
212 | for( int j = 0; j < iHeaderBlocks; j++ ) | 223 | for( int j = 0; j < iHeaderBlocks; j++ ) |
213 | { | 224 | { |
214 | pStr->aBlocks.append( j ); | 225 | pStr->aBlocks.append( j ); |
226 | bsBlockUsed.setBit( j ); | ||
215 | } | 227 | } |
216 | 228 | ||
217 | aStreams.append( pStr ); | 229 | aStreams.append( pStr ); |
218 | 230 | ||
231 | sio << bsBlockUsed.toString() << sio.nl; | ||
232 | |||
219 | //hStreams.insert( 0, BlockArray( 0 ) ); | 233 | //hStreams.insert( 0, BlockArray( 0 ) ); |
220 | } | 234 | } |
221 | 235 | ||
@@ -227,31 +241,36 @@ void Bu::Myriad::updateHeader() | |||
227 | char cBuf; | 241 | char cBuf; |
228 | int iBuf; | 242 | int iBuf; |
229 | 243 | ||
244 | for( StreamArray::iterator i = aStreams.begin(); i; i++ ) | ||
245 | { | ||
246 | sio << "Myriad: Stream " << Fmt(4) << (*i)->iId << ": " << (*i)->aBlocks << sio.nl; | ||
247 | } | ||
248 | |||
230 | // Compute the new size of the header. | 249 | // Compute the new size of the header. |
231 | int iHeaderSize = 14 + 8*aStreams.getSize(); | 250 | int iHeaderSize = 14 + 8*aStreams.getSize(); |
232 | sio << "Myriad: updateHeader: aStreams.getSize() = " << aStreams.getSize() | 251 | // sio << "Myriad: updateHeader: aStreams.getSize() = " << aStreams.getSize() |
233 | << sio.nl; | 252 | // << sio.nl; |
234 | for( StreamArray::iterator i = aStreams.begin(); i; i++ ) | 253 | for( StreamArray::iterator i = aStreams.begin(); i; i++ ) |
235 | { | 254 | { |
236 | iHeaderSize += 4*(*i)->aBlocks.getSize(); | 255 | iHeaderSize += 4*(*i)->aBlocks.getSize(); |
237 | sio << "Myriad: updateHeader: (*i)->aBlocks.getSize() = " | 256 | // sio << "Myriad: updateHeader: (*i)->aBlocks.getSize() = " |
238 | << (*i)->aBlocks.getSize() << sio.nl; | 257 | // << (*i)->aBlocks.getSize() << sio.nl; |
239 | } | 258 | } |
240 | int iNewBlocks = blkDiv( iHeaderSize, iBlockSize ); | 259 | int iNewBlocks = blkDiv( iHeaderSize, iBlockSize ); |
241 | while( iNewBlocks > aStreams[0]->aBlocks.getSize() ) | 260 | while( iNewBlocks > aStreams[0]->aBlocks.getSize() ) |
242 | { | 261 | { |
243 | int iBlock = findEmptyBlock(); | 262 | int iBlock = findEmptyBlock(); |
244 | sio << "Myriad: updateHeader: Appending block " << iBlock | 263 | // sio << "Myriad: updateHeader: Appending block " << iBlock |
245 | << " to header." << sio.nl; | 264 | // << " to header." << sio.nl; |
246 | aStreams[0]->aBlocks.append( iBlock ); | 265 | aStreams[0]->aBlocks.append( iBlock ); |
247 | bsBlockUsed.setBit( iBlock ); | 266 | bsBlockUsed.setBit( iBlock ); |
248 | iHeaderSize += 4; | 267 | iHeaderSize += 4; |
249 | iNewBlocks = blkDiv( iHeaderSize, iBlockSize ); | 268 | iNewBlocks = blkDiv( iHeaderSize, iBlockSize ); |
250 | } | 269 | } |
251 | aStreams[0]->iSize = iHeaderSize; | 270 | aStreams[0]->iSize = iHeaderSize; |
252 | sio << "Myriad: updateHeader: iHeaderSize=" << iHeaderSize | 271 | // sio << "Myriad: updateHeader: iHeaderSize=" << iHeaderSize |
253 | << ", iNewBlocks=" << iNewBlocks << ", curBlocks=" | 272 | // << ", iNewBlocks=" << iNewBlocks << ", curBlocks=" |
254 | << aStreams[0]->aBlocks.getSize() << sio.nl; | 273 | // << aStreams[0]->aBlocks.getSize() << sio.nl; |
255 | 274 | ||
256 | MyriadStream sHdr( *this, aStreams[0] ); | 275 | MyriadStream sHdr( *this, aStreams[0] ); |
257 | sHdr.write( Myriad_MAGIC_CODE, 4 ); | 276 | sHdr.write( Myriad_MAGIC_CODE, 4 ); |
@@ -296,7 +315,7 @@ int Bu::Myriad::createStream( int iPreAllocate ) | |||
296 | for( int j = 0; j < iPreAllocate; j++ ) | 315 | for( int j = 0; j < iPreAllocate; j++ ) |
297 | { | 316 | { |
298 | int iFreeBlock = findEmptyBlock(); | 317 | int iFreeBlock = findEmptyBlock(); |
299 | sio << "Myriad: Adding block " << iFreeBlock << sio.nl; | 318 | // sio << "Myriad: Adding block " << iFreeBlock << sio.nl; |
300 | pStr->aBlocks.append( iFreeBlock ); | 319 | pStr->aBlocks.append( iFreeBlock ); |
301 | bsBlockUsed.setBit( iFreeBlock ); | 320 | bsBlockUsed.setBit( iFreeBlock ); |
302 | } | 321 | } |
@@ -311,7 +330,7 @@ int Bu::Myriad::findEmptyBlock() | |||
311 | if( bsBlockUsed.getBit( j ) == false ) | 330 | if( bsBlockUsed.getBit( j ) == false ) |
312 | return j; | 331 | return j; |
313 | } | 332 | } |
314 | sio << "Myriad: findEmptyBlock(): No empty blocks, adding new one." << sio.nl; | 333 | // sio << "Myriad: findEmptyBlock(): No empty blocks, adding new one." << sio.nl; |
315 | 334 | ||
316 | bsBlockUsed.setSize( bsBlockUsed.getSize()+1, false ); | 335 | bsBlockUsed.setSize( bsBlockUsed.getSize()+1, false ); |
317 | sStore.setPos( iBlockSize*iBlocks ); | 336 | sStore.setPos( iBlockSize*iBlocks ); |
@@ -330,6 +349,7 @@ void Bu::Myriad::deleteStream( int /*iID*/ ) | |||
330 | 349 | ||
331 | Bu::MyriadStream Bu::Myriad::openStream( int iId ) | 350 | Bu::MyriadStream Bu::Myriad::openStream( int iId ) |
332 | { | 351 | { |
352 | sio << "Myriad: Request to open stream: " << iId << sio.nl; | ||
333 | return MyriadStream( *this, findStream( iId ) ); | 353 | return MyriadStream( *this, findStream( iId ) ); |
334 | } | 354 | } |
335 | 355 | ||
@@ -361,8 +381,8 @@ Bu::Myriad::Stream *Bu::Myriad::findStream( int iId ) | |||
361 | 381 | ||
362 | Bu::Myriad::Block *Bu::Myriad::getBlock( int iBlock ) | 382 | Bu::Myriad::Block *Bu::Myriad::getBlock( int iBlock ) |
363 | { | 383 | { |
364 | sio << "Myriad: Reading block " << iBlock << ", bytes " | 384 | // sio << "Myriad: Reading block " << iBlock << ", bytes " |
365 | << iBlockSize*iBlock << "-" << iBlockSize*(iBlock+1) << sio.nl; | 385 | // << iBlockSize*iBlock << "-" << iBlockSize*(iBlock+1) << sio.nl; |
366 | Block *pBlock = new Block; | 386 | Block *pBlock = new Block; |
367 | pBlock->pData = new char[iBlockSize]; | 387 | pBlock->pData = new char[iBlockSize]; |
368 | sStore.setPos( iBlockSize * iBlock ); | 388 | sStore.setPos( iBlockSize * iBlock ); |
@@ -370,6 +390,8 @@ Bu::Myriad::Block *Bu::Myriad::getBlock( int iBlock ) | |||
370 | pBlock->bChanged = false; | 390 | pBlock->bChanged = false; |
371 | pBlock->iBlockIndex = iBlock; | 391 | pBlock->iBlockIndex = iBlock; |
372 | 392 | ||
393 | hActiveBlocks.insert( iBlock, pBlock ); | ||
394 | |||
373 | return pBlock; | 395 | return pBlock; |
374 | } | 396 | } |
375 | 397 | ||
@@ -377,14 +399,21 @@ void Bu::Myriad::releaseBlock( Bu::Myriad::Block *pBlock ) | |||
377 | { | 399 | { |
378 | if( pBlock == NULL ) | 400 | if( pBlock == NULL ) |
379 | return; | 401 | return; |
380 | sio << "Myriad: Releasing block " << pBlock->iBlockIndex << sio.nl; | 402 | // sio << "Myriad: Releasing block " << pBlock->iBlockIndex << sio.nl; |
403 | syncBlock( pBlock ); | ||
404 | hActiveBlocks.erase( pBlock->iBlockIndex ); | ||
405 | delete[] pBlock->pData; | ||
406 | delete pBlock; | ||
407 | } | ||
408 | |||
409 | void Bu::Myriad::syncBlock( Block *pBlock ) | ||
410 | { | ||
381 | if( pBlock->bChanged ) | 411 | if( pBlock->bChanged ) |
382 | { | 412 | { |
383 | sio << "Myriad: - Block changed, writing back to stream." << sio.nl; | 413 | // sio << "Myriad: - Block changed, writing back to stream." << sio.nl; |
384 | sStore.setPos( iBlockSize * pBlock->iBlockIndex ); | 414 | sStore.setPos( iBlockSize * pBlock->iBlockIndex ); |
385 | sStore.write( pBlock->pData, iBlockSize ); | 415 | sStore.write( pBlock->pData, iBlockSize ); |
416 | pBlock->bChanged = false; | ||
386 | } | 417 | } |
387 | delete[] pBlock->pData; | ||
388 | delete pBlock; | ||
389 | } | 418 | } |
390 | 419 | ||