Changeset 59538 in vbox for trunk/src/VBox/Devices/Storage
- Timestamp:
- Feb 1, 2016 10:33:38 AM (9 years ago)
- svn:sync-xref-src-repo-rev:
- 105332
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Devices/Storage/DrvVD.cpp
r59536 r59538 3051 3051 3052 3052 /** 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 */ 3058 DECLINLINE(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 /** 3053 3076 * @copydoc FNVDASYNCTRANSFERCOMPLETE 3054 3077 */ … … 3404 3427 PVBOXDISK pThis = RT_FROM_MEMBER(pInterface, VBOXDISK, IMediaEx); 3405 3428 return ASMAtomicReadU32(&pThis->cIoReqsActive); 3429 } 3430 3431 /** 3432 * @interface_method_impl{PDMIMEDIAEX,pfnIoReqGetSuspendedCount} 3433 */ 3434 static 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 */ 3455 static 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 */ 3475 static 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; 3406 3492 } 3407 3493 … … 3940 4026 3941 4027 /* 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; 3951 4040 3952 4041 /* Initialize supported VD interfaces. */
Note:
See TracChangeset
for help on using the changeset viewer.