#include "multiobjectcache.hpp" #include #include namespace Resource { MultiObjectCache::MultiObjectCache() {} MultiObjectCache::~MultiObjectCache() {} void MultiObjectCache::removeUnreferencedObjectsInCache() { std::vector> objectsToRemove; { std::lock_guard lock(_objectCacheMutex); // Remove unreferenced entries from object cache ObjectCacheMap::iterator oitr = _objectCache.begin(); while (oitr != _objectCache.end()) { if (oitr->second->referenceCount() <= 1) { objectsToRemove.push_back(oitr->second); _objectCache.erase(oitr++); } else { ++oitr; } } } // note, actual unref happens outside of the lock objectsToRemove.clear(); } void MultiObjectCache::clear() { std::lock_guard lock(_objectCacheMutex); _objectCache.clear(); } void MultiObjectCache::addEntryToObjectCache(const std::string& filename, osg::Object* object) { if (!object) { OSG_ALWAYS << " trying to add NULL object to cache for " << filename << std::endl; return; } std::lock_guard lock(_objectCacheMutex); _objectCache.insert(std::make_pair(filename, object)); } osg::ref_ptr MultiObjectCache::takeFromObjectCache(const std::string& fileName) { std::lock_guard lock(_objectCacheMutex); ObjectCacheMap::iterator found = _objectCache.find(fileName); if (found == _objectCache.end()) return osg::ref_ptr(); else { osg::ref_ptr object = found->second; _objectCache.erase(found); return object; } } void MultiObjectCache::releaseGLObjects(osg::State* state) { std::lock_guard lock(_objectCacheMutex); for (ObjectCacheMap::iterator itr = _objectCache.begin(); itr != _objectCache.end(); ++itr) { osg::Object* object = itr->second.get(); object->releaseGLObjects(state); } } unsigned int MultiObjectCache::getCacheSize() const { std::lock_guard lock(_objectCacheMutex); return _objectCache.size(); } }