Introduce SpinLock

This commit is contained in:
Alexander A. Klimov 2020-10-02 17:41:12 +02:00
parent d12bffe5f4
commit 0abcf7ea6f
3 changed files with 58 additions and 0 deletions

View File

@ -63,6 +63,7 @@ set(base_SOURCES
shared.hpp shared.hpp
singleton.hpp singleton.hpp
socket.cpp socket.hpp socket.cpp socket.hpp
spinlock.cpp spinlock.hpp
stacktrace.cpp stacktrace.hpp stacktrace.cpp stacktrace.hpp
statsfunction.hpp statsfunction.hpp
stdiostream.cpp stdiostream.hpp stdiostream.cpp stdiostream.hpp

22
lib/base/spinlock.cpp Normal file
View File

@ -0,0 +1,22 @@
/* Icinga 2 | (c) 2020 Icinga GmbH | GPLv2+ */
#include "base/spinlock.hpp"
#include <atomic>
using namespace icinga;
void SpinLock::lock()
{
while (m_Locked.test_and_set(std::memory_order_acquire)) {
}
}
bool SpinLock::try_lock()
{
return !m_Locked.test_and_set(std::memory_order_acquire);
}
void SpinLock::unlock()
{
m_Locked.clear(std::memory_order_release);
}

35
lib/base/spinlock.hpp Normal file
View File

@ -0,0 +1,35 @@
/* Icinga 2 | (c) 2020 Icinga GmbH | GPLv2+ */
#ifndef SPINLOCK_H
#define SPINLOCK_H
#include <atomic>
namespace icinga
{
/**
* A spin lock.
*
* @ingroup base
*/
class SpinLock
{
public:
SpinLock() = default;
SpinLock(const SpinLock&) = delete;
SpinLock& operator=(const SpinLock&) = delete;
SpinLock(SpinLock&&) = delete;
SpinLock& operator=(SpinLock&&) = delete;
void lock();
bool try_lock();
void unlock();
private:
std::atomic_flag m_Locked = ATOMIC_FLAG_INIT;
};
}
#endif /* SPINLOCK_H */