]> git.mxchange.org Git - flightgear.git/commitdiff
Make the tile loader more tolerant of situations where the cache is full,
authorcurt <curt>
Fri, 20 Jul 2001 22:25:12 +0000 (22:25 +0000)
committercurt <curt>
Fri, 20 Jul 2001 22:25:12 +0000 (22:25 +0000)
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
src/Scenery/newcache.hxx
src/Scenery/tilemgr.cxx

index b9ffb038fda1d3fadd32f21324b3285e0b1f0809..db1b7aa56b9b436e2b3ce7deb3511d8d1b1aca11 100644 (file)
@@ -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;
+    }
 }
index 91b43c6baa0d47e185c035b227ab56f7df196362..0afbb9b39ea79d8c907e53c0d24694f3ceb7a3d7 100644 (file)
@@ -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 );
 };
 
 
index 5119a830779a1c62dcebefd59f21c2760123bf75..a8a078a09c579b81743785d2d6e92b01b98d429f 100644 (file)
@@ -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;
+       }
     }
 }