static DECLCALLBACK(int) tstSemPingPongThread(RTTHREAD hThread, void *pvPP) { int rc; PRTPINGPONG pPP = (PRTPINGPONG)pvPP; for (uint32_t i = 0; i < TSTSEMPINGPONG_ITERATIONS; i++) { if (!RTSemPongShouldWait(pPP)) { ASMAtomicIncU32(&g_cErrors); RTPrintf("tstSemPingPong: ERROR - RTSemPongShouldWait returned false before RTSemPongWait.\n"); } rc = RTSemPongWait(pPP, RT_INDEFINITE_WAIT); if (RT_FAILURE(rc)) { ASMAtomicIncU32(&g_cErrors); RTPrintf("tstSemPingPong: ERROR - RTSemPongWait -> %Rrc\n", rc); break; } if (!RTSemPongIsSpeaker(pPP)) { ASMAtomicIncU32(&g_cErrors); RTPrintf("tstSemPingPong: ERROR - RTSemPongIsSpeaker returned false before RTSemPong.\n"); } rc = RTSemPong(pPP); if (RT_FAILURE(rc)) { ASMAtomicIncU32(&g_cErrors); RTPrintf("tstSemPingPong: ERROR - RTSemPong -> %Rrc\n", rc); break; } } return rc; }
/** * Checks if the debugger can wait for events or not. * * This function is only used by lazy, multiplexing debuggers. :-) * * @returns True if waitable. * @returns False if not waitable. * @param pVM Pointer to the VM. */ VMMR3DECL(bool) DBGFR3CanWait(PVM pVM) { AssertReturn(pVM->dbgf.s.fAttached, false); return RTSemPongShouldWait(&pVM->dbgf.s.PingPong); }