[Kernel/Threads] add shared version of locks to fix a crash when games try to unlock things that didn't get locked in the first place
This commit is contained in:
parent
0afcd8769b
commit
25894c4083
|
@ -1175,6 +1175,7 @@ void ExInitializeReadWriteLock(pointer_t<X_ERWLOCK> lock_ptr) {
|
||||||
DECLARE_XBOXKRNL_EXPORT1(ExInitializeReadWriteLock, kThreading, kImplemented);
|
DECLARE_XBOXKRNL_EXPORT1(ExInitializeReadWriteLock, kThreading, kImplemented);
|
||||||
|
|
||||||
void ExAcquireReadWriteLockExclusive(pointer_t<X_ERWLOCK> lock_ptr) {
|
void ExAcquireReadWriteLockExclusive(pointer_t<X_ERWLOCK> lock_ptr) {
|
||||||
|
XELOGD("ExAcquireReadWriteLockExclusive"); // " lock_ptr:(%X)", lock_ptr);
|
||||||
auto old_irql = xeKeKfAcquireSpinLock(&lock_ptr->spin_lock);
|
auto old_irql = xeKeKfAcquireSpinLock(&lock_ptr->spin_lock);
|
||||||
lock_ptr->lock_count++;
|
lock_ptr->lock_count++;
|
||||||
xeKeKfReleaseSpinLock(&lock_ptr->spin_lock, old_irql);
|
xeKeKfReleaseSpinLock(&lock_ptr->spin_lock, old_irql);
|
||||||
|
@ -1189,7 +1190,43 @@ void ExAcquireReadWriteLockExclusive(pointer_t<X_ERWLOCK> lock_ptr) {
|
||||||
DECLARE_XBOXKRNL_EXPORT3(ExAcquireReadWriteLockExclusive, kThreading,
|
DECLARE_XBOXKRNL_EXPORT3(ExAcquireReadWriteLockExclusive, kThreading,
|
||||||
kImplemented, kBlocking, kSketchy);
|
kImplemented, kBlocking, kSketchy);
|
||||||
|
|
||||||
|
void ExAcquireReadWriteLockShared(pointer_t<X_ERWLOCK> lock_ptr) {
|
||||||
|
XELOGD("ExAcquireReadWriteLockShared"); // lock_ptr:(:X)", lock_ptr);
|
||||||
|
auto old_irql = xeKeKfAcquireSpinLock(&lock_ptr->spin_lock);
|
||||||
|
lock_ptr->lock_count++;
|
||||||
|
xeKeKfReleaseSpinLock(&lock_ptr->spin_lock, old_irql);
|
||||||
|
|
||||||
|
if (!lock_ptr->lock_count) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
lock_ptr->writers_waiting_count++;
|
||||||
|
xeKeWaitForSingleObject(&lock_ptr->writer_event, 0, 0, 1, nullptr);
|
||||||
|
|
||||||
|
}
|
||||||
|
DECLARE_XBOXKRNL_EXPORT3(ExAcquireReadWriteLockShared, kThreading,
|
||||||
|
kImplemented, kBlocking, kHighFrequency);
|
||||||
|
|
||||||
|
void ExTryToAcquireReadWriteLockShared(pointer_t<X_ERWLOCK> lock_ptr) {
|
||||||
|
XELOGD("ExAcquireReadWriteLockShared"); // lock_ptr:(:X)", lock_ptr);
|
||||||
|
auto old_irql = xeKeKfAcquireSpinLock(&lock_ptr->spin_lock);
|
||||||
|
lock_ptr->lock_count++;
|
||||||
|
xeKeKfReleaseSpinLock(&lock_ptr->spin_lock, old_irql);
|
||||||
|
|
||||||
|
if (!lock_ptr->lock_count) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
lock_ptr->writers_waiting_count++;
|
||||||
|
xeKeWaitForSingleObject(&lock_ptr->writer_event, 0, 0, 1, nullptr);
|
||||||
|
|
||||||
|
}
|
||||||
|
DECLARE_XBOXKRNL_EXPORT3(ExTryToAcquireReadWriteLockShared, kThreading,
|
||||||
|
kImplemented, kBlocking, kHighFrequency);
|
||||||
|
|
||||||
void ExReleaseReadWriteLock(pointer_t<X_ERWLOCK> lock_ptr) {
|
void ExReleaseReadWriteLock(pointer_t<X_ERWLOCK> lock_ptr) {
|
||||||
|
|
||||||
|
XELOGD("ExReleaseReadWriteLock"); // lock_ptr: (:X)", lock_ptr);
|
||||||
auto old_irql = xeKeKfAcquireSpinLock(&lock_ptr->spin_lock);
|
auto old_irql = xeKeKfAcquireSpinLock(&lock_ptr->spin_lock);
|
||||||
lock_ptr->lock_count--;
|
lock_ptr->lock_count--;
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue