Changeset 29240 in vbox
- Timestamp:
- May 8, 2010 4:16:10 PM (15 years ago)
- svn:sync-xref-src-repo-rev:
- 61322
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Devices/Storage/VBoxHDD.cpp
r29048 r29240 228 228 /** Flag whether the I/O context is blocked because it is in the growing list. */ 229 229 bool fBlocked; 230 /** Number of data transfers currently pending. */ 231 volatile uint32_t cDataTransfersPending; 230 232 /** How many meta data transfers are pending. */ 231 233 volatile uint32_t cMetaTransfersPending; … … 596 598 pIoCtx->uOffset = uOffset; 597 599 pIoCtx->cbTransfer = cbTransfer; 600 pIoCtx->cDataTransfersPending = 0; 598 601 pIoCtx->cMetaTransfersPending = 0; 599 602 pIoCtx->fComplete = false; … … 749 752 if ( !pIoCtx->cbTransferLeft 750 753 && !pIoCtx->cMetaTransfersPending 754 && !pIoCtx->cDataTransfersPending 751 755 && !pIoCtx->pfnIoCtxTransfer) 756 return VINF_VD_ASYNC_IO_FINISHED; 757 758 /* 759 * We complete the I/O context in case of an error 760 * if there is no I/O task pending. 761 */ 762 if ( RT_FAILURE(pIoCtx->rcReq) 763 && !pIoCtx->cMetaTransfersPending 764 && !pIoCtx->cDataTransfersPending) 752 765 return VINF_VD_ASYNC_IO_FINISHED; 753 766 … … 774 787 if ( RT_SUCCESS(rc) 775 788 && !pIoCtx->cbTransferLeft 776 && !pIoCtx->cMetaTransfersPending) 789 && !pIoCtx->cMetaTransfersPending 790 && !pIoCtx->cDataTransfersPending) 777 791 rc = VINF_VD_ASYNC_IO_FINISHED; 778 792 else if (RT_SUCCESS(rc)) 779 793 rc = VERR_VD_ASYNC_IO_IN_PROGRESS; 794 else 795 { 796 ASMAtomicCmpXchgS32(&pIoCtx->rcReq, rc, VINF_SUCCESS); 797 /* 798 * The I/O context completed if we have an error and there is no data 799 * or meta data transfer pending. 800 */ 801 if ( !pIoCtx->cMetaTransfersPending 802 && !pIoCtx->cDataTransfersPending) 803 rc = VINF_VD_ASYNC_IO_FINISHED; 804 } 780 805 781 806 LogFlowFunc(("pIoCtx=%#p rc=%Rrc cbTransferLeft=%u cMetaTransfersPending=%u fComplete=%RTbool\n", … … 1771 1796 1772 1797 if (!pIoTask->fMeta) 1798 { 1773 1799 ASMAtomicSubU32(&pIoCtx->cbTransferLeft, pIoTask->Type.User.cbTransfer); 1800 ASMAtomicDecU32(&pIoCtx->cDataTransfersPending); 1801 } 1774 1802 else 1775 1803 { … … 1783 1811 vdIoTaskFree(pDisk, pIoTask); 1784 1812 1813 if (RT_FAILURE(rcReq)) 1814 ASMAtomicCmpXchgS32(&pIoCtx->rcReq, rcReq, VINF_SUCCESS); 1815 1785 1816 if (!pIoCtx->fBlocked) 1786 1817 { … … 1804 1835 ASMAtomicSubU32(&pIoCtxParent->cbTransferLeft, pIoCtx->Type.Child.cbTransferParent); 1805 1836 1837 if (RT_FAILURE(pIoCtx->rcReq)) 1838 ASMAtomicCmpXchgS32(&pIoCtxParent->rcReq, pIoCtx->rcReq, VINF_SUCCESS); 1839 1806 1840 /* 1807 1841 * A completed child write means that we finsihed growing the image. … … 2020 2054 return VERR_NO_MEMORY; 2021 2055 2056 ASMAtomicIncU32(&pIoCtx->cDataTransfersPending); 2057 2022 2058 void *pvTask; 2023 2059 int rc2 = pDisk->pInterfaceAsyncIOCallbacks->pfnReadAsync(pDisk->pInterfaceAsyncIO->pvUser, … … 2030 2066 AssertMsg(cbTaskRead <= pIoCtx->cbTransferLeft, ("Impossible!\n")); 2031 2067 ASMAtomicSubU32(&pIoCtx->cbTransferLeft, cbTaskRead); 2068 ASMAtomicDecU32(&pIoCtx->cDataTransfersPending); 2032 2069 vdIoTaskFree(pDisk, pIoTask); 2033 2070 } … … 2081 2118 if (!pIoTask) 2082 2119 return VERR_NO_MEMORY; 2120 2121 ASMAtomicIncU32(&pIoCtx->cDataTransfersPending); 2083 2122 2084 2123 void *pvTask; … … 2092 2131 AssertMsg(cbTaskWrite <= pIoCtx->cbTransferLeft, ("Impossible!\n")); 2093 2132 ASMAtomicSubU32(&pIoCtx->cbTransferLeft, cbTaskWrite); 2133 ASMAtomicDecU32(&pIoCtx->cDataTransfersPending); 2094 2134 vdIoTaskFree(pDisk, pIoTask); 2095 2135 }
Note:
See TracChangeset
for help on using the changeset viewer.