VirtualBox

Changeset 59538 in vbox for trunk/src/VBox/Devices/Storage


Ignore:
Timestamp:
Feb 1, 2016 10:33:38 AM (9 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
105332
Message:

Storage/DrvVD: Add methods to query suspended requests, will be used for saved state handling in the device emulations

File:
1 edited

Legend:

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

    r59536 r59538  
    30513051
    30523052/**
     3053 * Returns whether the VM is in a running state.
     3054 *
     3055 * @returns Flag indicating whether the VM is currently in a running state.
     3056 * @param   pThis     VBox disk container instance data.
     3057 */
     3058DECLINLINE(bool) drvvdMediaExIoReqIsVmRunning(PVBOXDISK pThis)
     3059{
     3060    VMSTATE enmVmState = PDMDrvHlpVMState(pThis->pDrvIns);
     3061    if (   enmVmState == VMSTATE_RESUMING
     3062        || enmVmState == VMSTATE_RUNNING
     3063        || enmVmState == VMSTATE_RUNNING_LS
     3064        || enmVmState == VMSTATE_RUNNING_FT
     3065        || enmVmState == VMSTATE_RESETTING
     3066        || enmVmState == VMSTATE_RESETTING_LS
     3067        || enmVmState == VMSTATE_SUSPENDING
     3068        || enmVmState == VMSTATE_SUSPENDING_LS
     3069        || enmVmState == VMSTATE_SUSPENDING_EXT_LS)
     3070        return true;
     3071
     3072    return false;
     3073}
     3074
     3075/**
    30533076 * @copydoc FNVDASYNCTRANSFERCOMPLETE
    30543077 */
     
    34043427    PVBOXDISK pThis = RT_FROM_MEMBER(pInterface, VBOXDISK, IMediaEx);
    34053428    return ASMAtomicReadU32(&pThis->cIoReqsActive);
     3429}
     3430
     3431/**
     3432 * @interface_method_impl{PDMIMEDIAEX,pfnIoReqGetSuspendedCount}
     3433 */
     3434static DECLCALLBACK(uint32_t) drvvdIoReqGetSuspendedCount(PPDMIMEDIAEX pInterface)
     3435{
     3436    PVBOXDISK pThis = RT_FROM_MEMBER(pInterface, VBOXDISK, IMediaEx);
     3437
     3438    AssertReturn(!drvvdMediaExIoReqIsVmRunning(pThis), 0);
     3439
     3440    uint32_t cIoReqSuspended = 0;
     3441    PPDMMEDIAEXIOREQINT pIoReq;
     3442    RTCritSectEnter(&pThis->CritSectIoReqRedo);
     3443    RTListForEach(&pThis->LstIoReqRedo, pIoReq, PDMMEDIAEXIOREQINT, NdLstWait)
     3444    {
     3445        cIoReqSuspended++;
     3446    }
     3447    RTCritSectLeave(&pThis->CritSectIoReqRedo);
     3448
     3449    return cIoReqSuspended;
     3450}
     3451
     3452/**
     3453 * @interface_method_impl{PDMIMEDIAEX,pfnIoReqQuerySuspendedFirst}
     3454 */
     3455static DECLCALLBACK(int) drvvdIoReqQuerySuspendedStart(PPDMIMEDIAEX pInterface, PPDMMEDIAEXIOREQ phIoReq,
     3456                                                       void **ppvIoReqAlloc)
     3457{
     3458    PVBOXDISK pThis = RT_FROM_MEMBER(pInterface, VBOXDISK, IMediaEx);
     3459
     3460    AssertReturn(!drvvdMediaExIoReqIsVmRunning(pThis), VERR_INVALID_STATE);
     3461    AssertReturn(!RTListIsEmpty(&pThis->LstIoReqRedo), VERR_NOT_FOUND);
     3462
     3463    RTCritSectEnter(&pThis->CritSectIoReqRedo);
     3464    PPDMMEDIAEXIOREQINT pIoReq = RTListGetFirst(&pThis->LstIoReqRedo, PDMMEDIAEXIOREQINT, NdLstWait);
     3465    *phIoReq       = pIoReq;
     3466    *ppvIoReqAlloc = &pIoReq->abAlloc[0];
     3467    RTCritSectLeave(&pThis->CritSectIoReqRedo);
     3468
     3469    return VINF_SUCCESS;
     3470}
     3471
     3472/**
     3473 * @interface_method_impl{PDMIMEDIAEX,pfnIoReqQuerySuspendedNext}
     3474 */
     3475static DECLCALLBACK(int) drvvdIoReqQuerySuspendedNext(PPDMIMEDIAEX pInterface, PDMMEDIAEXIOREQ hIoReq,
     3476                                                      PPDMMEDIAEXIOREQ phIoReqNext, void **ppvIoReqAllocNext)
     3477{
     3478    PVBOXDISK pThis = RT_FROM_MEMBER(pInterface, VBOXDISK, IMediaEx);
     3479    PPDMMEDIAEXIOREQINT pIoReq = hIoReq;
     3480
     3481    AssertReturn(!drvvdMediaExIoReqIsVmRunning(pThis), VERR_INVALID_STATE);
     3482    AssertPtrReturn(pIoReq, VERR_INVALID_HANDLE);
     3483    AssertReturn(!RTListNodeIsLast(&pThis->LstIoReqRedo, &pIoReq->NdLstWait), VERR_NOT_FOUND);
     3484
     3485    RTCritSectEnter(&pThis->CritSectIoReqRedo);
     3486    PPDMMEDIAEXIOREQINT pIoReqNext = RTListNodeGetNext(&pIoReq->NdLstWait, PDMMEDIAEXIOREQINT, NdLstWait);
     3487    *phIoReqNext       = pIoReqNext;
     3488    *ppvIoReqAllocNext = &pIoReqNext->abAlloc[0];
     3489    RTCritSectLeave(&pThis->CritSectIoReqRedo);
     3490
     3491    return VINF_SUCCESS;
    34063492}
    34073493
     
    39404026
    39414027    /* IMediaEx */
    3942     pThis->IMediaEx.pfnIoReqAllocSizeSet   = drvvdIoReqAllocSizeSet;
    3943     pThis->IMediaEx.pfnIoReqAlloc          = drvvdIoReqAlloc;
    3944     pThis->IMediaEx.pfnIoReqFree           = drvvdIoReqFree;
    3945     pThis->IMediaEx.pfnIoReqCancel         = drvvdIoReqCancel;
    3946     pThis->IMediaEx.pfnIoReqRead           = drvvdIoReqRead;
    3947     pThis->IMediaEx.pfnIoReqWrite          = drvvdIoReqWrite;
    3948     pThis->IMediaEx.pfnIoReqFlush          = drvvdIoReqFlush;
    3949     pThis->IMediaEx.pfnIoReqDiscard        = drvvdIoReqDiscard;
    3950     pThis->IMediaEx.pfnIoReqGetActiveCount = drvvdIoReqGetActiveCount;
     4028    pThis->IMediaEx.pfnIoReqAllocSizeSet        = drvvdIoReqAllocSizeSet;
     4029    pThis->IMediaEx.pfnIoReqAlloc               = drvvdIoReqAlloc;
     4030    pThis->IMediaEx.pfnIoReqFree                = drvvdIoReqFree;
     4031    pThis->IMediaEx.pfnIoReqCancel              = drvvdIoReqCancel;
     4032    pThis->IMediaEx.pfnIoReqRead                = drvvdIoReqRead;
     4033    pThis->IMediaEx.pfnIoReqWrite               = drvvdIoReqWrite;
     4034    pThis->IMediaEx.pfnIoReqFlush               = drvvdIoReqFlush;
     4035    pThis->IMediaEx.pfnIoReqDiscard             = drvvdIoReqDiscard;
     4036    pThis->IMediaEx.pfnIoReqGetActiveCount      = drvvdIoReqGetActiveCount;
     4037    pThis->IMediaEx.pfnIoReqGetSuspendedCount   = drvvdIoReqGetSuspendedCount;
     4038    pThis->IMediaEx.pfnIoReqQuerySuspendedStart = drvvdIoReqQuerySuspendedStart;
     4039    pThis->IMediaEx.pfnIoReqQuerySuspendedNext  = drvvdIoReqQuerySuspendedNext;
    39514040
    39524041    /* Initialize supported VD interfaces. */
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