本文整理汇总了C++中vm::ptr::value方法的典型用法代码示例。如果您正苦于以下问题:C++ ptr::value方法的具体用法?C++ ptr::value怎么用?C++ ptr::value使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类vm::ptr
的用法示例。
在下文中一共展示了ptr::value方法的1个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: sceKernelWaitEventFlag
s32 sceKernelWaitEventFlag(ARMv7Thread& context, s32 evfId, u32 bitPattern, u32 waitMode, vm::ptr<u32> pResultPat, vm::ptr<u32> pTimeout)
{
sceLibKernel.Error("sceKernelWaitEventFlag(evfId=0x%x, bitPattern=0x%x, waitMode=0x%x, pResultPat=*0x%x, pTimeout=*0x%x)", evfId, bitPattern, waitMode, pResultPat, pTimeout);
const u64 start_time = pTimeout ? get_system_time() : 0;
const u32 timeout = pTimeout ? pTimeout->value() : 0;
const auto evf = idm::get<psv_event_flag_t>(evfId);
if (!evf)
{
return SCE_KERNEL_ERROR_INVALID_UID;
}
std::unique_lock<std::mutex> lock(evf->mutex);
const u32 result = evf->pattern.atomic_op(event_flag_try_poll, bitPattern, waitMode);
if (event_flag_test(result, bitPattern, waitMode))
{
if (pResultPat) *pResultPat = result;
return SCE_OK;
}
// fixup register values for external use
context.GPR[1] = bitPattern;
context.GPR[2] = waitMode;
// add waiter; attributes are ignored in current implementation
sleep_queue_entry_t waiter(context, evf->sq);
while (!context.unsignal())
{
CHECK_EMU_STATUS;
if (pTimeout)
{
const u64 passed = get_system_time() - start_time;
if (passed >= timeout)
{
context.GPR[0] = SCE_KERNEL_ERROR_WAIT_TIMEOUT;
context.GPR[1] = evf->pattern;
break;
}
context.cv.wait_for(lock, std::chrono::microseconds(timeout - passed));
}
else
{
context.cv.wait(lock);
}
}
if (pResultPat) *pResultPat = context.GPR[1];
if (pTimeout) *pTimeout = static_cast<u32>(std::max<s64>(0, timeout - (get_system_time() - start_time)));
return context.GPR[0];
}