1 // FGTileLoader - Queue scenery tiles for loading.
3 // Written by Bernie Bright, started March 2001.
5 // Copyright (C) 2001 Bernard Bright - bbright@bigpond.net.au
7 // This program is free software; you can redistribute it and/or
8 // modify it under the terms of the GNU General Public License as
9 // published by the Free Software Foundation; either version 2 of the
10 // License, or (at your option) any later version.
12 // This program is distributed in the hope that it will be useful, but
13 // WITHOUT ANY WARRANTY; without even the implied warranty of
14 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 // General Public License for more details.
17 // You should have received a copy of the GNU General Public License
18 // along with this program; if not, write to the Free Software
19 // Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
24 #ifndef FG_TILE_LOADER_HXX
25 #define FG_TILE_LOADER_HXX
27 #include <simgear/bucket/newbucket.hxx>
28 #include <simgear/misc/sg_path.hxx>
31 # include <simgear/threads/SGThread.hxx>
32 # include <simgear/threads/SGQueue.hxx>
35 SG_USING_STD( queue );
43 * Queues tiles for loading, possibly by a separate thread.
59 #if 0 // we don't ever want to do this I don't think
61 * Flush anything in pending load queue without doing the work
62 * Leave the free queue intact since that's are only record of
63 * things we need to remove.
69 * Add a tile to the end of the load queue.
70 * @param tile The tile to be loaded from disk.
72 void add( FGTileEntry* tile );
74 #ifdef WISH_PLIB_WAS_THREADED // but it isn't
76 * Remove a tile from memory.
77 * @param tile The tile to be removed from memory.
79 void remove( FGTileEntry* tile );
83 * The tile loader thread will only load one tile per call to the
84 * update() method. This is a way to spread out the work of the
85 * tile loader and slow it down so it is less intrusive. For
86 * systems built without thead support this is a no-op.
91 * Returns whether the load queue is empty (contains no elements).
92 * @return true if load queue is empty otherwise returns false.
94 // bool empty() const { return tile_load_queue.empty(); }
100 #ifdef ENABLE_THREADS
102 * FIFO queue of tiles to load from data files.
104 SGBlockingQueue< FGTileEntry * > tile_load_queue;
105 // SGBlockingQueue< FGTileEntry * > tile_free_queue;
107 queue< FGTileEntry * > tile_load_queue;
108 // queue< FGTileEntry * > tile_free_queue;
112 * Base name of directory containing tile data file.
116 #ifdef ENABLE_THREADS
118 * Maximum number of threads to create for loading tiles.
120 enum { MAX_THREADS = 1 };
123 * This class represents the thread of execution responsible for
126 class LoaderThread : public SGThread
129 LoaderThread( FGTileLoader* l ) : loader(l) {}
133 * Reads the tile from disk.
138 FGTileLoader* loader;
143 LoaderThread( const LoaderThread& );
144 LoaderThread& operator=( const LoaderThread& );
147 friend class LoaderThread;
150 * Array of loading threads.
152 LoaderThread* threads[ MAX_THREADS ];
155 * Lock and synchronize access to tile queue.
158 SGCondition frame_cond;
161 * Thread cleanup handler.
163 friend void cleanup_handler( void* );
164 #endif // ENABLE_THREADS
167 #endif // FG_TILE_LOADER_HXX