[util] Implement spin lock

This commit is contained in:
Philip Rebohle 2018-04-03 11:56:02 +02:00
parent a5077952ea
commit c9465b39d1
2 changed files with 49 additions and 0 deletions

View File

@ -12,6 +12,8 @@
#include "../util/rc/util_rc.h"
#include "../util/rc/util_rc_ptr.h"
#include "../util/sync/sync_spinlock.h"
#include "./vulkan/dxvk_vulkan_extensions.h"
#include "./vulkan/dxvk_vulkan_loader.h"
#include "./vulkan/dxvk_vulkan_names.h"

View File

@ -0,0 +1,47 @@
#pragma once
#include <atomic>
#include <thread>
namespace dxvk::sync {
/**
* \brief Spin lock
*
* A low-overhead spin lock which can be used to
* protect data structures for a short duration
* in case the structure is not likely contested.
*/
class Spinlock {
public:
Spinlock() { }
~Spinlock() { }
Spinlock (const Spinlock&) = delete;
Spinlock& operator = (const Spinlock&) = delete;
void lock() {
while (!this->try_lock())
std::this_thread::yield();
}
void unlock() {
m_lock.store(0, std::memory_order_release);
}
bool try_lock() {
uint32_t expected = 0;
return m_lock.compare_exchange_strong(expected, 1,
std::memory_order_acquire,
std::memory_order_relaxed);
}
private:
std::atomic<uint32_t> m_lock = { 0 };
};
}