]> git.mxchange.org Git - flightgear.git/blob - src/Scenery/FGTileLoader.hxx
Fixed a bug in the tile pager / caching / management system that caused
[flightgear.git] / src / Scenery / FGTileLoader.hxx
1 // FGTileLoader - Queue scenery tiles for loading.
2 //
3 // Written by Bernie Bright, started March 2001.
4 //
5 // Copyright (C) 2001  Bernard Bright - bbright@bigpond.net.au
6 //
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.
11 //
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.
16 //
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.
20 //
21 // $Id$
22
23
24 #ifndef FG_TILE_LOADER_HXX
25 #define FG_TILE_LOADER_HXX
26
27 #include <simgear/bucket/newbucket.hxx>
28 #include <simgear/misc/sg_path.hxx>
29
30 #ifdef ENABLE_THREADS
31 #  include <simgear/threads/SGThread.hxx>
32 #  include <simgear/threads/SGQueue.hxx>
33 #else
34 #  include <queue>
35 #endif
36
37 // Forward reference.
38 class FGTileEntry;
39
40 /**
41  * Queues tiles for loading, possibly by a separate thread.
42  */
43 class FGTileLoader
44 {
45 public:
46
47     /**
48      * Constructor.
49      */
50     FGTileLoader();
51
52     /**
53      * Destructor.
54      */
55     ~FGTileLoader();
56
57 #if 0 // we don't ever want to do this I don't think
58     /**
59      * Flush anything in pending load queue without doing the work
60      * Leave the free queue intact since that's are only record of
61      * things we need to remove.
62      */
63     void reinit();
64 #endif
65     
66     /**
67      * Add a tile to the end of the load queue.
68      * @param tile The tile to be loaded from disk.
69      */
70     void add( FGTileEntry* tile );
71
72 #ifdef WISH_PLIB_WAS_THREADED // but it isn't
73     /**
74      * Remove a tile from memory.
75      * @param tile The tile to be removed from memory.
76      */
77     void remove( FGTileEntry* tile );
78 #endif
79
80     /**
81      * The tile loader thread will only load one tile per call to the
82      * update() method.  This is a way to spread out the work of the
83      * tile loader and slow it down so it is less intrusive.  For
84      * systems built without thead support this is a no-op.
85      */
86     void update();
87
88     /**
89      * Returns whether the load queue is empty (contains no elements).
90      * @return true if load queue is empty otherwise returns false.
91      */
92     // bool empty() const { return tile_load_queue.empty(); }
93
94 private:
95
96 private:
97
98 #ifdef ENABLE_THREADS
99     /**
100      * FIFO queue of tiles to load from data files.
101      */
102     SGBlockingQueue< FGTileEntry * > tile_load_queue;
103     // SGBlockingQueue< FGTileEntry * > tile_free_queue;
104 #else
105     queue< FGTileEntry * > tile_load_queue;
106     // queue< FGTileEntry * > tile_free_queue;
107 #endif
108
109     /**
110      * Base name of directory containing tile data file.
111      */
112     SGPath tile_path;
113
114 #ifdef ENABLE_THREADS
115     /**
116      * Maximum number of threads to create for loading tiles.
117      */
118     enum { MAX_THREADS = 1 };
119
120     /**
121      * This class represents the thread of execution responsible for
122      * loading a tile.
123      */
124     class LoaderThread : public SGThread
125     {
126     public:
127         LoaderThread( FGTileLoader* l ) : loader(l) {}
128         ~LoaderThread() {}
129
130         /**
131          * Reads the tile from disk.
132          */
133         void run();
134
135     private:
136         FGTileLoader* loader;
137
138     private:
139         // not implemented.
140         LoaderThread();
141         LoaderThread( const LoaderThread& );
142         LoaderThread& operator=( const LoaderThread& );
143     };
144
145     friend class LoaderThread;
146
147     /**
148      * Array of loading threads.
149      */
150     LoaderThread* threads[ MAX_THREADS ];
151     
152     /**
153      * Lock and synchronize access to tile queue.
154      */
155     SGMutex mutex;
156     SGCondition frame_cond;
157
158     /**
159      * Thread cleanup handler.
160      */
161     friend void cleanup_handler( void* );
162 #endif // ENABLE_THREADS
163 };
164
165 #endif // FG_TILE_LOADER_HXX