1
0
Fork 0
mirror of https://github.com/luanti-org/luanti.git synced 2025-07-02 16:38:41 +00:00

Switch env lock to fair mutex implementation

This commit is contained in:
sfan5 2024-09-15 22:16:05 +02:00
parent 0220d0d492
commit 5f308deb50
2 changed files with 49 additions and 2 deletions

View file

@ -0,0 +1,46 @@
// Minetest
// SPDX-License-Identifier: LGPL-2.1-or-later
#pragma once
#include <cstdint>
#include <condition_variable>
/*
Fair mutex based on ticketing approach.
Satisfies `Mutex` C++11 requirements.
*/
class ordered_mutex {
public:
ordered_mutex() : next_ticket(0), counter(0) {}
void lock()
{
std::unique_lock autolock(cv_lock);
const auto ticket = next_ticket++;
cv.wait(autolock, [&] { return counter == ticket; });
}
bool try_lock()
{
std::lock_guard autolock(cv_lock);
if (counter != next_ticket)
return false;
next_ticket++;
return true;
}
void unlock()
{
{
std::lock_guard autolock(cv_lock);
counter++;
}
cv.notify_all(); // intentionally outside lock
}
private:
std::condition_variable cv;
std::mutex cv_lock;
uint_fast32_t next_ticket, counter;
};