Changeset 26147 in vbox for trunk/src/VBox
- Timestamp:
- Feb 2, 2010 1:55:20 PM (15 years ago)
- svn:sync-xref-src-repo-rev:
- 57156
- Location:
- trunk/src/VBox
- Files:
-
- 7 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Devices/Storage/DrvVD.cpp
r26001 r26147 353 353 354 354 Assert(!pStorageBackend->fSyncIoPending); 355 pStorageBackend->fSyncIoPending = true;355 ASMAtomicXchgBool(&pStorageBackend->fSyncIoPending, true); 356 356 DataSeg.cbSeg = cbRead; 357 357 DataSeg.pvSeg = pvBuf; … … 361 361 return rc; 362 362 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); 366 371 367 372 if (pcbRead) … … 380 385 381 386 Assert(!pStorageBackend->fSyncIoPending); 382 pStorageBackend->fSyncIoPending = true;387 ASMAtomicXchgBool(&pStorageBackend->fSyncIoPending, true); 383 388 DataSeg.cbSeg = cbWrite; 384 389 DataSeg.pvSeg = (void *)pvBuf; … … 388 393 return rc; 389 394 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); 393 403 394 404 if (pcbWritten) … … 405 415 406 416 Assert(!pStorageBackend->fSyncIoPending); 407 pStorageBackend->fSyncIoPending = true;417 ASMAtomicXchgBool(&pStorageBackend->fSyncIoPending, true); 408 418 409 419 int rc = PDMR3AsyncCompletionEpFlush(pStorageBackend->pEndpoint, NULL, &pTask); … … 411 421 return rc; 412 422 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); 416 431 417 432 return VINF_SUCCESS; … … 1104 1119 break; 1105 1120 } 1106 rc = CFGMR3QueryBoolDef(pCurNode, "UseNewIo", &fUseNewIo, false);1121 rc = CFGMR3QueryBoolDef(pCurNode, "UseNewIo", &fUseNewIo, true); 1107 1122 if (RT_FAILURE(rc)) 1108 1123 { … … 1248 1263 if (rc == VERR_NOT_SUPPORTED) 1249 1264 { 1250 /* Seems async I/O is not supported by the backend, open in normal mode. */1251 1265 pThis->fAsyncIOSupported = false; 1252 1266 uOpenFlags &= ~VD_OPEN_FLAGS_ASYNC_IO; -
trunk/src/VBox/VMM/PDMAsyncCompletion.cpp
r26108 r26147 545 545 } 546 546 547 void pdmR3AsyncCompletionCompleteTask(PPDMASYNCCOMPLETIONTASK pTask) 548 { 549 LogFlow(("%s: pTask=%p\n", __FUNCTION__, pTask)); 550 551 PPDMASYNCCOMPLETIONTEMPLATE pTemplate = pTask->pEndpoint->pTemplate; 552 553 switch (pTemplate->enmType) 554 { 555 case PDMASYNCCOMPLETIONTEMPLATETYPE_DEV: 556 { 557 pTemplate->u.Dev.pfnCompleted(pTemplate->u.Dev.pDevIns, pTask->pvUser); 558 break; 547 void pdmR3AsyncCompletionCompleteTask(PPDMASYNCCOMPLETIONTASK pTask, bool fCallCompletionHandler) 548 { 549 LogFlow(("%s: pTask=%#p fCallCompletionHandler=%RTbool\n", __FUNCTION__, pTask, fCallCompletionHandler)); 550 551 if (fCallCompletionHandler) 552 { 553 PPDMASYNCCOMPLETIONTEMPLATE pTemplate = pTask->pEndpoint->pTemplate; 554 555 switch (pTemplate->enmType) 556 { 557 case PDMASYNCCOMPLETIONTEMPLATETYPE_DEV: 558 { 559 pTemplate->u.Dev.pfnCompleted(pTemplate->u.Dev.pDevIns, pTask->pvUser); 560 break; 561 } 562 case PDMASYNCCOMPLETIONTEMPLATETYPE_DRV: 563 { 564 pTemplate->u.Drv.pfnCompleted(pTemplate->u.Drv.pDrvIns, pTemplate->u.Drv.pvTemplateUser, pTask->pvUser); 565 break; 566 } 567 case PDMASYNCCOMPLETIONTEMPLATETYPE_USB: 568 { 569 pTemplate->u.Usb.pfnCompleted(pTemplate->u.Usb.pUsbIns, pTask->pvUser); 570 break; 571 } 572 case PDMASYNCCOMPLETIONTEMPLATETYPE_INTERNAL: 573 { 574 pTemplate->u.Int.pfnCompleted(pTemplate->pVM, pTask->pvUser, pTemplate->u.Int.pvUser); 575 break; 576 } 577 default: 578 AssertMsgFailed(("Unknown template type!\n")); 559 579 } 560 case PDMASYNCCOMPLETIONTEMPLATETYPE_DRV:561 {562 pTemplate->u.Drv.pfnCompleted(pTemplate->u.Drv.pDrvIns, pTemplate->u.Drv.pvTemplateUser, pTask->pvUser);563 break;564 }565 case PDMASYNCCOMPLETIONTEMPLATETYPE_USB:566 {567 pTemplate->u.Usb.pfnCompleted(pTemplate->u.Usb.pUsbIns, pTask->pvUser);568 break;569 }570 case PDMASYNCCOMPLETIONTEMPLATETYPE_INTERNAL:571 {572 pTemplate->u.Int.pfnCompleted(pTemplate->pVM, pTask->pvUser, pTemplate->u.Int.pvUser);573 break;574 }575 default:576 AssertMsgFailed(("Unknown template type!\n"));577 580 } 578 581 -
trunk/src/VBox/VMM/PDMAsyncCompletionFile.cpp
r25757 r26147 26 26 #define LOG_GROUP LOG_GROUP_PDM_ASYNC_COMPLETION 27 27 #define RT_STRICT 28 //#define DEBUG 28 29 #include "PDMInternal.h" 29 30 #include <VBox/pdm.h> … … 321 322 if (pTask->enmTransferType == PDMACTASKFILETRANSFER_FLUSH) 322 323 { 323 pdmR3AsyncCompletionCompleteTask(&pTaskFile->Core );324 pdmR3AsyncCompletionCompleteTask(&pTaskFile->Core, true); 324 325 } 325 326 else … … 329 330 if (!(uOld - pTask->DataSeg.cbSeg) 330 331 && !ASMAtomicXchgBool(&pTaskFile->fCompleted, true)) 331 pdmR3AsyncCompletionCompleteTask(&pTaskFile->Core );332 pdmR3AsyncCompletionCompleteTask(&pTaskFile->Core, true); 332 333 } 333 334 } … … 372 373 if (ASMAtomicReadS32(&pTaskFile->cbTransferLeft) == 0 373 374 && !ASMAtomicXchgBool(&pTaskFile->fCompleted, true)) 374 pdmR3AsyncCompletionCompleteTask(pTask); 375 376 return VINF_SUCCESS; 375 pdmR3AsyncCompletionCompleteTask(pTask, false); 376 else 377 rc = VINF_AIO_TASK_PENDING; 378 379 return rc; 377 380 } 378 381 … … 683 686 684 687 rc = RTFileGetSize(pEpFile->File, (uint64_t *)&pEpFile->cbFile); 688 if (RT_SUCCESS(rc) && (pEpFile->cbFile == 0)) 689 { 690 /* Could be a block device */ 691 rc = RTFileSeek(pEpFile->File, 0, RTFILE_SEEK_END, (uint64_t *)&pEpFile->cbFile); 692 } 693 685 694 if (RT_SUCCESS(rc)) 686 695 { … … 871 880 pIoTask->pfnCompleted = pdmacFileEpTaskCompleted; 872 881 pdmacFileEpAddTask(pEpFile, pIoTask); 882 rc = VINF_AIO_TASK_PENDING; 873 883 } 874 884 -
trunk/src/VBox/VMM/PDMAsyncCompletionFileCache.cpp
r25647 r26147 45 45 *******************************************************************************/ 46 46 #define LOG_GROUP LOG_GROUP_PDM_ASYNC_COMPLETION 47 #define RT_STRICT48 47 #include <iprt/types.h> 49 48 #include <iprt/mem.h> … … 558 557 pIoTask->pvUser = pEntry; 559 558 pIoTask->pfnCompleted = pdmacFileCacheTaskCompleted; 559 ASMAtomicIncU32(&pEntry->pEndpoint->DataCache.cWritesOutstanding); 560 560 561 561 /* Send it off to the I/O manager. */ … … 579 579 if (!(uOld - pTaskSeg->cbTransfer) 580 580 && !ASMAtomicXchgBool(&pTaskSeg->pTask->fCompleted, true)) 581 { 582 pdmR3AsyncCompletionCompleteTask(&pTaskSeg->pTask->Core); 583 584 if (pTaskSeg->fWrite) 585 { 586 /* Complete a pending flush if all writes have completed */ 587 uint32_t cWritesOutstanding = ASMAtomicDecU32(&pEndpointCache->cWritesOutstanding); 588 PPDMASYNCCOMPLETIONTASKFILE pTaskFlush = (PPDMASYNCCOMPLETIONTASKFILE)ASMAtomicXchgPtr((void * volatile *)&pEndpointCache->pTaskFlush, NULL); 589 590 if (!cWritesOutstanding && pTaskFlush) 591 pdmR3AsyncCompletionCompleteTask(&pTaskFlush->Core); 592 } 593 } 581 pdmR3AsyncCompletionCompleteTask(&pTaskSeg->pTask->Core, true); 594 582 595 583 RTMemFree(pTaskSeg); … … 629 617 if (pTask->enmTransferType == PDMACTASKFILETRANSFER_WRITE) 630 618 { 619 AssertMsg(pEndpointCache->cWritesOutstanding > 0, ("Completed write request but outstanding task count is 0\n")); 620 ASMAtomicDecU32(&pEndpointCache->cWritesOutstanding); 621 631 622 if (pEntry->fFlags & PDMACFILECACHE_ENTRY_IS_DEPRECATED) 632 623 { … … 674 665 if (pEntry->fFlags & PDMACFILECACHE_ENTRY_IS_DIRTY) 675 666 pdmacFileCacheWriteToEndpoint(pEntry); 667 668 /* Complete a pending flush if all writes have completed */ 669 if (!ASMAtomicReadU32(&pEndpointCache->cWritesOutstanding)) 670 { 671 PPDMASYNCCOMPLETIONTASKFILE pTaskFlush = (PPDMASYNCCOMPLETIONTASKFILE)ASMAtomicXchgPtr((void * volatile *)&pEndpointCache->pTaskFlush, NULL); 672 if (pTaskFlush) 673 pdmR3AsyncCompletionCompleteTask(&pTaskFlush->Core, true); 674 } 676 675 677 676 RTSemRWReleaseWrite(pEndpoint->DataCache.SemRWEntries); … … 1497 1496 if (ASMAtomicReadS32(&pTask->cbTransferLeft) == 0 1498 1497 && !ASMAtomicXchgBool(&pTask->fCompleted, true)) 1499 pdmR3AsyncCompletionCompleteTask(&pTask->Core); 1498 pdmR3AsyncCompletionCompleteTask(&pTask->Core, false); 1499 else 1500 rc = VINF_AIO_TASK_PENDING; 1501 1502 LogFlowFunc((": Leave rc=%Rrc\n", rc)); 1500 1503 1501 1504 return rc; … … 1528 1531 /* Set to completed to make sure that the task is valid while we access it. */ 1529 1532 ASMAtomicWriteBool(&pTask->fCompleted, true); 1530 ASMAtomicIncU32(&pEndpointCache->cWritesOutstanding);1531 1533 1532 1534 int iSegCurr = 0; … … 1931 1933 && !ASMAtomicXchgBool(&pTask->fCompleted, true)) 1932 1934 { 1933 pdmR3AsyncCompletionCompleteTask(&pTask->Core );1935 pdmR3AsyncCompletionCompleteTask(&pTask->Core, false); 1934 1936 1935 1937 /* Complete a pending flush if all writes have completed */ 1936 uint32_t cWritesOutstanding = ASMAtomicDecU32(&pEndpointCache->cWritesOutstanding); 1937 PPDMASYNCCOMPLETIONTASKFILE pTaskFlush = (PPDMASYNCCOMPLETIONTASKFILE)ASMAtomicXchgPtr((void * volatile *)&pEndpointCache->pTaskFlush, NULL); 1938 1939 if (!cWritesOutstanding && pTaskFlush) 1940 pdmR3AsyncCompletionCompleteTask(&pTaskFlush->Core); 1941 } 1942 1943 return VINF_SUCCESS; 1938 if (!ASMAtomicReadU32(&pEndpointCache->cWritesOutstanding)) 1939 { 1940 PPDMASYNCCOMPLETIONTASKFILE pTaskFlush = (PPDMASYNCCOMPLETIONTASKFILE)ASMAtomicXchgPtr((void * volatile *)&pEndpointCache->pTaskFlush, NULL); 1941 if (pTaskFlush) 1942 pdmR3AsyncCompletionCompleteTask(&pTaskFlush->Core, true); 1943 } 1944 } 1945 else 1946 rc = VINF_AIO_TASK_PENDING; 1947 1948 LogFlowFunc((": Leave rc=%Rrc\n", rc)); 1949 1950 return rc; 1944 1951 } 1945 1952 … … 1949 1956 { 1950 1957 int rc = VINF_SUCCESS; 1958 1959 LogFlowFunc((": pEndpoint=%#p{%s} pTask=%#p\n", 1960 pEndpoint, pEndpoint->Core.pszUri, pTask)); 1951 1961 1952 1962 if (ASMAtomicReadPtr((void * volatile *)&pEndpoint->DataCache.pTaskFlush)) … … 1955 1965 { 1956 1966 if (ASMAtomicReadU32(&pEndpoint->DataCache.cWritesOutstanding) > 0) 1967 { 1957 1968 ASMAtomicWritePtr((void * volatile *)&pEndpoint->DataCache.pTaskFlush, pTask); 1969 rc = VINF_AIO_TASK_PENDING; 1970 } 1958 1971 else 1959 pdmR3AsyncCompletionCompleteTask(&pTask->Core); 1960 } 1961 1972 pdmR3AsyncCompletionCompleteTask(&pTask->Core, false); 1973 } 1974 1975 LogFlowFunc((": Leave rc=%Rrc\n", rc)); 1962 1976 return rc; 1963 1977 } -
trunk/src/VBox/VMM/PDMAsyncCompletionFileFailsafe.cpp
r25270 r26147 21 21 */ 22 22 #define LOG_GROUP LOG_GROUP_PDM_ASYNC_COMPLETION 23 #define RT_STRICT24 23 #include <iprt/types.h> 25 24 #include <iprt/assert.h> -
trunk/src/VBox/VMM/PDMAsyncCompletionFileNormal.cpp
r24530 r26147 21 21 */ 22 22 #define LOG_GROUP LOG_GROUP_PDM_ASYNC_COMPLETION 23 #define RT_STRICT24 23 #include <iprt/types.h> 25 24 #include <iprt/asm.h> -
trunk/src/VBox/VMM/PDMAsyncCompletionInternal.h
r26108 r26147 269 269 * 270 270 * @returns nothing 271 * @param pTask Pointer to the finished task. 272 */ 273 void pdmR3AsyncCompletionCompleteTask(PPDMASYNCCOMPLETIONTASK pTask); 271 * @param pTask Pointer to the finished task. 272 * @param fCallCompletionHandler Flag whether the completion handler should be called to 273 * inform the owner of the task that it has completed. 274 */ 275 void pdmR3AsyncCompletionCompleteTask(PPDMASYNCCOMPLETIONTASK pTask, bool fCallCompletionHandler); 274 276 275 277 RT_C_DECLS_END
Note:
See TracChangeset
for help on using the changeset viewer.