From fe82a3d31fdf9f15257c57688c055f6877cf2281 Mon Sep 17 00:00:00 2001 From: curt Date: Fri, 20 Jul 2001 22:25:12 +0000 Subject: [PATCH] Make the tile loader more tolerant of situations where the cache is full, but no entries qualify for removal. It will keep trying to schedule the tile(s) until an entry frees up. Entries in the cache do not qualify for removal if they are in the process of being loaded. --- src/Scenery/newcache.cxx | 31 +++++++++++++++++-------------- src/Scenery/newcache.hxx | 5 +++-- src/Scenery/tilemgr.cxx | 12 ++++++++---- 3 files changed, 28 insertions(+), 20 deletions(-) diff --git a/src/Scenery/newcache.cxx b/src/Scenery/newcache.cxx index b9ffb038f..db1b7aa56 100644 --- a/src/Scenery/newcache.cxx +++ b/src/Scenery/newcache.cxx @@ -135,14 +135,14 @@ void FGNewCache::fill_in( const SGBucket& b ) { // Ensure at least one entry is free in the cache -void FGNewCache::make_space() { +bool FGNewCache::make_space() { SG_LOG( SG_TERRAIN, SG_DEBUG, "Make space in cache" ); SG_LOG( SG_TERRAIN, SG_DEBUG, "cache entries = " << tile_cache.size() ); SG_LOG( SG_TERRAIN, SG_DEBUG, "max size = " << max_cache_size ); if ( (int)tile_cache.size() < max_cache_size ) { // space in the cache, return - return; + return true; } while ( (int)tile_cache.size() >= max_cache_size ) { @@ -186,17 +186,17 @@ void FGNewCache::make_space() { } // If we made it this far, then there were no open cache entries. - // We will instead free the furthest cache entry and return it's - // index. + // We will instead free the furthest cache entry and return true if ( max_index >= 0 ) { SG_LOG( SG_TERRAIN, SG_DEBUG, " max_dist = " << max_dist ); SG_LOG( SG_TERRAIN, SG_DEBUG, " index = " << max_index ); entry_free( max_index ); + return true; } else { - SG_LOG( SG_TERRAIN, SG_ALERT, "WHOOPS!!! Dying in make_space()" - "tile cache is full, but no entries available to removal."); - exit( -1 ); + SG_LOG( SG_TERRAIN, SG_ALERT, "WHOOPS!!! can't make_space(), tile " + "cache is full, but no entries available to removal." ); + return false; } } } @@ -228,14 +228,17 @@ void FGNewCache::clear_cache() { /** * Create a new tile and schedule it for loading. */ -void -FGNewCache::insert_tile( FGTileEntry *e ) -{ +bool FGNewCache::insert_tile( FGTileEntry *e ) { // clear out a distant entry in the cache if needed. - make_space(); + if ( make_space() ) { + // register it in the cache + long tile_index = e->get_tile_bucket().gen_index(); + tile_cache[tile_index] = e; - // register it in the cache - long tile_index = e->get_tile_bucket().gen_index(); - tile_cache[tile_index] = e; + return true; + } else { + // failed to find cache space + return false; + } } diff --git a/src/Scenery/newcache.hxx b/src/Scenery/newcache.hxx index 91b43c6ba..0afbb9b39 100644 --- a/src/Scenery/newcache.hxx +++ b/src/Scenery/newcache.hxx @@ -83,7 +83,7 @@ public: bool exists( const SGBucket& b ) const; // Ensure at least one entry is free in the cache - void make_space(); + bool make_space(); // Clear all completely loaded tiles (ignores partially loaded tiles) void clear_cache(); @@ -124,8 +124,9 @@ public: /** * Create a new tile and enqueue it for loading. * @param b + * @return success/failure */ - void insert_tile( FGTileEntry* e ); + bool insert_tile( FGTileEntry* e ); }; diff --git a/src/Scenery/tilemgr.cxx b/src/Scenery/tilemgr.cxx index 5119a8307..a8a078a09 100644 --- a/src/Scenery/tilemgr.cxx +++ b/src/Scenery/tilemgr.cxx @@ -139,10 +139,14 @@ void FGTileMgr::sched_tile( const SGBucket& b ) { FGTileEntry *e = new FGTileEntry( b ); // insert the tile into the cache - tile_cache.insert_tile( e ); - - // Schedule tile for loading - loader.add( e ); + if ( tile_cache.insert_tile( e ) ) { + // Schedule tile for loading + loader.add( e ); + } else { + // insert failed (cache full with no available entries to + // delete.) Try again later + delete e; + } } } -- 2.39.5