#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 ppu_thread* 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)) { } lv2_cond(utils::serial& ar); static std::shared_ptr load(utils::serial& ar); void save(utils::serial& ar); CellError on_id_create(); }; 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);