X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=src%2FScenery%2FFGTileLoader.cxx;h=3bbe26521f994e9a27932f5885287540ff890c84;hb=56592f3869c41e4f189e9ab44abb1a0898c90f4b;hp=3465e0f2bf110daa9e0040ae705d36bc73a5bf7b;hpb=a29cb28e9386a7fcfcbcbde47d6d5553476d58d9;p=flightgear.git diff --git a/src/Scenery/FGTileLoader.cxx b/src/Scenery/FGTileLoader.cxx index 3465e0f2b..3bbe26521 100644 --- a/src/Scenery/FGTileLoader.cxx +++ b/src/Scenery/FGTileLoader.cxx @@ -24,9 +24,15 @@ # include #endif +#include + #include
#include "FGTileLoader.hxx" #include "tileentry.hxx" +#include "tilemgr.hxx" + +extern ssgBranch *terrain; +extern ssgBranch *ground; /** * @@ -50,7 +56,7 @@ FGTileLoader::~FGTileLoader() { #ifdef ENABLE_THREADS // Wake up its time to die. - queue_cond.broadcast(); + // queue_cond.broadcast(); for (int i = 0; i < MAX_THREADS; ++i) { @@ -60,6 +66,19 @@ FGTileLoader::~FGTileLoader() #endif // ENABLE_THREADS } + +#if 0 // we don't ever want to do this I don't think +/** + * + */ +void FGTileLoader::reinit() { + while ( !tile_load_queue.empty() ) { + tile_load_queue.pop(); + } +} +#endif + + /** * */ @@ -73,7 +92,7 @@ FGTileLoader::add( FGTileEntry* tile ) static bool beenhere = false; if (!beenhere) { - if ( globals->get_fg_scenery() != (string)"" ) { + if ( !globals->get_fg_scenery().empty() ) { tile_path.set( globals->get_fg_scenery() ); } else { tile_path.set( globals->get_fg_root() ); @@ -82,28 +101,58 @@ FGTileLoader::add( FGTileEntry* tile ) beenhere = true; } -#ifdef ENABLE_THREADS - mutex.lock(); - tile_queue.push( tile ); - // Signal waiting working threads. - queue_cond.signal(); - mutex.unlock(); -#else - tile->load( tile_path, true ); -#endif // ENABLE_THREADS + tile_load_queue.push( tile ); } +#ifdef WISH_PLIB_WAS_THREADED // but it isn't +/** + * + */ +void +FGTileLoader::remove( FGTileEntry* tile ) +{ + tile_free_queue.push( tile ); +} +#endif + /** * */ void FGTileLoader::update() { + #ifdef ENABLE_THREADS + // send a signal to the pager thread that it is allowed to load + // another tile mutex.lock(); frame_cond.signal(); mutex.unlock(); +#else + if ( !tile_load_queue.empty() ) { + // cout << "loading next tile ..." << endl; + // load the next tile in the queue + FGTileEntry* tile = tile_load_queue.front(); + tile_load_queue.pop(); + + tile->load( tile_path, true ); + + FGTileMgr::ready_to_attach( tile ); + } + +#ifdef WISH_PLIB_WAS_THREADED // but it isn't + if ( !tile_free_queue.empty() ) { + // cout << "freeing next tile ..." << endl; + // free the next tile in the queue + FGTileEntry* tile = tile_free_queue.front(); + tile_free_queue.pop(); + tile->free_tile(); + delete tile; + } +#endif + #endif // ENABLE_THREADS + } @@ -117,32 +166,30 @@ FGTileLoader::LoaderThread::run() pthread_cleanup_push( cleanup_handler, loader ); while ( true ) { // Wait for a load request to be placed in the queue. - loader->mutex.lock(); - while (loader->empty()) - { - loader->queue_cond.wait( loader->mutex ); - } - - // Have we been canceled - exits if yes. - //pthread_testcancel(); - if (loader->empty()) - { - loader->mutex.unlock(); - pthread_exit( PTHREAD_CANCELED ); - } + FGTileEntry* tile = loader->tile_load_queue.pop(); // Wait for the next frame signal before we load a tile from the queue - // Note that loader->mutex is already locked at this point. + loader->mutex.lock(); loader->frame_cond.wait( loader->mutex ); - - // Grab the tile to load and release the mutex. - FGTileEntry* tile = loader->tile_queue.front(); - loader->tile_queue.pop(); - loader->mutex.unlock(); + loader->mutex.unlock(); set_cancel( SGThread::CANCEL_DISABLE ); tile->load( loader->tile_path, true ); set_cancel( SGThread::CANCEL_DEFERRED ); + + FGTileMgr::ready_to_attach( tile ); + +#ifdef WISH_PLIB_WAS_THREADED // but it isn't + // Handle and pending removals + while ( !loader->tile_free_queue.empty() ) { + // cout << "freeing next tile ..." << endl; + // free the next tile in the queue + FGTileEntry* tile = loader->tile_free_queue.pop(); + tile->free_tile(); + delete tile; + } +#endif + } pthread_cleanup_pop(1); }