--- /dev/null
+#ifndef MSP_GL_RESOURCEMANAGER_H_
+#define MSP_GL_RESOURCEMANAGER_H_
+
+#include <msp/core/mutex.h>
+#include <msp/core/semaphore.h>
+#include <msp/core/thread.h>
+#include <msp/datafile/collection.h>
+#include "resource.h"
+
+namespace Msp {
+namespace GL {
+
+class ResourceManager
+{
+public:
+ enum LoadingPolicy
+ {
+ LOAD_IMMEDIATELY,
+ LOAD_ON_DEMAND,
+ LOAD_MANUALLY
+ };
+
+private:
+ struct ManagedResource
+ {
+ Resource *resource;
+ DataFile::Collection *collection;
+ std::string name;
+ IO::Seekable *io;
+ Resource::AsyncLoader *loader;
+
+ ManagedResource(Resource &);
+ };
+
+ class LoadingThread: public Thread
+ {
+ public:
+ enum State
+ {
+ IDLE,
+ SYNC_PENDING,
+ BUSY,
+ LOAD_FINISHED,
+ TERMINATING
+ };
+
+ private:
+ ResourceManager &manager;
+ Semaphore sem;
+ ManagedResource *volatile resource;
+ volatile State state;
+
+ public:
+ LoadingThread(ResourceManager &);
+
+ private:
+ virtual void main();
+
+ public:
+ void set_resource(ManagedResource *);
+ ManagedResource *get_resource() const { return resource; }
+ void sync();
+ State get_state() const { return state; }
+
+ void terminate();
+ };
+
+ typedef std::list<ManagedResource *> LoadQueue;
+
+ LoadingPolicy policy;
+ bool async_loads;
+ std::map<const Resource *, ManagedResource> resources;
+ std::list<ManagedResource *> queue;
+ LoadingThread thread;
+
+public:
+ ResourceManager();
+ ~ResourceManager();
+
+ void set_loading_policy(LoadingPolicy);
+ void set_async_loads(bool);
+
+ void add_resource(Resource &);
+ void set_resource_location(Resource &, DataFile::Collection &, const std::string &);
+ void load_resource(const Resource &);
+ void remove_resource(Resource &);
+
+ void tick();
+};
+
+} // namespace GL
+} // namespace Msp
+
+#endif