X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fresourcemanager.h;h=a1ff7aee2fc32adda60d12b0a63166c635e81822;hb=6db6b7e49848e6bbc14f3ec8113ee5a941e4af07;hp=49a4c0bde3a7d33b1a02da359c486257a2e9b735;hpb=20703b6d4dfd0836cdb787bd416d4ae9bf010602;p=libs%2Fgl.git diff --git a/source/resourcemanager.h b/source/resourcemanager.h index 49a4c0bd..a1ff7aee 100644 --- a/source/resourcemanager.h +++ b/source/resourcemanager.h @@ -1,6 +1,7 @@ #ifndef MSP_GL_RESOURCEMANAGER_H_ #define MSP_GL_RESOURCEMANAGER_H_ +#include #include #include #include @@ -10,6 +11,8 @@ namespace Msp { namespace GL { +class ResourceWatcher; + class ResourceManager { public: @@ -23,55 +26,81 @@ public: private: struct ManagedResource { + enum State + { + NOT_LOADED, + LOAD_QUEUED, + LOADING, + LOAD_FINISHED, + LOADED + }; + Resource *resource; DataFile::Collection *collection; std::string name; IO::Seekable *io; Resource::AsyncLoader *loader; + State state; + unsigned last_used; + UInt64 data_size; + std::vector watchers; ManagedResource(Resource &); + + void start_loading(); + bool process(bool); + void finish_loading(bool); + void finish_loading(); + void unload(); + + void add_watcher(ResourceWatcher &); + void remove_watcher(ResourceWatcher &); }; + typedef std::list LoadQueue; + 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; + Mutex queue_mutex; + LoadQueue async_queue; + LoadQueue sync_queue; + unsigned capacity; + unsigned size; + volatile bool done; public: - LoadingThread(ResourceManager &); + LoadingThread(); private: virtual void main(); + ManagedResource *front(LoadQueue &); + + public: + void add_resource(ManagedResource &); + void remove_resource(ManagedResource &); + private: + bool try_remove_resource(ManagedResource &); public: - void set_resource(ManagedResource *); - ManagedResource *get_resource() const { return resource; } - void sync(); - State get_state() const { return state; } + bool sync(); + bool needs_work() const { return size ResourceMap; - typedef std::list LoadQueue; LoadingPolicy policy; bool async_loads; ResourceMap resources; LoadQueue queue; + UInt64 size_limit; + unsigned frame; + unsigned min_retain_frames; + unsigned max_retain_frames; + unsigned next_unload; LoadingThread thread; public: @@ -80,13 +109,30 @@ public: void set_loading_policy(LoadingPolicy); void set_async_loads(bool); + void set_size_limit(UInt64); + void set_min_retain_frames(unsigned); + void set_max_retain_frames(unsigned); void add_resource(Resource &); + void *get_data_for_resource(const Resource &); void set_resource_location(Resource &, DataFile::Collection &, const std::string &); - void load_resource(const Resource &); + void load_resource(Resource &); + void resource_used(const Resource &); void remove_resource(Resource &); + void watch_resource(const Resource &, ResourceWatcher &); + void unwatch_resource(const Resource &, ResourceWatcher &); + void tick(); +private: + void dispatch_work(); + void unload_by_age(); + void unload_by_size(); +public: + UInt64 get_total_data_size() const; + +private: + static bool age_order(ManagedResource *, ManagedResource *); }; } // namespace GL