Lines Matching defs:pAioMgr

42                                                 PPDMACEPFILEMGR pAioMgr,
45 static PPDMACTASKFILE pdmacFileAioMgrNormalRangeLockFree(PPDMACEPFILEMGR pAioMgr,
49 static void pdmacFileAioMgrNormalReqCompleteRc(PPDMACEPFILEMGR pAioMgr, RTFILEAIOREQ hReq,
53 int pdmacFileAioMgrNormalInit(PPDMACEPFILEMGR pAioMgr)
55 pAioMgr->cRequestsActiveMax = PDMACEPFILEMGR_REQS_STEP;
57 int rc = RTFileAioCtxCreate(&pAioMgr->hAioCtx, RTFILEAIO_UNLIMITED_REQS, 0 /* fFlags */);
59 rc = RTFileAioCtxCreate(&pAioMgr->hAioCtx, pAioMgr->cRequestsActiveMax, 0 /* fFlags */);
64 pAioMgr->iFreeEntry = 0;
65 pAioMgr->cReqEntries = pAioMgr->cRequestsActiveMax;
66 pAioMgr->pahReqsFree = (RTFILEAIOREQ *)RTMemAllocZ(pAioMgr->cReqEntries * sizeof(RTFILEAIOREQ));
68 if (pAioMgr->pahReqsFree)
71 rc = RTMemCacheCreate(&pAioMgr->hMemCacheRangeLocks, sizeof(PDMACFILERANGELOCK),
76 RTMemFree(pAioMgr->pahReqsFree);
80 RTFileAioCtxDestroy(pAioMgr->hAioCtx);
88 void pdmacFileAioMgrNormalDestroy(PPDMACEPFILEMGR pAioMgr)
90 RTFileAioCtxDestroy(pAioMgr->hAioCtx);
92 while (pAioMgr->iFreeEntry > 0)
94 pAioMgr->iFreeEntry--;
95 Assert(pAioMgr->pahReqsFree[pAioMgr->iFreeEntry] != NIL_RTFILEAIOREQ);
96 RTFileAioReqDestroy(pAioMgr->pahReqsFree[pAioMgr->iFreeEntry]);
99 RTMemFree(pAioMgr->pahReqsFree);
100 RTMemCacheDestroy(pAioMgr->hMemCacheRangeLocks);
107 static void pdmacFileAioMgrNormalEndpointsSortByLoad(PPDMACEPFILEMGR pAioMgr)
111 pEpPrev = pAioMgr->pEndpointsHead;
126 pAioMgr->pEndpointsHead = pNext;
139 pNext = pAioMgr->pEndpointsHead;
150 pAioMgr->pEndpointsHead = pEpCurr;
158 pEpCurr = pAioMgr->pEndpointsHead;
176 AssertMsg(cEndpoints == pAioMgr->cEndpoints, ("Endpoints lost during sort!\n"));
193 PPDMACEPFILEMGR pAioMgr = pEndpointRemove->pAioMgr;
195 pAioMgr->cEndpoints--;
200 pAioMgr->pEndpointsHead = pNext;
222 static bool pdmacFileAioMgrNormalIsBalancePossible(PPDMACEPFILEMGR pAioMgr)
225 if (pAioMgr->cEndpoints == 1)
231 PPDMASYNCCOMPLETIONENDPOINTFILE pCurr = pAioMgr->pEndpointsHead;
249 * @param pAioMgr The I/O manager with high I/O load.
251 static void pdmacFileAioMgrNormalBalanceLoad(PPDMACEPFILEMGR pAioMgr)
256 if (pdmacFileAioMgrNormalIsBalancePossible(pAioMgr))
258 PPDMASYNCCOMPLETIONEPCLASSFILE pEpClassFile = (PPDMASYNCCOMPLETIONEPCLASSFILE)pAioMgr->pEndpointsHead->Core.pEpClass;
265 pdmacFileAioMgrNormalEndpointsSortByLoad(pAioMgr);
268 unsigned cReqsHere = pAioMgr->pEndpointsHead->AioMgr.cReqsPerSec;
270 PPDMASYNCCOMPLETIONENDPOINTFILE pCurr = pAioMgr->pEndpointsHead->AioMgr.pEndpointNext;
327 * @param pAioMgr The I/O manager to grow.
329 static int pdmacFileAioMgrNormalGrow(PPDMACEPFILEMGR pAioMgr)
331 LogFlowFunc(("pAioMgr=%#p\n", pAioMgr));
333 AssertMsg( pAioMgr->enmState == PDMACEPFILEMGRSTATE_GROWING
334 && !pAioMgr->cRequestsActive,
342 PPDMASYNCCOMPLETIONENDPOINTFILE pCurr = pAioMgr->pEndpointsHead;
354 pAioMgr->cRequestsActiveMax += PDMACEPFILEMGR_REQS_STEP;
359 rc = RTFileAioCtxCreate(&hAioCtxNew, pAioMgr->cRequestsActiveMax, 0 /* fFlags */);
364 rc = RTFileAioCtxDestroy(pAioMgr->hAioCtx);
367 pAioMgr->hAioCtx = hAioCtxNew;
370 uint32_t cReqEntriesNew = pAioMgr->cRequestsActiveMax + 1;
376 for (uint32_t iReq = 0; iReq < pAioMgr->cReqEntries; iReq++)
377 pahReqNew[iReq] = pAioMgr->pahReqsFree[iReq];
379 RTMemFree(pAioMgr->pahReqsFree);
380 pAioMgr->pahReqsFree = pahReqNew;
381 pAioMgr->cReqEntries = cReqEntriesNew;
383 pAioMgr->cRequestsActiveMax));
391 pCurr = pAioMgr->pEndpointsHead;
394 rc = RTFileAioCtxAssociateWithFile(pAioMgr->hAioCtx, pCurr->hFile);
404 pAioMgr->cRequestsActiveMax -= PDMACEPFILEMGR_REQS_STEP;
407 pAioMgr->enmState = PDMACEPFILEMGRSTATE_RUNNING;
435 * @param pAioMgr The I/O manager the error occurred on.
438 static int pdmacFileAioMgrNormalErrorHandler(PPDMACEPFILEMGR pAioMgr, int rc, RT_SRC_POS_DECL)
441 pAioMgr, rc));
445 PPDMASYNCCOMPLETIONEPCLASSFILE pEpClassFile = (PPDMASYNCCOMPLETIONEPCLASSFILE)pAioMgr->pEndpointsHead->Core.pEpClass;
447 pAioMgr->enmState = PDMACEPFILEMGRSTATE_FAULT;
504 * @param pAioMgr The I/O manager.
506 static RTFILEAIOREQ pdmacFileAioMgrNormalRequestAlloc(PPDMACEPFILEMGR pAioMgr)
510 if (pAioMgr->iFreeEntry > 0)
512 pAioMgr->iFreeEntry--;
513 hReq = pAioMgr->pahReqsFree[pAioMgr->iFreeEntry];
514 pAioMgr->pahReqsFree[pAioMgr->iFreeEntry] = NIL_RTFILEAIOREQ;
530 * @param pAioMgr The I/O manager.
533 static void pdmacFileAioMgrNormalRequestFree(PPDMACEPFILEMGR pAioMgr, RTFILEAIOREQ hReq)
535 Assert(pAioMgr->iFreeEntry < pAioMgr->cReqEntries);
536 Assert(pAioMgr->pahReqsFree[pAioMgr->iFreeEntry] == NIL_RTFILEAIOREQ);
538 pAioMgr->pahReqsFree[pAioMgr->iFreeEntry] = hReq;
539 pAioMgr->iFreeEntry++;
545 static int pdmacFileAioMgrNormalReqsEnqueue(PPDMACEPFILEMGR pAioMgr,
549 pAioMgr->cRequestsActive += cReqs;
552 LogFlow(("Enqueuing %d requests. I/O manager has a total of %d active requests now\n", cReqs, pAioMgr->cRequestsActive));
555 int rc = RTFileAioCtxSubmit(pAioMgr->hAioCtx, pahReqs, cReqs);
573 pAioMgr->cRequestsActive--;
585 pAioMgr->cRequestsActiveMax = pAioMgr->cRequestsActive;
592 pAioMgr->cRequestsActive));
595 LogFlow(("Removed requests. I/O manager has a total of %u active requests now\n", pAioMgr->cRequestsActive));
609 rc = pdmacFileAioMgrNormalReqsEnqueue(pAioMgr, pEndpoint, &pahReqs[i], 1);
613 pdmacFileAioMgrNormalReqCompleteRc(pAioMgr, pahReqs[i], rcReq, 0);
618 && !pAioMgr->cRequestsActive
691 static int pdmacFileAioMgrNormalRangeLock(PPDMACEPFILEMGR pAioMgr,
696 LogFlowFunc(("pAioMgr=%#p pEndpoint=%#p offStart=%RTfoff cbRange=%zu pTask=%#p\n",
697 pAioMgr, pEndpoint, offStart, cbRange, pTask));
713 PPDMACFILERANGELOCK pRangeLock = (PPDMACFILERANGELOCK)RTMemCacheAlloc(pAioMgr->hMemCacheRangeLocks);
735 static PPDMACTASKFILE pdmacFileAioMgrNormalRangeLockFree(PPDMACEPFILEMGR pAioMgr,
741 LogFlowFunc(("pAioMgr=%#p pEndpoint=%#p pRangeLock=%#p\n",
742 pAioMgr, pEndpoint, pRangeLock));
754 RTMemCacheFree(pAioMgr->hMemCacheRangeLocks, pRangeLock);
760 static int pdmacFileAioMgrNormalTaskPrepareBuffered(PPDMACEPFILEMGR pAioMgr,
796 RTFILEAIOREQ hReq = pdmacFileAioMgrNormalRequestAlloc(pAioMgr);
818 rc = pdmacFileAioMgrNormalRangeLock(pAioMgr, pEndpoint, pTask->Off,
834 static int pdmacFileAioMgrNormalTaskPrepareNonBuffered(PPDMACEPFILEMGR pAioMgr,
882 RTFILEAIOREQ hReq = pdmacFileAioMgrNormalRequestAlloc(pAioMgr);
950 rc = pdmacFileAioMgrNormalRangeLock(pAioMgr, pEndpoint, offStart, cbToTransfer, pTask, fAlignedReq);
971 PPDMACEPFILEMGR pAioMgr,
984 && (pAioMgr->cRequestsActive + cRequests < pAioMgr->cRequestsActiveMax)
992 pAioMgr->msBwLimitExpired = RT_MIN(pAioMgr->msBwLimitExpired, msWhenNext);
1011 RTFILEAIOREQ hReq = pdmacFileAioMgrNormalRequestAlloc(pAioMgr);
1021 pdmacFileAioMgrNormalRequestFree(pAioMgr, hReq);
1054 rc = pdmacFileAioMgrNormalTaskPrepareBuffered(pAioMgr, pEndpoint, pCurr, &hReq);
1056 rc = pdmacFileAioMgrNormalTaskPrepareNonBuffered(pAioMgr, pEndpoint, pCurr, &hReq);
1084 rc = pdmacFileAioMgrNormalReqsEnqueue(pAioMgr, pEndpoint, apReqs, cRequests);
1093 rc = pdmacFileAioMgrNormalReqsEnqueue(pAioMgr, pEndpoint, apReqs, cRequests);
1103 if (RT_UNLIKELY( pAioMgr->cRequestsActiveMax == pAioMgr->cRequestsActive
1112 pdmacFileAioMgrNormalBalanceLoad(pAioMgr);
1115 pAioMgr->enmState = PDMACEPFILEMGRSTATE_GROWING;
1133 * @param pAioMgr The async I/O manager for the endpoint
1136 static int pdmacFileAioMgrNormalQueueReqs(PPDMACEPFILEMGR pAioMgr,
1159 rc = pdmacFileAioMgrNormalProcessTaskList(pTasksHead, pAioMgr, pEndpoint);
1169 rc = pdmacFileAioMgrNormalProcessTaskList(pTasksHead, pAioMgr, pEndpoint);
1177 static int pdmacFileAioMgrNormalProcessBlockingEvent(PPDMACEPFILEMGR pAioMgr)
1184 Assert(pAioMgr->fBlockingEventPending);
1186 switch (pAioMgr->enmBlockingEvent)
1190 PPDMASYNCCOMPLETIONENDPOINTFILE pEndpointNew = ASMAtomicReadPtrT(&pAioMgr->BlockingEventData.AddEndpoint.pEndpoint, PPDMASYNCCOMPLETIONENDPOINTFILE);
1195 pEndpointNew->AioMgr.pEndpointNext = pAioMgr->pEndpointsHead;
1197 if (pAioMgr->pEndpointsHead)
1198 pAioMgr->pEndpointsHead->AioMgr.pEndpointPrev = pEndpointNew;
1199 pAioMgr->pEndpointsHead = pEndpointNew;
1202 rc = RTFileAioCtxAssociateWithFile(pAioMgr->hAioCtx, pEndpointNew->hFile);
1204 pAioMgr->cEndpoints++;
1209 PPDMASYNCCOMPLETIONENDPOINTFILE pEndpointRemove = ASMAtomicReadPtrT(&pAioMgr->BlockingEventData.RemoveEndpoint.pEndpoint, PPDMASYNCCOMPLETIONENDPOINTFILE);
1218 PPDMASYNCCOMPLETIONENDPOINTFILE pEndpointClose = ASMAtomicReadPtrT(&pAioMgr->BlockingEventData.CloseEndpoint.pEndpoint, PPDMASYNCCOMPLETIONENDPOINTFILE);
1226 rc = pdmacFileAioMgrNormalQueueReqs(pAioMgr, pEndpointClose);
1239 pAioMgr->enmState = PDMACEPFILEMGRSTATE_SHUTDOWN;
1240 if (!pAioMgr->cRequestsActive)
1246 pAioMgr->enmState = PDMACEPFILEMGRSTATE_SUSPENDING;
1251 pAioMgr->enmState = PDMACEPFILEMGRSTATE_RUNNING;
1256 AssertReleaseMsgFailed(("Invalid event type %d\n", pAioMgr->enmBlockingEvent));
1261 ASMAtomicWriteBool(&pAioMgr->fBlockingEventPending, false);
1262 pAioMgr->enmBlockingEvent = PDMACEPFILEAIOMGRBLOCKINGEVENT_INVALID;
1266 rc = RTSemEventSignal(pAioMgr->EventSemBlock);
1278 * @param pAioMgr The I/O manager handle.
1280 static int pdmacFileAioMgrNormalCheckEndpoints(PPDMACEPFILEMGR pAioMgr)
1284 PPDMASYNCCOMPLETIONENDPOINTFILE pEndpoint = pAioMgr->pEndpointsHead;
1286 pAioMgr->msBwLimitExpired = RT_INDEFINITE_WAIT;
1294 rc = pdmacFileAioMgrNormalQueueReqs(pAioMgr, pEndpoint);
1313 Assert(pAioMgr->fBlockingEventPending);
1314 ASMAtomicWriteBool(&pAioMgr->fBlockingEventPending, false);
1318 rc = RTSemEventSignal(pAioMgr->EventSemBlock);
1332 static void pdmacFileAioMgrNormalReqComplete(PPDMACEPFILEMGR pAioMgr, RTFILEAIOREQ hReq)
1337 pdmacFileAioMgrNormalReqCompleteRc(pAioMgr, hReq, rcReq, cbTransfered);
1340 static void pdmacFileAioMgrNormalReqCompleteRc(PPDMACEPFILEMGR pAioMgr, RTFILEAIOREQ hReq,
1348 LogFlowFunc(("pAioMgr=%#p hReq=%#p\n", pAioMgr, hReq));
1354 pAioMgr->cRequestsActive--;
1367 pdmacFileAioMgrNormalRequestFree(pAioMgr, hReq);
1385 pTasksWaiting = pdmacFileAioMgrNormalRangeLockFree(pAioMgr, pEndpoint, pTask->pRangeLock);
1386 rc = pdmacFileAioMgrNormalProcessTaskList(pTasksWaiting, pAioMgr, pEndpoint);
1409 RTThreadGetName(pAioMgr->Thread), pTask, rcReq, pEndpoint->Core.pszUri));
1447 pdmacFileAioMgrNormalRequestFree(pAioMgr, hReq);
1504 rc = pdmacFileAioMgrNormalReqsEnqueue(pAioMgr, pEndpoint, &hReq, 1);
1533 rc = pdmacFileAioMgrNormalReqsEnqueue(pAioMgr, pEndpoint, &hReq, 1);
1549 pdmacFileAioMgrNormalRequestFree(pAioMgr, hReq);
1552 pTasksWaiting = pdmacFileAioMgrNormalRangeLockFree(pAioMgr, pEndpoint, pTask->pRangeLock);
1555 rc = pdmacFileAioMgrNormalProcessTaskList(pTasksWaiting, pAioMgr, pEndpoint);
1595 #define CHECK_RC(pAioMgr, rc) \
1598 int rc2 = pdmacFileAioMgrNormalErrorHandler(pAioMgr, rc, RT_SRC_POS);\
1612 PPDMACEPFILEMGR pAioMgr = (PPDMACEPFILEMGR)pvUser;
1616 while ( pAioMgr->enmState == PDMACEPFILEMGRSTATE_RUNNING
1617 || pAioMgr->enmState == PDMACEPFILEMGRSTATE_SUSPENDING
1618 || pAioMgr->enmState == PDMACEPFILEMGRSTATE_GROWING)
1620 if (!pAioMgr->cRequestsActive)
1622 ASMAtomicWriteBool(&pAioMgr->fWaitingEventSem, true);
1623 if (!ASMAtomicReadBool(&pAioMgr->fWokenUp))
1624 rc = RTSemEventWait(pAioMgr->EventSem, pAioMgr->msBwLimitExpired);
1625 ASMAtomicWriteBool(&pAioMgr->fWaitingEventSem, false);
1629 ASMAtomicWriteBool(&pAioMgr->fWokenUp, false);
1633 if (pAioMgr->fBlockingEventPending)
1635 rc = pdmacFileAioMgrNormalProcessBlockingEvent(pAioMgr);
1636 CHECK_RC(pAioMgr, rc);
1639 if (RT_LIKELY( pAioMgr->enmState == PDMACEPFILEMGRSTATE_RUNNING
1640 || pAioMgr->enmState == PDMACEPFILEMGRSTATE_GROWING))
1643 rc = pdmacFileAioMgrNormalCheckEndpoints(pAioMgr);
1644 CHECK_RC(pAioMgr, rc);
1646 while (pAioMgr->cRequestsActive)
1652 if (pAioMgr->cRequestsActive > RT_ELEMENTS(apReqs))
1655 cReqsWait = pAioMgr->cRequestsActive;
1659 rc = RTFileAioCtxWait(pAioMgr->hAioCtx,
1664 CHECK_RC(pAioMgr, rc);
1669 pdmacFileAioMgrNormalReqComplete(pAioMgr, apReqs[i]);
1672 if (pAioMgr->fBlockingEventPending)
1674 rc = pdmacFileAioMgrNormalProcessBlockingEvent(pAioMgr);
1675 CHECK_RC(pAioMgr, rc);
1682 PPDMASYNCCOMPLETIONENDPOINTFILE pEndpointCurr = pAioMgr->pEndpointsHead;
1699 if (pAioMgr->enmState != PDMACEPFILEMGRSTATE_GROWING)
1701 rc = pdmacFileAioMgrNormalCheckEndpoints(pAioMgr);
1702 CHECK_RC(pAioMgr, rc);
1706 if (pAioMgr->enmState == PDMACEPFILEMGRSTATE_GROWING)
1708 rc = pdmacFileAioMgrNormalGrow(pAioMgr);
1710 Assert(pAioMgr->enmState == PDMACEPFILEMGRSTATE_RUNNING);
1712 rc = pdmacFileAioMgrNormalCheckEndpoints(pAioMgr);
1713 CHECK_RC(pAioMgr, rc);