/** * Deals with any pending dummy request * * @returns true if no pending dummy request, false if still pending. * @param pThis The instance data. * @param cMillies The number of milliseconds to wait for any * pending request to finish. */ static bool drvscsiAsyncIOLoopNoPendingDummy(PDRVSCSI pThis, uint32_t cMillies) { if (!pThis->pPendingDummyReq) return true; int rc = RTReqWait(pThis->pPendingDummyReq, cMillies); if (RT_FAILURE(rc)) return false; RTReqRelease(pThis->pPendingDummyReq); pThis->pPendingDummyReq = NULL; return true; }
RTDECL(int) RTReqSubmit(PRTREQ hReq, RTMSINTERVAL cMillies) { LogFlow(("RTReqQueue: hReq=%p cMillies=%d\n", hReq, cMillies)); /* * Verify the supplied package. */ PRTREQINT pReq = hReq; AssertPtrReturn(pReq, VERR_INVALID_HANDLE); AssertReturn(pReq->u32Magic == RTREQ_MAGIC, VERR_INVALID_HANDLE); AssertMsgReturn(pReq->enmState == RTREQSTATE_ALLOCATED, ("%d\n", pReq->enmState), VERR_RT_REQUEST_STATE); AssertMsgReturn(pReq->uOwner.hQueue && !pReq->pNext && pReq->EventSem != NIL_RTSEMEVENT, ("Invalid request package! Anyone cooking their own packages???\n"), VERR_RT_REQUEST_INVALID_PACKAGE); AssertMsgReturn(pReq->enmType > RTREQTYPE_INVALID && pReq->enmType < RTREQTYPE_MAX, ("Invalid package type %d valid range %d-%d inclusively. This was verified on alloc too...\n", pReq->enmType, RTREQTYPE_INVALID + 1, RTREQTYPE_MAX - 1), VERR_RT_REQUEST_INVALID_TYPE); /* * Insert it. Donate the caller's reference if RTREQFLAGS_NO_WAIT is set, * otherwise retain another reference for the queue. */ pReq->uSubmitNanoTs = RTTimeNanoTS(); pReq->enmState = RTREQSTATE_QUEUED; unsigned fFlags = ((RTREQ volatile *)pReq)->fFlags; /* volatile paranoia */ if (!(fFlags & RTREQFLAGS_NO_WAIT)) RTReqRetain(pReq); if (!pReq->fPoolOrQueue) rtReqQueueSubmit(pReq->uOwner.hQueue, pReq); else rtReqPoolSubmit(pReq->uOwner.hPool, pReq); /* * Wait and return. */ int rc = VINF_SUCCESS; if (!(fFlags & RTREQFLAGS_NO_WAIT)) rc = RTReqWait(pReq, cMillies); LogFlow(("RTReqQueue: returns %Rrc\n", rc)); return rc; }