diff options
author | Mike Buland <mike@xagasoft.com> | 2024-09-30 11:50:17 -0700 |
---|---|---|
committer | Mike Buland <mike@xagasoft.com> | 2024-09-30 11:50:17 -0700 |
commit | 0befcc026be9e4f6c40f8771c7f26f767ebddbf7 (patch) | |
tree | e549bee70f50def02d24ef386b490e017bc6043b /src/stable | |
parent | 84c93fbf0f371bcd26893d1c33e3a5bf1a61223e (diff) | |
download | libbu++-0befcc026be9e4f6c40f8771c7f26f767ebddbf7.tar.gz libbu++-0befcc026be9e4f6c40f8771c7f26f767ebddbf7.tar.bz2 libbu++-0befcc026be9e4f6c40f8771c7f26f767ebddbf7.tar.xz libbu++-0befcc026be9e4f6c40f8771c7f26f767ebddbf7.zip |
Erasing streams works, stream map building works.
Diffstat (limited to '')
-rw-r--r-- | src/stable/myriad.cpp | 66 | ||||
-rw-r--r-- | src/stable/myriad.h | 4 |
2 files changed, 49 insertions, 21 deletions
diff --git a/src/stable/myriad.cpp b/src/stable/myriad.cpp index eba1ebf..85daa0d 100644 --- a/src/stable/myriad.cpp +++ b/src/stable/myriad.cpp | |||
@@ -252,6 +252,41 @@ int32_t Bu::Myriad::getTotalUnusedBytes(int32_t iAssumeBlockSize ) const | |||
252 | return iTotal; | 252 | return iTotal; |
253 | } | 253 | } |
254 | 254 | ||
255 | Bu::BitString Bu::Myriad::buildBlockUseMap() const | ||
256 | { | ||
257 | Bu::MutexLocker l( mAccess ); | ||
258 | Bu::BitString bsMap( iBlockCount ); | ||
259 | bsMap.fill(); | ||
260 | for( IndexList::const_iterator i = lFreeBlocks.begin(); i; i++ ) | ||
261 | { | ||
262 | bsMap.setBit( *i, false ); | ||
263 | } | ||
264 | return bsMap; | ||
265 | } | ||
266 | |||
267 | Bu::Array<int32_t> Bu::Myriad::buildBlockMap() const | ||
268 | { | ||
269 | Bu::MutexLocker l( mAccess ); | ||
270 | Bu::Array<int32_t> bm( iBlockCount ); | ||
271 | for( int j = 0; j < iBlockCount; j++ ) | ||
272 | { | ||
273 | bm.append( -1 ); | ||
274 | } | ||
275 | Bu::MutexLocker l2( mhStream ); | ||
276 | for( StreamHash::const_iterator iStream = hStream.begin(); | ||
277 | iStream; iStream++ ) | ||
278 | { | ||
279 | int32_t iId = iStream.getKey(); | ||
280 | Stream *pStream = iStream.getValue(); | ||
281 | for( Bu::Array<int32_t>::const_iterator iBlock = | ||
282 | pStream->aBlocks.begin(); iBlock; iBlock++ ) | ||
283 | { | ||
284 | bm[*iBlock] = iId; | ||
285 | } | ||
286 | } | ||
287 | return bm; | ||
288 | } | ||
289 | |||
255 | void Bu::Myriad::sync() | 290 | void Bu::Myriad::sync() |
256 | { | 291 | { |
257 | writeHeader(); | 292 | writeHeader(); |
@@ -259,7 +294,7 @@ void Bu::Myriad::sync() | |||
259 | 294 | ||
260 | bool Bu::Myriad::loadMyriad() | 295 | bool Bu::Myriad::loadMyriad() |
261 | { | 296 | { |
262 | Bu::println("Load myriad!"); | 297 | //Bu::println("Load myriad!"); |
263 | char sMagicCode[4]; | 298 | char sMagicCode[4]; |
264 | rBacking.setPos( 0 ); | 299 | rBacking.setPos( 0 ); |
265 | MyriadRead( sMagicCode, 4 ); | 300 | MyriadRead( sMagicCode, 4 ); |
@@ -362,7 +397,7 @@ bool Bu::Myriad::loadMyriad() | |||
362 | } | 397 | } |
363 | 398 | ||
364 | lFreeBlocks = hUnusedBlocks.getKeys(); | 399 | lFreeBlocks = hUnusedBlocks.getKeys(); |
365 | Bu::println("Free blocks: %1").arg( lFreeBlocks.getSize() ); | 400 | //Bu::println("Free blocks: %1").arg( lFreeBlocks.getSize() ); |
366 | 401 | ||
367 | return true; | 402 | return true; |
368 | } | 403 | } |
@@ -389,22 +424,14 @@ void Bu::Myriad::createMyriad( int32_t iBlockSize, int32_t iPreallocateBlocks ) | |||
389 | // plus one block index. | 424 | // plus one block index. |
390 | int iHeaderStreamBlocks = blkDiv(iHeaderStreamBytes+4, iBlockSize ); | 425 | int iHeaderStreamBlocks = blkDiv(iHeaderStreamBytes+4, iBlockSize ); |
391 | 426 | ||
392 | Bu::println("Initial estimate: %1 bytes / %2 cur blocks, %3 computed blocks (%4 target bytes).") | 427 | //Bu::println("Initial estimate: %1 bytes / %2 cur blocks, %3 computed blocks (%4 target bytes).").arg( iHeaderStreamBytes+(iHeaderStreamBlocks*4) ).arg( iHeaderStreamBlocks ).arg( blkDiv((iHeaderStreamBytes+(iHeaderStreamBlocks*4)), iBlockSize) ).arg( iHeaderStreamBlocks*iBlockSize ); |
393 | .arg( iHeaderStreamBytes+(iHeaderStreamBlocks*4) ) | ||
394 | .arg( iHeaderStreamBlocks ) | ||
395 | .arg( blkDiv((iHeaderStreamBytes+(iHeaderStreamBlocks*4)), iBlockSize) ) | ||
396 | .arg( iHeaderStreamBlocks*iBlockSize ); | ||
397 | while( iHeaderStreamBytes+(iHeaderStreamBlocks*4) | 428 | while( iHeaderStreamBytes+(iHeaderStreamBlocks*4) |
398 | > iHeaderStreamBlocks*iBlockSize ) | 429 | > iHeaderStreamBlocks*iBlockSize ) |
399 | { | 430 | { |
400 | iHeaderStreamBlocks = blkDiv((iHeaderStreamBytes+((iHeaderStreamBlocks+1)*4)), iBlockSize); | 431 | iHeaderStreamBlocks = blkDiv((iHeaderStreamBytes+((iHeaderStreamBlocks+1)*4)), iBlockSize); |
401 | if( iHeaderStreamBlocks > 100 ) | 432 | if( iHeaderStreamBlocks > 100 ) |
402 | break; | 433 | break; |
403 | Bu::println(" Adjustment: %1 bytes / %2 cur blocks, %3 computed blocks (%4 target bytes).") | 434 | //Bu::println(" Adjustment: %1 bytes / %2 cur blocks, %3 computed blocks (%4 target bytes).").arg( iHeaderStreamBytes+(iHeaderStreamBlocks*4) ).arg( iHeaderStreamBlocks ).arg( blkDiv((iHeaderStreamBytes+(iHeaderStreamBlocks*4)), iBlockSize) ).arg( iHeaderStreamBlocks*iBlockSize ); |
404 | .arg( iHeaderStreamBytes+(iHeaderStreamBlocks*4) ) | ||
405 | .arg( iHeaderStreamBlocks ) | ||
406 | .arg( blkDiv((iHeaderStreamBytes+(iHeaderStreamBlocks*4)), iBlockSize) ) | ||
407 | .arg( iHeaderStreamBlocks*iBlockSize ); | ||
408 | } | 435 | } |
409 | 436 | ||
410 | if( iPreallocateBlocks > iHeaderStreamBlocks ) | 437 | if( iPreallocateBlocks > iHeaderStreamBlocks ) |
@@ -459,7 +486,7 @@ void Bu::Myriad::writeHeader() | |||
459 | Bu::MutexLocker l( mAccess ); | 486 | Bu::MutexLocker l( mAccess ); |
460 | if( !rBacking.isWritable() ) | 487 | if( !rBacking.isWritable() ) |
461 | return; | 488 | return; |
462 | Bu::println("Writing stream breakdown:"); | 489 | //Bu::println("Writing stream breakdown:"); |
463 | Bu::MemBuf mbHeader; | 490 | Bu::MemBuf mbHeader; |
464 | { | 491 | { |
465 | Bu::MutexLocker l2( mhStream ); | 492 | Bu::MutexLocker l2( mhStream ); |
@@ -488,7 +515,7 @@ void Bu::Myriad::writeHeader() | |||
488 | psHeader->iSize = iHdrStreamSize; | 515 | psHeader->iSize = iHdrStreamSize; |
489 | } | 516 | } |
490 | 517 | ||
491 | Bu::println("Computed header size: %1 bytes. Ver=%2, Bpi=%3, BlockSize=%4").arg( iHdrStreamSize ).arg( 1 ).arg( 32 ).arg( iBlockSize ); | 518 | //Bu::println("Computed header size: %1 bytes. Ver=%2, Bpi=%3, BlockSize=%4").arg( iHdrStreamSize ).arg( 1 ).arg( 32 ).arg( iBlockSize ); |
492 | 519 | ||
493 | uint8_t uVer = 1; | 520 | uint8_t uVer = 1; |
494 | uint8_t uBpi = 32; | 521 | uint8_t uBpi = 32; |
@@ -515,10 +542,7 @@ void Bu::Myriad::writeHeader() | |||
515 | mbHeader.write( &uStreamSize, 4 ); | 542 | mbHeader.write( &uStreamSize, 4 ); |
516 | Bu::Array<int32_t> aBlocks = pStream->getBlockList(); | 543 | Bu::Array<int32_t> aBlocks = pStream->getBlockList(); |
517 | 544 | ||
518 | Bu::println(" Stream %1 is %2 bytes %3 blocks (%4 blocks computed)") | 545 | //Bu::println(" Stream %1 is %2 bytes %3 blocks (%4 blocks computed)").arg( *i ).arg( uStreamSize ).arg( aBlocks.getSize() ).arg( Bu::blkDiv( (int)uStreamSize, (int)iBlockSize ) ); |
519 | .arg( *i ).arg( uStreamSize ) | ||
520 | .arg( aBlocks.getSize() ) | ||
521 | .arg( Bu::blkDiv( (int)uStreamSize, (int)iBlockSize ) ); | ||
522 | 546 | ||
523 | for( Bu::Array<int32_t>::iterator i = aBlocks.begin(); i; i++ ) | 547 | for( Bu::Array<int32_t>::iterator i = aBlocks.begin(); i; i++ ) |
524 | { | 548 | { |
@@ -556,15 +580,15 @@ int32_t Bu::Myriad::__calcHeaderSize() | |||
556 | } | 580 | } |
557 | } | 581 | } |
558 | 582 | ||
559 | Bu::println("HeaderCalc:"); | 583 | //Bu::println("HeaderCalc:"); |
560 | Bu::println(" Base (no header stream): %1").arg( iHdrSize ); | 584 | //Bu::println(" Base (no header stream): %1").arg( iHdrSize ); |
561 | int32_t iNewSize = iHdrSize; | 585 | int32_t iNewSize = iHdrSize; |
562 | int32_t iOldSize; | 586 | int32_t iOldSize; |
563 | 587 | ||
564 | do { | 588 | do { |
565 | iOldSize = iNewSize; | 589 | iOldSize = iNewSize; |
566 | iNewSize = iHdrSize + Bu::blkDiv(iNewSize, iBlockSize)*4; | 590 | iNewSize = iHdrSize + Bu::blkDiv(iNewSize, iBlockSize)*4; |
567 | Bu::println(" Recomp: %1").arg( iNewSize ); | 591 | //Bu::println(" Recomp: %1").arg( iNewSize ); |
568 | } while( iOldSize != iNewSize ); | 592 | } while( iOldSize != iNewSize ); |
569 | 593 | ||
570 | return iNewSize; | 594 | return iNewSize; |
diff --git a/src/stable/myriad.h b/src/stable/myriad.h index 60c5a39..7f84c2a 100644 --- a/src/stable/myriad.h +++ b/src/stable/myriad.h | |||
@@ -7,6 +7,8 @@ | |||
7 | #include "bu/array.h" | 7 | #include "bu/array.h" |
8 | #include "bu/hash.h" | 8 | #include "bu/hash.h" |
9 | 9 | ||
10 | #include "bu/bitstring.h" | ||
11 | |||
10 | namespace Bu | 12 | namespace Bu |
11 | { | 13 | { |
12 | class MyriadStream; | 14 | class MyriadStream; |
@@ -87,6 +89,8 @@ namespace Bu | |||
87 | int32_t getTotalStreams() const; | 89 | int32_t getTotalStreams() const; |
88 | int32_t getTotalUsedBytes() const; | 90 | int32_t getTotalUsedBytes() const; |
89 | int32_t getTotalUnusedBytes( int32_t iAssumeBlockSize=-1 ) const; | 91 | int32_t getTotalUnusedBytes( int32_t iAssumeBlockSize=-1 ) const; |
92 | Bu::BitString buildBlockUseMap() const; | ||
93 | Bu::Array<int32_t> buildBlockMap() const; | ||
90 | 94 | ||
91 | /** | 95 | /** |
92 | * Flush all caches to the backing stream, write all structural and | 96 | * Flush all caches to the backing stream, write all structural and |