From a19a13136c57096cf24555da59f7f41bdf76ad51 Mon Sep 17 00:00:00 2001 From: Nekotekina Date: Wed, 11 Mar 2015 13:39:54 +0300 Subject: [PATCH] Bugfix --- rpcs3/Emu/SysCalls/lv2/sys_cond.h | 2 +- rpcs3/Emu/SysCalls/lv2/sys_event_flag.h | 4 ++-- rpcs3/Emu/SysCalls/lv2/sys_lwcond.h | 3 +++ rpcs3/Emu/SysCalls/lv2/sys_lwmutex.cpp | 5 +++++ rpcs3/Emu/SysCalls/lv2/sys_lwmutex.h | 2 ++ 5 files changed, 13 insertions(+), 3 deletions(-) diff --git a/rpcs3/Emu/SysCalls/lv2/sys_cond.h b/rpcs3/Emu/SysCalls/lv2/sys_cond.h index fdb43631eb..eb9f3b5d40 100644 --- a/rpcs3/Emu/SysCalls/lv2/sys_cond.h +++ b/rpcs3/Emu/SysCalls/lv2/sys_cond.h @@ -29,8 +29,8 @@ struct cond_t cond_t(std::shared_ptr& mutex, u64 name) : mutex(mutex) , name(name) - , waiters(0) , signaled(0) + , waiters(0) { } }; diff --git a/rpcs3/Emu/SysCalls/lv2/sys_event_flag.h b/rpcs3/Emu/SysCalls/lv2/sys_event_flag.h index ee63ce8369..a470d6e496 100644 --- a/rpcs3/Emu/SysCalls/lv2/sys_event_flag.h +++ b/rpcs3/Emu/SysCalls/lv2/sys_event_flag.h @@ -29,12 +29,12 @@ struct sys_event_flag_attr struct event_flag_t { - std::atomic flags; - const u32 protocol; const s32 type; const u64 name; + std::atomic flags; + // TODO: use sleep queue, possibly remove condition variable std::condition_variable cv; std::atomic waiters; diff --git a/rpcs3/Emu/SysCalls/lv2/sys_lwcond.h b/rpcs3/Emu/SysCalls/lv2/sys_lwcond.h index 0f625300f8..8236cc2fe6 100644 --- a/rpcs3/Emu/SysCalls/lv2/sys_lwcond.h +++ b/rpcs3/Emu/SysCalls/lv2/sys_lwcond.h @@ -30,6 +30,9 @@ struct lwcond_t lwcond_t(u64 name) : name(name) + , signaled1(0) + , signaled2(0) + , waiters(0) { } }; diff --git a/rpcs3/Emu/SysCalls/lv2/sys_lwmutex.cpp b/rpcs3/Emu/SysCalls/lv2/sys_lwmutex.cpp index 8786b3836a..96d87ab0b4 100644 --- a/rpcs3/Emu/SysCalls/lv2/sys_lwmutex.cpp +++ b/rpcs3/Emu/SysCalls/lv2/sys_lwmutex.cpp @@ -143,6 +143,11 @@ s32 _sys_lwmutex_unlock(u32 lwmutex_id) return CELL_ESRCH; } + if (mutex->signaled) + { + sys_lwmutex.Fatal("_sys_lwmutex_unlock(lwmutex_id=%d): already signaled", lwmutex_id); + } + mutex->signaled++; mutex->cv.notify_one(); diff --git a/rpcs3/Emu/SysCalls/lv2/sys_lwmutex.h b/rpcs3/Emu/SysCalls/lv2/sys_lwmutex.h index 0b1471bc3c..f29e2866d6 100644 --- a/rpcs3/Emu/SysCalls/lv2/sys_lwmutex.h +++ b/rpcs3/Emu/SysCalls/lv2/sys_lwmutex.h @@ -81,6 +81,8 @@ struct lwmutex_t lwmutex_t(u32 protocol, u64 name) : protocol(protocol) , name(name) + , signaled(0) + , waiters(0) { } };