void lv2_lwcond_t::notify(lv2_lock_t & lv2_lock, sleep_queue_t::value_type& thread, const std::shared_ptr<lv2_lwmutex_t>& mutex, bool mode2) { CHECK_LV2_LOCK(lv2_lock); auto& ppu = static_cast<PPUThread&>(*thread); ppu.GPR[3] = mode2; // set to return CELL_EBUSY if (!mode2) { if (!mutex->signaled) { return mutex->sq.emplace_back(thread); } mutex->signaled--; } if (!ppu.signal()) { throw EXCEPTION("Thread already signaled"); } }
void lv2_lwmutex_t::unlock(lv2_lock_t& lv2_lock) { CHECK_LV2_LOCK(lv2_lock); if (signaled) { throw EXCEPTION("Unexpected"); } if (sq.size()) { if (!sq.front()->signal()) { throw EXCEPTION("Thread already signaled"); } sq.pop_front(); } else { signaled++; } }