#pragma once #include "sys_sync.h" #include "sys_mutex.h" struct lv2_mutex; struct sys_cond_attribute_t { be_t pshared; be_t flags; be_t ipc_key; union { nse_t name_u64; char name[sizeof(u64)]; }; }; struct lv2_cond final : lv2_obj { static const u32 id_base = 0x86000000; const u32 shared; const s32 flags; const u64 key; const u64 name; const u32 mtx_id; std::shared_ptr mutex; // Associated Mutex atomic_t waiters{0}; std::deque sq; lv2_cond(u32 shared, s32 flags, u64 key, u64 name, u32 mtx_id, std::shared_ptr mutex) : shared(shared) , flags(flags) , key(key) , name(name) , mtx_id(mtx_id) , mutex(std::move(mutex)) { } CellError on_id_create() { if (!mutex->obj_count.fetch_op([](typename lv2_mutex::count_info& info) { if (info.mutex_count) return info.cond_count++, true; return false; }).second) { // Mutex has been destroyed, cannot create conditional variable return CELL_ESRCH; } return {}; } }; class ppu_thread; // Syscalls error_code sys_cond_create(ppu_thread& ppu, vm::ptr cond_id, u32 mutex_id, vm::ptr attr); error_code sys_cond_destroy(ppu_thread& ppu, u32 cond_id); error_code sys_cond_wait(ppu_thread& ppu, u32 cond_id, u64 timeout); error_code sys_cond_signal(ppu_thread& ppu, u32 cond_id); error_code sys_cond_signal_all(ppu_thread& ppu, u32 cond_id); error_code sys_cond_signal_to(ppu_thread& ppu, u32 cond_id, u32 thread_id);