mirror of
https://github.com/doitsujin/dxvk.git
synced 2025-01-29 17:52:18 +01:00
[util] Implement spin lock
This commit is contained in:
parent
a5077952ea
commit
c9465b39d1
@ -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"
|
||||
|
47
src/util/sync/sync_spinlock.h
Normal file
47
src/util/sync/sync_spinlock.h
Normal 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 };
|
||||
|
||||
};
|
||||
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user