1
0
Fork 0
mirror of https://github.com/polybar/polybar.git synced 2024-11-11 13:50:56 -05:00
polybar/include/utils/concurrency.hpp

70 lines
1.2 KiB
C++
Raw Normal View History

2016-06-14 23:32:35 -04:00
#pragma once
2016-11-20 17:04:31 -05:00
#include <atomic>
2016-06-14 23:32:35 -04:00
#include <mutex>
2016-11-20 17:04:31 -05:00
#include <thread>
2016-06-14 23:32:35 -04:00
#include "common.hpp"
#include "utils/mixins.hpp"
2016-11-19 00:22:44 -05:00
POLYBAR_NS
2016-06-14 23:32:35 -04:00
2016-11-20 17:04:31 -05:00
namespace this_thread = std::this_thread;
using std::thread;
2016-12-09 03:02:47 -05:00
using stateflag = std::atomic<bool>;
2016-11-20 17:04:31 -05:00
namespace concurrency_util {
2016-06-14 23:32:35 -04:00
namespace locking_strategy {
struct no_backoff {
bool operator()() {
return true;
}
};
struct yield_backoff {
bool operator()() {
this_thread::yield();
return false;
}
};
}
class spin_lock : public non_copyable_mixin<spin_lock> {
public:
/**
* Construct spin_lock
*/
spin_lock() = default;
/**
* Lock using custom strategy
*/
template <typename Backoff>
void lock(Backoff backoff) noexcept {
while (m_locked.test_and_set(std::memory_order_acquire)) {
backoff();
}
}
/**
* Lock using default strategy
*/
void lock() noexcept {
lock(locking_strategy::no_backoff{});
}
/**
* Unlock
*/
void unlock() noexcept {
m_locked.clear(std::memory_order_release);
}
protected:
std::atomic_flag m_locked{false};
};
}
2016-11-19 00:22:44 -05:00
POLYBAR_NS_END