VirtualBox

Changeset 26147 in vbox for trunk/src/VBox/Devices


Ignore:
Timestamp:
Feb 2, 2010 1:55:20 PM (15 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
57156
Message:

AsyncCompletion: Fix incorrect count of outstanding write tasks. Fixes hangs during flush requests. Return VINF_AIO_TASK_PENDING if data needs to be read from the file

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Devices/Storage/DrvVD.cpp

    r26001 r26147  
    353353
    354354    Assert(!pStorageBackend->fSyncIoPending);
    355     pStorageBackend->fSyncIoPending = true;
     355    ASMAtomicXchgBool(&pStorageBackend->fSyncIoPending, true);
    356356    DataSeg.cbSeg = cbRead;
    357357    DataSeg.pvSeg = pvBuf;
     
    361361        return rc;
    362362
    363     /* Wait */
    364     rc = RTSemEventWait(pStorageBackend->EventSem, RT_INDEFINITE_WAIT);
    365     AssertRC(rc);
     363    if (rc == VINF_AIO_TASK_PENDING)
     364    {
     365        /* Wait */
     366        rc = RTSemEventWait(pStorageBackend->EventSem, RT_INDEFINITE_WAIT);
     367        AssertRC(rc);
     368    }
     369    else
     370        ASMAtomicXchgBool(&pStorageBackend->fSyncIoPending, false);
    366371
    367372    if (pcbRead)
     
    380385
    381386    Assert(!pStorageBackend->fSyncIoPending);
    382     pStorageBackend->fSyncIoPending = true;
     387    ASMAtomicXchgBool(&pStorageBackend->fSyncIoPending, true);
    383388    DataSeg.cbSeg = cbWrite;
    384389    DataSeg.pvSeg = (void *)pvBuf;
     
    388393        return rc;
    389394
    390     /* Wait */
    391     rc = RTSemEventWait(pStorageBackend->EventSem, RT_INDEFINITE_WAIT);
    392     AssertRC(rc);
     395    if (rc == VINF_AIO_TASK_PENDING)
     396    {
     397        /* Wait */
     398        rc = RTSemEventWait(pStorageBackend->EventSem, RT_INDEFINITE_WAIT);
     399        AssertRC(rc);
     400    }
     401    else
     402        ASMAtomicXchgBool(&pStorageBackend->fSyncIoPending, false);
    393403
    394404    if (pcbWritten)
     
    405415
    406416    Assert(!pStorageBackend->fSyncIoPending);
    407     pStorageBackend->fSyncIoPending = true;
     417    ASMAtomicXchgBool(&pStorageBackend->fSyncIoPending, true);
    408418
    409419    int rc = PDMR3AsyncCompletionEpFlush(pStorageBackend->pEndpoint, NULL, &pTask);
     
    411421        return rc;
    412422
    413     /* Wait */
    414     rc = RTSemEventWait(pStorageBackend->EventSem, RT_INDEFINITE_WAIT);
    415     AssertRC(rc);
     423    if (rc == VINF_AIO_TASK_PENDING)
     424    {
     425        /* Wait */
     426        rc = RTSemEventWait(pStorageBackend->EventSem, RT_INDEFINITE_WAIT);
     427        AssertRC(rc);
     428    }
     429    else
     430        ASMAtomicXchgBool(&pStorageBackend->fSyncIoPending, false);
    416431
    417432    return VINF_SUCCESS;
     
    11041119                break;
    11051120            }
    1106             rc = CFGMR3QueryBoolDef(pCurNode, "UseNewIo", &fUseNewIo, false);
     1121            rc = CFGMR3QueryBoolDef(pCurNode, "UseNewIo", &fUseNewIo, true);
    11071122            if (RT_FAILURE(rc))
    11081123            {
     
    12481263        if (rc == VERR_NOT_SUPPORTED)
    12491264        {
    1250             /* Seems async I/O is not supported by the backend, open in normal mode. */
    12511265            pThis->fAsyncIOSupported = false;
    12521266            uOpenFlags &= ~VD_OPEN_FLAGS_ASYNC_IO;
Note: See TracChangeset for help on using the changeset viewer.

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