2018-09-25 22:34:45 +02:00
|
|
|
#pragma once
|
|
|
|
|
|
|
|
|
|
#include "vm.h"
|
|
|
|
|
|
|
|
|
|
class cpu_thread;
|
|
|
|
|
class shared_mutex;
|
|
|
|
|
|
|
|
|
|
namespace vm
|
|
|
|
|
{
|
|
|
|
|
extern shared_mutex g_mutex;
|
|
|
|
|
|
|
|
|
|
extern thread_local atomic_t<cpu_thread*>* g_tls_locked;
|
|
|
|
|
|
|
|
|
|
// Register reader
|
|
|
|
|
void passive_lock(cpu_thread& cpu);
|
2020-04-11 10:16:28 +02:00
|
|
|
atomic_t<u64>* range_lock(u32 begin, u32 end);
|
2018-09-25 22:34:45 +02:00
|
|
|
|
|
|
|
|
// Unregister reader
|
|
|
|
|
void passive_unlock(cpu_thread& cpu);
|
|
|
|
|
|
|
|
|
|
// Unregister reader (foreign thread)
|
|
|
|
|
void cleanup_unlock(cpu_thread& cpu) noexcept;
|
|
|
|
|
|
|
|
|
|
// Optimization (set cpu_flag::memory)
|
|
|
|
|
void temporary_unlock(cpu_thread& cpu) noexcept;
|
|
|
|
|
void temporary_unlock() noexcept;
|
|
|
|
|
|
|
|
|
|
class reader_lock final
|
|
|
|
|
{
|
|
|
|
|
bool m_upgraded = false;
|
|
|
|
|
|
|
|
|
|
public:
|
|
|
|
|
reader_lock(const reader_lock&) = delete;
|
|
|
|
|
reader_lock& operator=(const reader_lock&) = delete;
|
|
|
|
|
reader_lock();
|
|
|
|
|
~reader_lock();
|
|
|
|
|
|
|
|
|
|
void upgrade();
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
struct writer_lock final
|
|
|
|
|
{
|
|
|
|
|
writer_lock(const writer_lock&) = delete;
|
|
|
|
|
writer_lock& operator=(const writer_lock&) = delete;
|
|
|
|
|
writer_lock(u32 addr = 0);
|
|
|
|
|
~writer_lock();
|
|
|
|
|
};
|
|
|
|
|
} // namespace vm
|