Tools: Introduce semaphore

This commit is contained in:
Dennis Klein 2019-07-14 19:14:05 +02:00 committed by Dennis Klein
parent a98965031f
commit 99ed61a58b
4 changed files with 97 additions and 0 deletions

View File

@ -38,6 +38,7 @@ if(BUILD_FAIRMQ OR BUILD_SDK)
tools/Network.h tools/Network.h
tools/Process.h tools/Process.h
tools/RateLimit.h tools/RateLimit.h
tools/Semaphore.h
tools/Strings.h tools/Strings.h
tools/Unique.h tools/Unique.h
tools/Version.h tools/Version.h
@ -47,6 +48,7 @@ if(BUILD_FAIRMQ OR BUILD_SDK)
set(TOOLS_SOURCE_FILES set(TOOLS_SOURCE_FILES
tools/Network.cxx tools/Network.cxx
tools/Process.cxx tools/Process.cxx
tools/Semaphore.cxx
tools/Unique.cxx tools/Unique.cxx
) )

View File

@ -14,6 +14,7 @@
#include <fairmq/tools/Network.h> #include <fairmq/tools/Network.h>
#include <fairmq/tools/Process.h> #include <fairmq/tools/Process.h>
#include <fairmq/tools/RateLimit.h> #include <fairmq/tools/RateLimit.h>
#include <fairmq/tools/Semaphore.h>
#include <fairmq/tools/Strings.h> #include <fairmq/tools/Strings.h>
#include <fairmq/tools/Unique.h> #include <fairmq/tools/Unique.h>
#include <fairmq/tools/Version.h> #include <fairmq/tools/Version.h>

View File

@ -0,0 +1,50 @@
/********************************************************************************
* Copyright (C) 2019 GSI Helmholtzzentrum fuer Schwerionenforschung GmbH *
* *
* This software is distributed under the terms of the *
* GNU Lesser General Public Licence (LGPL) version 3, *
* copied verbatim in the file "LICENSE" *
********************************************************************************/
#include "Semaphore.h"
namespace fair {
namespace mq {
namespace tools {
Semaphore::Semaphore()
: Semaphore(0)
{}
Semaphore::Semaphore(std::size_t initial_count)
: fCount(initial_count)
{}
auto Semaphore::Wait() -> void
{
std::unique_lock<std::mutex> lk(fMutex);
if (fCount > 0) {
--fCount;
} else {
fCv.wait(lk, [this] { return fCount > 0; });
--fCount;
}
}
auto Semaphore::Signal() -> void
{
std::unique_lock<std::mutex> lk(fMutex);
++fCount;
lk.unlock();
fCv.notify_one();
}
auto Semaphore::GetCount() -> std::size_t
{
std::unique_lock<std::mutex> lk(fMutex);
return fCount;
}
} /* namespace tools */
} /* namespace mq */
} /* namespace fair */

44
fairmq/tools/Semaphore.h Normal file
View File

@ -0,0 +1,44 @@
/********************************************************************************
* Copyright (C) 2019 GSI Helmholtzzentrum fuer Schwerionenforschung GmbH *
* *
* This software is distributed under the terms of the *
* GNU Lesser General Public Licence (LGPL) version 3, *
* copied verbatim in the file "LICENSE" *
********************************************************************************/
#ifndef FAIR_MQ_TOOLS_SEMAPHORE_H
#define FAIR_MQ_TOOLS_SEMAPHORE_H
#include <condition_variable>
#include <cstdint>
#include <functional>
#include <mutex>
namespace fair {
namespace mq {
namespace tools {
/**
* @struct Semaphore Semaphore.h <fairmq/tools/Semaphore.h>
* @brief A simple blocking semaphore.
*/
struct Semaphore
{
explicit Semaphore();
explicit Semaphore(std::size_t initial_count);
auto Wait() -> void;
auto Signal() -> void;
auto GetCount() -> std::size_t;
private:
std::size_t fCount;
std::mutex fMutex;
std::condition_variable fCv;
};
} /* namespace tools */
} /* namespace mq */
} /* namespace fair */
#endif /* FAIR_MQ_TOOLS_SEMAPHORE_H */