aboutsummaryrefslogtreecommitdiff
path: root/src/unstable/cachebase.h
diff options
context:
space:
mode:
authorMike Buland <eichlan@xagasoft.com>2014-01-22 16:28:46 +0000
committerMike Buland <eichlan@xagasoft.com>2014-01-22 16:28:46 +0000
commit86e37bec7b2101555635201f83352c0e054f1849 (patch)
tree4d2a3652689ac7b615db82bdab520c2ed42dd705 /src/unstable/cachebase.h
parent44a228640c782e46baf528749b5776714749ef2d (diff)
downloadlibbu++-86e37bec7b2101555635201f83352c0e054f1849.tar.gz
libbu++-86e37bec7b2101555635201f83352c0e054f1849.tar.bz2
libbu++-86e37bec7b2101555635201f83352c0e054f1849.tar.xz
libbu++-86e37bec7b2101555635201f83352c0e054f1849.zip
Updated the cache system. It now ensures that objects are initialized with
cache information before they are deserialized from storage. This changed the signature of the cache loading template function, but the new function isn't harder to use, and provides the key information as well.
Diffstat (limited to 'src/unstable/cachebase.h')
-rw-r--r--src/unstable/cachebase.h28
1 files changed, 21 insertions, 7 deletions
diff --git a/src/unstable/cachebase.h b/src/unstable/cachebase.h
index af2884c..bb543dd 100644
--- a/src/unstable/cachebase.h
+++ b/src/unstable/cachebase.h
@@ -328,6 +328,7 @@ namespace Bu
328 328
329 typedef CacheEntry<keytype, obtype> Entry; 329 typedef CacheEntry<keytype, obtype> Entry;
330 typedef Bu::List<keytype> KeyList; 330 typedef Bu::List<keytype> KeyList;
331 typedef CacheObject<keytype, obtype> ObjectType;
331 332
332 CachePtr<keytype, obtype> insert( obtype *pObject ) 333 CachePtr<keytype, obtype> insert( obtype *pObject )
333 { 334 {
@@ -466,7 +467,10 @@ namespace Bu
466 virtual void _create( const obtype *o )=0; 467 virtual void _create( const obtype *o )=0;
467 virtual void _erase( const keytype &k )=0; 468 virtual void _erase( const keytype &k )=0;
468 469
469 virtual obtype *_load( const keytype &k )=0; 470 virtual obtype *_load(
471 typename Bu::CacheObject<keytype, obtype>::Initializer &initObj,
472 const keytype &k
473 )=0;
470 virtual void _save( const obtype *o )=0; 474 virtual void _save( const obtype *o )=0;
471 475
472 virtual void _sync()=0; 476 virtual void _sync()=0;
@@ -481,7 +485,10 @@ namespace Bu
481 hChanged.insert( pObject->getKey(), true ); 485 hChanged.insert( pObject->getKey(), true );
482 mCacheEntry.unlockWrite(); 486 mCacheEntry.unlockWrite();
483 _create( pObject ); 487 _create( pObject );
484 pObject->setCache( this, pEnt ); 488 // I'm not sold on the ordering here...or the fact we're not
489 // using th initilizer
490 pObject->setCache( this );
491 pObject->setCacheEntry( pEnt );
485 492
486 return pEnt; 493 return pEnt;
487 } 494 }
@@ -497,9 +504,12 @@ namespace Bu
497 catch(...) 504 catch(...)
498 { 505 {
499 // try to load the object from the backing store 506 // try to load the object from the backing store
500 obtype *pObject = _load( k ); 507 typename ObjectType::Initializer initObj(
508 this
509 );
510 obtype *pObject = _load( initObj, k );
501 pEnt = new Entry( pObject ); 511 pEnt = new Entry( pObject );
502 pObject->setCache( this, pEnt ); 512 pObject->setCacheEntry( pEnt );
503 Bu::ReadWriteMutex::WriteLocker wl( mCacheEntry ); 513 Bu::ReadWriteMutex::WriteLocker wl( mCacheEntry );
504 hCacheEntry.insert( k, pEnt ); 514 hCacheEntry.insert( k, pEnt );
505 } 515 }
@@ -536,11 +546,15 @@ namespace Bu
536 ar << *pObject; 546 ar << *pObject;
537 } 547 }
538 548
539 template<typename obtype> 549 template<typename keytype, typename obtype>
540 obtype *_cacheObjectLoad( Bu::Stream &s ) 550 obtype *_cacheObjectLoad(
551 typename Bu::CacheObject<keytype, obtype>::Initializer &initObject,
552 const keytype & /*rKey*/,
553 Bu::Stream &s
554 )
541 { 555 {
542 Bu::Archive ar( s, Bu::Archive::load ); 556 Bu::Archive ar( s, Bu::Archive::load );
543 obtype *ret = new obtype(); 557 obtype *ret = initObject(new obtype());
544 ar >> *ret; 558 ar >> *ret;
545 return ret; 559 return ret;
546 } 560 }