#include "remote_logger_pool.hh"
RemoteLoggerPool::RemoteLoggerPool(std::vector<std::shared_ptr<RemoteLoggerInterface>>&& pool) :
- d_pool(std::move(pool)), d_pool_it(d_pool.begin())
+ d_pool(std::move(pool)), d_counter(0)
{
}
RemoteLoggerInterface::Result RemoteLoggerPool::queueData(const std::string& data)
{
- std::shared_ptr<RemoteLoggerInterface> logger;
- {
- auto pool_it = d_pool_it.lock();
- logger = **pool_it;
- (*pool_it)++;
- if (*pool_it == d_pool.end()) {
- *pool_it = d_pool.begin();
- }
- }
+ std::shared_ptr<RemoteLoggerInterface> logger = d_pool.at(d_counter++ % d_pool.size());
return logger->queueData(data);
}
*/
#pragma once
#include "config.h"
-#include "lock.hh"
#include "remote_logger.hh"
+#include <atomic>
+#include <cstddef>
#include <memory>
#include <vector>
class RemoteLoggerPool : public RemoteLoggerInterface
{
public:
+ // this expects a non-empty vector
RemoteLoggerPool(std::vector<std::shared_ptr<RemoteLoggerInterface>>&& pool);
RemoteLoggerPool(const RemoteLoggerPool&) = delete;
RemoteLoggerPool(RemoteLoggerPool&&) = delete;
private:
std::vector<std::shared_ptr<RemoteLoggerInterface>> d_pool;
- LockGuarded<std::vector<std::shared_ptr<RemoteLoggerInterface>>::iterator> d_pool_it;
+ std::atomic<size_t> d_counter;
};