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) { } };