Skip to content

Commit

Permalink
STYLE: Use lock_guard<mutex> in Logger classes and GPUImageDataManager
Browse files Browse the repository at this point in the history
Replaced `m_Mutex.lock()`/`m_Mutex.unlock()` pairs, following C++ Core
Guidelines, September 23, 2022, "Use RAII, never plain `lock()`/`unlock()`"
https://isocpp.github.io/CppCoreGuidelines/CppCoreGuidelines#cp20-use-raii-never-plain-lockunlock
  • Loading branch information
N-Dekker authored and dzenanz committed Feb 6, 2023
1 parent c47ed1c commit a744aef
Show file tree
Hide file tree
Showing 4 changed files with 91 additions and 112 deletions.
90 changes: 42 additions & 48 deletions Modules/Core/Common/include/itkLoggerThreadWrapper.hxx
Expand Up @@ -30,10 +30,9 @@ template <typename SimpleLoggerType>
void
LoggerThreadWrapper<SimpleLoggerType>::SetPriorityLevel(PriorityLevelEnum level)
{
this->m_Mutex.lock();
const std::lock_guard<std::mutex> lockGuard(m_Mutex);
this->m_OperationQ.push(OperationEnum::SET_PRIORITY_LEVEL);
this->m_LevelQ.push(level);
this->m_Mutex.unlock();
}

/** Get the priority level for the current logger. Only messages that have
Expand All @@ -43,49 +42,44 @@ template <typename SimpleLoggerType>
typename SimpleLoggerType::PriorityLevelEnum
LoggerThreadWrapper<SimpleLoggerType>::GetPriorityLevel() const
{
this->m_Mutex.lock();
PriorityLevelEnum level = this->m_PriorityLevel;
this->m_Mutex.unlock();
const std::lock_guard<std::mutex> lockGuard(m_Mutex);
PriorityLevelEnum level = this->m_PriorityLevel;
return level;
}

template <typename SimpleLoggerType>
void
LoggerThreadWrapper<SimpleLoggerType>::SetLevelForFlushing(PriorityLevelEnum level)
{
this->m_Mutex.lock();
const std::lock_guard<std::mutex> lockGuard(m_Mutex);
this->m_LevelForFlushing = level;
this->m_OperationQ.push(OperationEnum::SET_LEVEL_FOR_FLUSHING);
this->m_LevelQ.push(level);
this->m_Mutex.unlock();
}

template <typename SimpleLoggerType>
typename SimpleLoggerType::PriorityLevelEnum
LoggerThreadWrapper<SimpleLoggerType>::GetLevelForFlushing() const
{
this->m_Mutex.lock();
PriorityLevelEnum level = this->m_LevelForFlushing;
this->m_Mutex.unlock();
const std::lock_guard<std::mutex> lockGuard(m_Mutex);
PriorityLevelEnum level = this->m_LevelForFlushing;
return level;
}

template <typename SimpleLoggerType>
void
LoggerThreadWrapper<SimpleLoggerType>::SetDelay(DelayType delay)
{
this->m_Mutex.lock();
const std::lock_guard<std::mutex> lockGuard(m_Mutex);
this->m_Delay = delay;
this->m_Mutex.unlock();
}

template <typename SimpleLoggerType>
auto
LoggerThreadWrapper<SimpleLoggerType>::GetDelay() const -> DelayType
{
this->m_Mutex.lock();
DelayType delay = this->m_Delay;
this->m_Mutex.unlock();
const std::lock_guard<std::mutex> lockGuard(m_Mutex);
DelayType delay = this->m_Delay;
return delay;
}

Expand All @@ -94,17 +88,16 @@ template <typename SimpleLoggerType>
void
LoggerThreadWrapper<SimpleLoggerType>::AddLogOutput(OutputType * output)
{
this->m_Mutex.lock();
const std::lock_guard<std::mutex> lockGuard(m_Mutex);
this->m_OperationQ.push(OperationEnum::ADD_LOG_OUTPUT);
this->m_OutputQ.push(output);
this->m_Mutex.unlock();
}

template <typename SimpleLoggerType>
void
LoggerThreadWrapper<SimpleLoggerType>::Write(PriorityLevelEnum level, std::string const & content)
{
this->m_Mutex.lock();
const std::lock_guard<std::mutex> lockGuard(m_Mutex);
if (this->m_PriorityLevel >= level)
{
this->m_OperationQ.push(OperationEnum::WRITE);
Expand All @@ -115,7 +108,6 @@ LoggerThreadWrapper<SimpleLoggerType>::Write(PriorityLevelEnum level, std::strin
{
this->PrivateFlush();
}
this->m_Mutex.unlock();
}

template <typename SimpleLoggerType>
Expand Down Expand Up @@ -156,9 +148,8 @@ template <typename SimpleLoggerType>
void
LoggerThreadWrapper<SimpleLoggerType>::Flush()
{
this->m_Mutex.lock();
const std::lock_guard<std::mutex> lockGuard(m_Mutex);
this->PrivateFlush();
this->m_Mutex.unlock();
}

template <typename SimpleLoggerType>
Expand Down Expand Up @@ -186,36 +177,39 @@ LoggerThreadWrapper<SimpleLoggerType>::ThreadFunction()
{
while (!m_TerminationRequested)
{
m_Mutex.lock();
while (!m_OperationQ.empty())
{
switch (m_OperationQ.front())
const std::lock_guard<std::mutex> lockGuard(m_Mutex);
while (!m_OperationQ.empty())
{
case OperationEnum::SET_PRIORITY_LEVEL:
this->m_PriorityLevel = m_LevelQ.front();
m_LevelQ.pop();
break;

case OperationEnum::SET_LEVEL_FOR_FLUSHING:
this->m_LevelForFlushing = m_LevelQ.front();
m_LevelQ.pop();
break;

case OperationEnum::ADD_LOG_OUTPUT:
this->m_Output->AddLogOutput(m_OutputQ.front());
m_OutputQ.pop();
break;

case OperationEnum::WRITE:
SimpleLoggerType::Write(m_LevelQ.front(), m_MessageQ.front());
m_LevelQ.pop();
m_MessageQ.pop();
break;
switch (m_OperationQ.front())
{
case OperationEnum::SET_PRIORITY_LEVEL:
this->m_PriorityLevel = m_LevelQ.front();
m_LevelQ.pop();
break;

case OperationEnum::SET_LEVEL_FOR_FLUSHING:
this->m_LevelForFlushing = m_LevelQ.front();
m_LevelQ.pop();
break;

case OperationEnum::ADD_LOG_OUTPUT:
this->m_Output->AddLogOutput(m_OutputQ.front());
m_OutputQ.pop();
break;

case OperationEnum::WRITE:
SimpleLoggerType::Write(m_LevelQ.front(), m_MessageQ.front());
m_LevelQ.pop();
m_MessageQ.pop();
break;
}
m_OperationQ.pop();
}
m_OperationQ.pop();
}
SimpleLoggerType::PrivateFlush();
m_Mutex.unlock();
SimpleLoggerType::PrivateFlush();

} // end of scope of lockGuard (unlocking m_Mutex automatically)

itksys::SystemTools::Delay(this->GetDelay());
}
}
Expand Down
12 changes: 4 additions & 8 deletions Modules/Core/Common/src/itkStdStreamLogOutput.cxx
Expand Up @@ -47,48 +47,44 @@ StdStreamLogOutput::SetStream(StreamType & Stream)
void
StdStreamLogOutput::Flush()
{
StdStreamLogOutput::m_Mutex.lock();
const std::lock_guard<std::mutex> lockGuard(m_Mutex);
if (this->m_Stream)
{
this->m_Stream->flush();
}
StdStreamLogOutput::m_Mutex.unlock();
}

/** Write to a buffer */
void
StdStreamLogOutput::Write(double timestamp)
{
StdStreamLogOutput::m_Mutex.lock();
const std::lock_guard<std::mutex> lockGuard(m_Mutex);
if (this->m_Stream)
{
(*this->m_Stream) << timestamp;
}
StdStreamLogOutput::m_Mutex.unlock();
}

/** Write to a buffer */
void
StdStreamLogOutput::Write(std::string const & content)
{
StdStreamLogOutput::m_Mutex.lock();
const std::lock_guard<std::mutex> lockGuard(m_Mutex);
if (this->m_Stream)
{
(*this->m_Stream) << content;
}
StdStreamLogOutput::m_Mutex.unlock();
}

/** Write to a buffer */
void
StdStreamLogOutput::Write(std::string const & content, double timestamp)
{
StdStreamLogOutput::m_Mutex.lock();
const std::lock_guard<std::mutex> lockGuard(m_Mutex);
if (this->m_Stream)
{
(*this->m_Stream) << timestamp << " : " << content;
}
StdStreamLogOutput::m_Mutex.unlock();
}

void
Expand Down
93 changes: 43 additions & 50 deletions Modules/Core/Common/src/itkThreadLogger.cxx
Expand Up @@ -41,87 +41,78 @@ ThreadLogger::~ThreadLogger()
void
ThreadLogger::SetPriorityLevel(PriorityLevelEnum level)
{
this->m_Mutex.lock();
const std::lock_guard<std::mutex> lockGuard(m_Mutex);
this->m_OperationQ.push(SET_PRIORITY_LEVEL);
this->m_LevelQ.push(level);
this->m_Mutex.unlock();
}

Logger::PriorityLevelEnum
ThreadLogger::GetPriorityLevel() const
{
this->m_Mutex.lock();
PriorityLevelEnum level = this->m_PriorityLevel;
this->m_Mutex.unlock();
const std::lock_guard<std::mutex> lockGuard(m_Mutex);
PriorityLevelEnum level = this->m_PriorityLevel;
return level;
}

void
ThreadLogger::SetLevelForFlushing(PriorityLevelEnum level)
{
this->m_Mutex.lock();
const std::lock_guard<std::mutex> lockGuard(m_Mutex);
this->m_LevelForFlushing = level;
this->m_OperationQ.push(SET_LEVEL_FOR_FLUSHING);
this->m_LevelQ.push(level);
this->m_Mutex.unlock();
}

Logger::PriorityLevelEnum
ThreadLogger::GetLevelForFlushing() const
{
this->m_Mutex.lock();
PriorityLevelEnum level = this->m_LevelForFlushing;
this->m_Mutex.unlock();
const std::lock_guard<std::mutex> lockGuard(m_Mutex);
PriorityLevelEnum level = this->m_LevelForFlushing;
return level;
}

void
ThreadLogger::SetDelay(DelayType delay)
{
this->m_Mutex.lock();
const std::lock_guard<std::mutex> lockGuard(m_Mutex);
this->m_Delay = delay;
this->m_Mutex.unlock();
}

ThreadLogger::DelayType
ThreadLogger::GetDelay() const
{
this->m_Mutex.lock();
DelayType delay = this->m_Delay;
this->m_Mutex.unlock();
const std::lock_guard<std::mutex> lockGuard(m_Mutex);
DelayType delay = this->m_Delay;
return delay;
}

void
ThreadLogger::AddLogOutput(OutputType * output)
{
this->m_Mutex.lock();
const std::lock_guard<std::mutex> lockGuard(m_Mutex);
this->m_OperationQ.push(ADD_LOG_OUTPUT);
this->m_OutputQ.push(output);
this->m_Mutex.unlock();
}

void
ThreadLogger::Write(PriorityLevelEnum level, std::string const & content)
{
this->m_Mutex.lock();
const std::lock_guard<std::mutex> lockGuard(m_Mutex);
this->m_OperationQ.push(WRITE);
this->m_MessageQ.push(content);
this->m_LevelQ.push(level);
if (this->m_LevelForFlushing >= level)
{
this->InternalFlush();
}
this->m_Mutex.unlock();
}

void
ThreadLogger::Flush()
{
this->m_Mutex.lock();
const std::lock_guard<std::mutex> lockGuard(m_Mutex);
this->m_OperationQ.push(FLUSH);
this->InternalFlush();
this->m_Mutex.unlock();
}

void
Expand Down Expand Up @@ -167,38 +158,40 @@ ThreadLogger::ThreadFunction()
{
while (!m_TerminationRequested)
{
m_Mutex.lock();
while (!m_OperationQ.empty())
{
switch (m_OperationQ.front())
const std::lock_guard<std::mutex> lockGuard(m_Mutex);
while (!m_OperationQ.empty())
{
case ThreadLogger::SET_PRIORITY_LEVEL:
m_PriorityLevel = m_LevelQ.front();
m_LevelQ.pop();
break;

case ThreadLogger::SET_LEVEL_FOR_FLUSHING:
m_LevelForFlushing = m_LevelQ.front();
m_LevelQ.pop();
break;

case ThreadLogger::ADD_LOG_OUTPUT:
m_Output->AddLogOutput(m_OutputQ.front());
m_OutputQ.pop();
break;

case ThreadLogger::WRITE:
Logger::Write(m_LevelQ.front(), m_MessageQ.front());
m_LevelQ.pop();
m_MessageQ.pop();
break;
case ThreadLogger::FLUSH:
Logger::Flush();
break;
switch (m_OperationQ.front())
{
case ThreadLogger::SET_PRIORITY_LEVEL:
m_PriorityLevel = m_LevelQ.front();
m_LevelQ.pop();
break;

case ThreadLogger::SET_LEVEL_FOR_FLUSHING:
m_LevelForFlushing = m_LevelQ.front();
m_LevelQ.pop();
break;

case ThreadLogger::ADD_LOG_OUTPUT:
m_Output->AddLogOutput(m_OutputQ.front());
m_OutputQ.pop();
break;

case ThreadLogger::WRITE:
Logger::Write(m_LevelQ.front(), m_MessageQ.front());
m_LevelQ.pop();
m_MessageQ.pop();
break;
case ThreadLogger::FLUSH:
Logger::Flush();
break;
}
m_OperationQ.pop();
}
m_OperationQ.pop();
}
m_Mutex.unlock();
} // end of scope of lockGuard (unlocking m_Mutex automatically)

itksys::SystemTools::Delay(this->GetDelay());
}
}
Expand Down

0 comments on commit a744aef

Please sign in to comment.