#include "data/storage/StorageProvider.h" #include "utility/logging/logging.h" int StorageProvider::getStorageCount() const { std::lock_guard lock(m_storagesMutex); return m_storages.size(); } void StorageProvider::insert(std::shared_ptr storage) { const std::size_t storageSize = storage->getSourceLocationCount(); std::list>::iterator it; std::lock_guard lock(m_storagesMutex); for (it = m_storages.begin(); it != m_storages.end(); it++) { if ((*it)->getSourceLocationCount() < storageSize) { break; } } m_storages.insert(it, storage); } std::shared_ptr StorageProvider::consumeSecondLargestStorage() { std::shared_ptr ret; { std::lock_guard lock(m_storagesMutex); if (m_storages.size() > 1) { std::list>::iterator it = m_storages.begin(); it++; ret = *it; m_storages.erase(it); } } return ret; } std::shared_ptr StorageProvider::consumeLargestStorage() { std::shared_ptr ret; { std::lock_guard lock(m_storagesMutex); if (!m_storages.empty()) { ret = m_storages.front(); m_storages.pop_front(); } } return ret; } void StorageProvider::logCurrentState() const { std::string logString = "Storages waiting for injection:"; { std::lock_guard lock(m_storagesMutex); for (const std::shared_ptr& storage: m_storages) { logString += " " + std::to_string(storage->getSourceLocationCount()) + ";"; } } LOG_INFO(logString); }