#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 u64 key; const u64 name; const u32 mtx_id; std::shared_ptr mutex; // Associated Mutex atomic_t waiters{0}; std::deque sq; lv2_cond(u64 key, u64 name, u32 mtx_id, std::shared_ptr mutex) : key(key) , name(name) , mtx_id(mtx_id) , mutex(std::move(mutex)) { } CellError on_id_create() { if (mutex->exists) { mutex->cond_count++; exists++; return {}; } // Mutex has been destroyed, cannot create conditional variable return CELL_ESRCH; } }; 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);