1 #ifndef MSP_GL_RESOURCEMANAGER_H_
2 #define MSP_GL_RESOURCEMANAGER_H_
4 #include <msp/core/inttypes.h>
5 #include <msp/core/mutex.h>
6 #include <msp/core/semaphore.h>
7 #include <msp/core/thread.h>
8 #include <msp/datafile/collection.h>
14 class ResourceWatcher;
27 struct ManagedResource
39 DataFile::Collection *collection;
42 Resource::AsyncLoader *loader;
46 std::vector<ResourceWatcher *> watchers;
48 ManagedResource(Resource &);
52 void finish_loading(bool);
53 void finish_loading();
56 void add_watcher(ResourceWatcher &);
57 void remove_watcher(ResourceWatcher &);
60 typedef std::list<ManagedResource *> LoadQueue;
62 class LoadingThread: public Thread
67 LoadQueue async_queue;
79 ManagedResource *front(LoadQueue &);
82 void add_resource(ManagedResource &);
83 void remove_resource(ManagedResource &);
85 bool try_remove_resource(ManagedResource &);
88 bool needs_work() const { return size<capacity; }
93 typedef std::map<const Resource *, ManagedResource> ResourceMap;
97 ResourceMap resources;
101 unsigned min_retain_frames;
102 unsigned max_retain_frames;
103 unsigned next_unload;
104 LoadingThread thread;
110 void set_loading_policy(LoadingPolicy);
111 void set_async_loads(bool);
112 void set_size_limit(UInt64);
113 void set_min_retain_frames(unsigned);
114 void set_max_retain_frames(unsigned);
116 void add_resource(Resource &);
117 void *get_data_for_resource(const Resource &);
118 void set_resource_location(Resource &, DataFile::Collection &, const std::string &);
119 void load_resource(Resource &);
120 void resource_used(const Resource &);
121 void remove_resource(Resource &);
123 void watch_resource(const Resource &, ResourceWatcher &);
124 void unwatch_resource(const Resource &, ResourceWatcher &);
128 void dispatch_work();
129 void unload_by_age();
130 void unload_by_size();
132 UInt64 get_total_data_size() const;
135 static bool age_order(ManagedResource *, ManagedResource *);