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 ResourceObserver;
16 class resource_load_error: public std::runtime_error
19 resource_load_error(const std::string &, const std::string &);
20 resource_load_error(const std::string &, const std::exception &);
21 virtual ~resource_load_error() throw() { }
35 struct ResourceLocation
37 DataFile::Collection *collection;
41 ResourceLocation(DataFile::Collection &, const std::string &);
45 struct ManagedResource
58 ResourceLocation location;
61 Resource::AsyncLoader *loader;
65 std::vector<ResourceObserver *> observers;
67 ManagedResource(Resource &);
71 void finish_loading(bool);
72 void finish_loading();
75 void add_observer(ResourceObserver &);
76 void remove_observer(ResourceObserver &);
79 class LoadingThread: public Thread
84 std::list<ManagedResource *> async_queue;
85 std::list<ManagedResource *> sync_queue;
88 std::list<resource_load_error> error_queue;
89 Mutex data_size_mutex;
90 UInt64 loaded_data_size;
99 ManagedResource *front(std::list<ManagedResource *> &);
102 void add_resource(ManagedResource &);
103 void remove_resource(ManagedResource &);
105 bool try_remove_resource(ManagedResource &);
108 bool needs_work() const { return size<capacity; }
109 UInt64 get_and_reset_loaded_data_size();
114 LoadingPolicy policy;
116 mutable Mutex map_mutex;
117 std::map<const Resource *, ManagedResource> resources;
118 std::list<ManagedResource *> queue;
119 UInt64 total_data_size;
122 unsigned min_retain_frames;
123 unsigned max_retain_frames;
124 unsigned next_unload;
125 LoadingThread thread;
131 void set_loading_policy(LoadingPolicy);
132 void set_async_loads(bool);
133 void set_size_limit(UInt64);
134 void set_min_retain_frames(unsigned);
135 void set_max_retain_frames(unsigned);
137 void add_resource(Resource &);
139 const ManagedResource &get_managed_resource(const Resource &) const;
140 ManagedResource &get_managed_resource(const Resource &);
142 void *get_data_for_resource(const Resource &r) { return &get_managed_resource(r); }
143 void set_resource_location(Resource &, DataFile::Collection &, const std::string &);
144 void set_resource_location(Resource &, const ResourceLocation &);
145 const ResourceLocation *get_resource_location(const Resource &) const;
146 void load_resource(Resource &);
147 bool is_resource_loaded(const Resource &) const;
148 void resource_used(const Resource &);
149 void remove_resource(Resource &);
151 void observe_resource(const Resource &, ResourceObserver &);
152 void unobserve_resource(const Resource &, ResourceObserver &);
156 void dispatch_work();
157 void unload_by_age();
158 void unload_by_size();
160 UInt64 get_total_data_size() const { return total_data_size; }
163 static bool age_order(ManagedResource *, ManagedResource *);