This commit is contained in:
Evgeniy Gatov 2015-03-24 20:05:11 +03:00
commit 542d904058

View File

@ -231,7 +231,8 @@ public:
shutdown_called(false), shutdown_called(false),
chunk_merger(chunk_merger_), chunk_merger(chunk_merger_),
context(context_), context(context_),
log(log_) log(log_),
merging(false)
{ {
} }
@ -250,6 +251,8 @@ private:
Logger * log; Logger * log;
time_t last_nothing_to_merge_time = 0; time_t last_nothing_to_merge_time = 0;
std::atomic<bool> merging;
}; };
StorageChunkMerger::StorageChunkMerger( StorageChunkMerger::StorageChunkMerger(
@ -297,6 +300,27 @@ StorageChunkMerger::~StorageChunkMerger()
shutdown(); shutdown();
} }
struct BoolLock
{
BoolLock(std::atomic<bool> & flag_) : flag(flag_), locked(false) {}
bool trylock()
{
bool expected = false;
locked = flag.compare_exchange_weak(expected, true);
return locked;
}
~BoolLock()
{
if (locked)
flag.store(false);
}
std::atomic<bool> & flag;
bool locked;
};
bool StorageChunkMerger::MergeTask::merge() bool StorageChunkMerger::MergeTask::merge()
{ {
time_t now = time(0); time_t now = time(0);
@ -306,6 +330,10 @@ bool StorageChunkMerger::MergeTask::merge()
if (shutdown_called) if (shutdown_called)
return false; return false;
BoolLock lock(merging);
if (!lock.trylock())
return false;
bool merged = false; bool merged = false;
try try