VirtualBox

Changeset 28224 in vbox for trunk/src/VBox


Ignore:
Timestamp:
Apr 12, 2010 7:45:20 PM (15 years ago)
Author:
vboxsync
Message:

AsyncCompletion: Fix hang on OS X

Location:
trunk/src/VBox/VMM
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/VMM/PDMAsyncCompletionFileInternal.h

    r28065 r28224  
    159159    /** Number of requests active currently. */
    160160    unsigned                               cRequestsActive;
     161    /** Number of maximum requests active. */
     162    uint32_t                               cRequestsActiveMax;
    161163    /** Pointer to an array of free async I/O request handles. */
    162164    RTFILEAIOREQ                          *pahReqsFree;
  • trunk/src/VBox/VMM/PDMAsyncCompletionFileNormal.cpp

    r28045 r28224  
    4343                                                PPDMASYNCCOMPLETIONENDPOINTFILE pEndpoint);
    4444
     45static PPDMACTASKFILE pdmacFileAioMgrNormalRangeLockFree(PPDMACEPFILEMGR pAioMgr,
     46                                                         PPDMASYNCCOMPLETIONENDPOINTFILE pEndpoint,
     47                                                         PPDMACFILERANGELOCK pRangeLock);
    4548
    4649int pdmacFileAioMgrNormalInit(PPDMACEPFILEMGR pAioMgr)
    4750{
    4851    int rc = VINF_SUCCESS;
     52
     53    pAioMgr->cRequestsActiveMax = PDMACEPFILEMGR_REQS_MAX;
    4954
    5055    rc = RTFileAioCtxCreate(&pAioMgr->hAioCtx, RTFILEAIO_UNLIMITED_REQS);
     
    5762        pAioMgr->iFreeEntryNext = 0;
    5863        pAioMgr->iFreeReqNext   = 0;
    59         pAioMgr->cReqEntries    = PDMACEPFILEMGR_REQS_MAX + 1;
     64        pAioMgr->cReqEntries    = pAioMgr->cRequestsActiveMax + 1;
    6065        pAioMgr->pahReqsFree    = (RTFILEAIOREQ *)RTMemAllocZ(pAioMgr->cReqEntries * sizeof(RTFILEAIOREQ));
    6166
     
    421426
    422427                    PPDMACTASKFILE pTask = (PPDMACTASKFILE)RTFileAioReqGetUser(pahReqs[i]);
     428                    PPDMACTASKFILE pTasksWaiting;
    423429
    424430                    /* Put the entry on the free array */
     
    426432                    pAioMgr->iFreeEntryNext = (pAioMgr->iFreeEntryNext + 1) % pAioMgr->cReqEntries;
    427433
     434                    if (pTask->fBounceBuffer)
     435                        RTMemFree(pTask->pvBounceBuffer);
     436
     437                    pTask->fPrefetch = false;
     438
     439                    /* Free the lock and process pending tasks if neccessary */
     440                    pTasksWaiting = pdmacFileAioMgrNormalRangeLockFree(pAioMgr, pEndpoint, pTask->pRangeLock);
     441
    428442                    pdmacFileAioMgrEpAddTask(pEndpoint, pTask);
     443                    pdmacFileAioMgrEpAddTaskList(pEndpoint, pTasksWaiting);
     444
    429445                    pAioMgr->cRequestsActive--;
    430446                    pEndpoint->AioMgr.cRequestsActive--;
    431447                }
    432             }
     448
     449                pAioMgr->cRequestsActiveMax = pAioMgr->cRequestsActive;
     450            }
     451           
    433452            LogFlow(("Removed requests. I/O manager has a total of %d active requests now\n", pAioMgr->cRequestsActive));
    434453            LogFlow(("Endpoint has a total of %d active requests now\n", pEndpoint->AioMgr.cRequestsActive));
     
    549568}
    550569
    551 static int pdmacFileAioMgrNormalRangeLockFree(PPDMACEPFILEMGR pAioMgr,
    552                                               PPDMASYNCCOMPLETIONENDPOINTFILE pEndpoint,
    553                                               PPDMACFILERANGELOCK pRangeLock)
     570static PPDMACTASKFILE pdmacFileAioMgrNormalRangeLockFree(PPDMACEPFILEMGR pAioMgr,
     571                                                         PPDMASYNCCOMPLETIONENDPOINTFILE pEndpoint,
     572                                                         PPDMACFILERANGELOCK pRangeLock)
    554573{
    555574    PPDMACTASKFILE pTasksWaitingHead;
     
    564583    RTMemCacheFree(pAioMgr->hMemCacheRangeLocks, pRangeLock);
    565584
    566     return pdmacFileAioMgrNormalProcessTaskList(pTasksWaitingHead, pAioMgr, pEndpoint);
     585    return pTasksWaitingHead;
    567586}
    568587
     
    783802    RTFILEAIOREQ  apReqs[20];
    784803    unsigned      cRequests = 0;
    785     unsigned      cMaxRequests = PDMACEPFILEMGR_REQS_MAX - pAioMgr->cRequestsActive;
     804    unsigned      cMaxRequests = pAioMgr->cRequestsActiveMax - pAioMgr->cRequestsActive;
    786805    int           rc = VINF_SUCCESS;
    787806
     
    792811    while (   pTaskHead
    793812           && !pEndpoint->pFlushReq
    794            && (cMaxRequests > 0)
     813           && (pAioMgr->cRequestsActive + cRequests < pAioMgr->cRequestsActiveMax)
    795814           && RT_SUCCESS(rc))
    796815    {
     
    845864                    apReqs[cRequests] = hReq;
    846865                    pEndpoint->AioMgr.cReqsProcessed++;
    847                     cMaxRequests--;
    848866                    cRequests++;
    849867                    if (cRequests == RT_ELEMENTS(apReqs))
     
    874892        pdmacFileAioMgrEpAddTaskList(pEndpoint, pTaskHead);
    875893
    876         if (RT_UNLIKELY(  !cMaxRequests
    877                        && !pEndpoint->pFlushReq
    878                        && !pAioMgr->fBwLimitReached))
     894        if (RT_UNLIKELY(   pAioMgr->cRequestsActiveMax == pAioMgr->cRequestsActive
     895                        && !pEndpoint->pFlushReq
     896                        && !pAioMgr->fBwLimitReached))
    879897        {
    880898            /*
     
    11021120    int rcReq            = RTFileAioReqGetRC(hReq, &cbTransfered);
    11031121    PPDMACTASKFILE pTask = (PPDMACTASKFILE)RTFileAioReqGetUser(hReq);
     1122    PPDMACTASKFILE pTasksWaiting;
    11041123
    11051124    pEndpoint = pTask->pEndpoint;
     
    11181137
    11191138        /* Free the lock and process pending tasks if neccessary */
    1120         pdmacFileAioMgrNormalRangeLockFree(pAioMgr, pEndpoint, pTask->pRangeLock);
     1139        pTasksWaiting = pdmacFileAioMgrNormalRangeLockFree(pAioMgr, pEndpoint, pTask->pRangeLock);
     1140        rc = pdmacFileAioMgrNormalProcessTaskList(pTasksWaiting, pAioMgr, pEndpoint);
     1141        AssertRC(rc);
    11211142
    11221143        pAioMgr->cRequestsActive--;
     
    12161237
    12171238            /* Free the lock and process pending tasks if neccessary */
    1218             pdmacFileAioMgrNormalRangeLockFree(pAioMgr, pEndpoint, pTask->pRangeLock);
     1239            pTasksWaiting = pdmacFileAioMgrNormalRangeLockFree(pAioMgr, pEndpoint, pTask->pRangeLock);
     1240            rc = pdmacFileAioMgrNormalProcessTaskList(pTasksWaiting, pAioMgr, pEndpoint);
     1241            AssertRC(rc);
    12191242
    12201243            /* Call completion callback */
Note: See TracChangeset for help on using the changeset viewer.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette