diff options
Diffstat (limited to '')
| -rw-r--r-- | src/unstable/cachebase.h | 53 |
1 files changed, 30 insertions, 23 deletions
diff --git a/src/unstable/cachebase.h b/src/unstable/cachebase.h index 1f78360..5da4ce9 100644 --- a/src/unstable/cachebase.h +++ b/src/unstable/cachebase.h | |||
| @@ -518,8 +518,10 @@ namespace Bu | |||
| 518 | 518 | ||
| 519 | void sync() | 519 | void sync() |
| 520 | { | 520 | { |
| 521 | Bu::ReadWriteMutex::WriteLocker wl( mCacheEntry ); | 521 | { |
| 522 | _sync(); | 522 | Bu::ReadWriteMutex::WriteLocker wl( mCacheEntry ); |
| 523 | _sync(); | ||
| 524 | } | ||
| 523 | syncChanges(); | 525 | syncChanges(); |
| 524 | } | 526 | } |
| 525 | 527 | ||
| @@ -601,30 +603,35 @@ namespace Bu | |||
| 601 | 603 | ||
| 602 | void syncChanges() | 604 | void syncChanges() |
| 603 | { | 605 | { |
| 604 | if( !hChanged.isEmpty() ) | 606 | Bu::List<keytype> lKeys; |
| 607 | mCacheEntry.lockWrite(); | ||
| 608 | for( typename CacheKeySet::iterator i = hChanged.begin(); i; i++ ) | ||
| 605 | { | 609 | { |
| 606 | for( typename CacheKeySet::iterator i = hChanged.begin(); i; i++ ) | 610 | lKeys.append( i.getKey() ); |
| 611 | } | ||
| 612 | hChanged.clear(); | ||
| 613 | mCacheEntry.unlockWrite(); | ||
| 614 | |||
| 615 | for( typename List<keytype>::iterator i = lKeys.begin(); i; i++ ) | ||
| 616 | { | ||
| 617 | Entry *pEnt = NULL; | ||
| 618 | try | ||
| 619 | { | ||
| 620 | pEnt = hCacheEntry.get( *i ); | ||
| 621 | } | ||
| 622 | catch( Bu::HashException ) | ||
| 623 | { | ||
| 624 | // The entry wasn't there, most likely because it | ||
| 625 | // was deleted. That's ok. | ||
| 626 | } | ||
| 627 | // This isn't inside of the above because we want to be | ||
| 628 | // able to handle these exceptions differently. | ||
| 629 | if( pEnt ) | ||
| 607 | { | 630 | { |
| 608 | Entry *pEnt = NULL; | 631 | Bu::MutexLocker ml( pEnt->getMutex() ); |
| 609 | try | 632 | _save( pEnt->getPtr() ); |
| 610 | { | 633 | pEnt->getPtr()->changed( false ); |
| 611 | pEnt = hCacheEntry.get( i.getKey() ); | ||
| 612 | } | ||
| 613 | catch( Bu::HashException ) | ||
| 614 | { | ||
| 615 | // The entry wasn't there, most likely because it | ||
| 616 | // was deleted. That's ok. | ||
| 617 | } | ||
| 618 | // This isn't inside of the above because we want to be | ||
| 619 | // able to handle these exceptions differently. | ||
| 620 | if( pEnt ) | ||
| 621 | { | ||
| 622 | Bu::MutexLocker ml( pEnt->getMutex() ); | ||
| 623 | _save( pEnt->getPtr() ); | ||
| 624 | pEnt->getPtr()->changed( false ); | ||
| 625 | } | ||
| 626 | } | 634 | } |
| 627 | hChanged.clear(); | ||
| 628 | } | 635 | } |
| 629 | } | 636 | } |
| 630 | 637 | ||
