Exemple #1
0
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");
	}
}
Exemple #2
0
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++;
	}
}