mirror of
https://github.com/RPCS3/rpcs3.git
synced 2025-04-28 21:38:01 +03:00
Remove safe_reader_lock, safe_writer_lock
It worked as a simple recursive locker for shared_mutex But its design is flawed and thus can't be fully implemented
This commit is contained in:
parent
e8b5555630
commit
445e5def42
2 changed files with 0 additions and 107 deletions
|
@ -5,9 +5,6 @@
|
||||||
#include <vector>
|
#include <vector>
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
|
|
||||||
// TLS variable for tracking owned mutexes
|
|
||||||
thread_local std::vector<shared_mutex*> g_tls_locks;
|
|
||||||
|
|
||||||
void shared_mutex::imp_lock_shared(s64 _old)
|
void shared_mutex::imp_lock_shared(s64 _old)
|
||||||
{
|
{
|
||||||
verify("shared_mutex overflow" HERE), _old <= c_max;
|
verify("shared_mutex overflow" HERE), _old <= c_max;
|
||||||
|
@ -257,78 +254,3 @@ bool shared_mutex::try_lock_degrade()
|
||||||
// TODO
|
// TODO
|
||||||
return m_value.compare_and_swap_test(0, c_one - c_min);
|
return m_value.compare_and_swap_test(0, c_one - c_min);
|
||||||
}
|
}
|
||||||
|
|
||||||
safe_reader_lock::safe_reader_lock(shared_mutex& mutex)
|
|
||||||
: m_mutex(mutex)
|
|
||||||
, m_is_owned(false)
|
|
||||||
{
|
|
||||||
if (std::count(g_tls_locks.cbegin(), g_tls_locks.cend(), &m_mutex) == 0)
|
|
||||||
{
|
|
||||||
m_is_owned = true;
|
|
||||||
|
|
||||||
if (m_is_owned)
|
|
||||||
{
|
|
||||||
m_mutex.lock_shared();
|
|
||||||
g_tls_locks.emplace_back(&m_mutex);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// TODO: order locks
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
safe_reader_lock::~safe_reader_lock()
|
|
||||||
{
|
|
||||||
if (m_is_owned)
|
|
||||||
{
|
|
||||||
m_mutex.unlock_shared();
|
|
||||||
g_tls_locks.erase(std::remove(g_tls_locks.begin(), g_tls_locks.end(), &m_mutex), g_tls_locks.cend());
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// TODO: order locks
|
|
||||||
}
|
|
||||||
|
|
||||||
safe_writer_lock::safe_writer_lock(shared_mutex& mutex)
|
|
||||||
: m_mutex(mutex)
|
|
||||||
, m_is_owned(false)
|
|
||||||
, m_is_upgraded(false)
|
|
||||||
{
|
|
||||||
if (std::count(g_tls_locks.cbegin(), g_tls_locks.cend(), &m_mutex) == 0)
|
|
||||||
{
|
|
||||||
m_is_owned = true;
|
|
||||||
|
|
||||||
if (m_is_owned)
|
|
||||||
{
|
|
||||||
m_mutex.lock();
|
|
||||||
g_tls_locks.emplace_back(&m_mutex);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// TODO: order locks
|
|
||||||
}
|
|
||||||
|
|
||||||
if (m_mutex.is_reading())
|
|
||||||
{
|
|
||||||
m_is_upgraded = true;
|
|
||||||
m_mutex.lock_upgrade();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
safe_writer_lock::~safe_writer_lock()
|
|
||||||
{
|
|
||||||
if (m_is_upgraded)
|
|
||||||
{
|
|
||||||
m_mutex.lock_degrade();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (m_is_owned)
|
|
||||||
{
|
|
||||||
m_mutex.unlock();
|
|
||||||
g_tls_locks.erase(std::remove(g_tls_locks.begin(), g_tls_locks.end(), &m_mutex), g_tls_locks.cend());
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// TODO: order locks
|
|
||||||
}
|
|
||||||
|
|
|
@ -138,32 +138,3 @@ public:
|
||||||
m_upgraded ? m_mutex.unlock() : m_mutex.unlock_shared();
|
m_upgraded ? m_mutex.unlock() : m_mutex.unlock_shared();
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
// Safe reader lock. Can be recursive above other safe locks (reader or writer).
|
|
||||||
class safe_reader_lock final
|
|
||||||
{
|
|
||||||
shared_mutex& m_mutex;
|
|
||||||
bool m_is_owned;
|
|
||||||
|
|
||||||
public:
|
|
||||||
safe_reader_lock(const safe_reader_lock&) = delete;
|
|
||||||
|
|
||||||
explicit safe_reader_lock(shared_mutex& mutex);
|
|
||||||
|
|
||||||
~safe_reader_lock();
|
|
||||||
};
|
|
||||||
|
|
||||||
// Safe writer lock. Can be recursive above other safe locks. Performs upgrade and degrade operations above existing reader lock if necessary.
|
|
||||||
class safe_writer_lock final
|
|
||||||
{
|
|
||||||
shared_mutex& m_mutex;
|
|
||||||
bool m_is_owned;
|
|
||||||
bool m_is_upgraded;
|
|
||||||
|
|
||||||
public:
|
|
||||||
safe_writer_lock(const safe_writer_lock&) = delete;
|
|
||||||
|
|
||||||
explicit safe_writer_lock(shared_mutex& mutex);
|
|
||||||
|
|
||||||
~safe_writer_lock();
|
|
||||||
};
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue