Changeset 44358 in vbox
- Timestamp:
- Jan 24, 2013 4:05:55 PM (12 years ago)
- svn:sync-xref-src-repo-rev:
- 83325
- Location:
- trunk
- Files:
-
- 9 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/include/VBox/vmm/pdmasynccompletion.h
r36573 r44358 4 4 5 5 /* 6 * Copyright (C) 2007-201 0Oracle Corporation6 * Copyright (C) 2007-2013 Oracle Corporation 7 7 * 8 8 * This file is part of VirtualBox Open Source Edition (OSE), as … … 105 105 typedef FNPDMASYNCCOMPLETEINT *PFNPDMASYNCCOMPLETEINT; 106 106 107 108 /**109 * Creates an async completion template for a device instance.110 *111 * The template is used when creating new completion tasks.112 *113 * @returns VBox status code.114 * @param pVM Pointer to the shared VM structure.115 * @param pDevIns The device instance.116 * @param ppTemplate Where to store the template pointer on success.117 * @param pfnCompleted The completion callback routine.118 * @param pszDesc Description.119 */120 VMMR3DECL(int) PDMR3AsyncCompletionTemplateCreateDevice(PVM pVM, PPDMDEVINS pDevIns, PPPDMASYNCCOMPLETIONTEMPLATE ppTemplate, PFNPDMASYNCCOMPLETEDEV pfnCompleted, const char *pszDesc);121 122 /**123 * Creates an async completion template for a driver instance.124 *125 * The template is used when creating new completion tasks.126 *127 * @returns VBox status code.128 * @param pVM Pointer to the shared VM structure.129 * @param pDrvIns The driver instance.130 * @param ppTemplate Where to store the template pointer on success.131 * @param pfnCompleted The completion callback routine.132 * @param pvTemplateUser Template user argument.133 * @param pszDesc Description.134 */135 VMMR3DECL(int) PDMR3AsyncCompletionTemplateCreateDriver(PVM pVM, PPDMDRVINS pDrvIns, PPPDMASYNCCOMPLETIONTEMPLATE ppTemplate, PFNPDMASYNCCOMPLETEDRV pfnCompleted, void *pvTemplateUser, const char *pszDesc);136 137 /**138 * Creates an async completion template for a USB device instance.139 *140 * The template is used when creating new completion tasks.141 *142 * @returns VBox status code.143 * @param pVM Pointer to the shared VM structure.144 * @param pUsbIns The USB device instance.145 * @param ppTemplate Where to store the template pointer on success.146 * @param pfnCompleted The completion callback routine.147 * @param pszDesc Description.148 */149 VMMR3DECL(int) PDMR3AsyncCompletionTemplateCreateUsb(PVM pVM, PPDMUSBINS pUsbIns, PPPDMASYNCCOMPLETIONTEMPLATE ppTemplate, PFNPDMASYNCCOMPLETEUSB pfnCompleted, const char *pszDesc);150 151 /**152 * Creates an async completion template for internally by the VMM.153 *154 * The template is used when creating new completion tasks.155 *156 * @returns VBox status code.157 * @param pVM Pointer to the shared VM structure.158 * @param ppTemplate Where to store the template pointer on success.159 * @param pfnCompleted The completion callback routine.160 * @param pvUser2 The 2nd user argument for the callback.161 * @param pszDesc Description.162 */163 107 VMMR3DECL(int) PDMR3AsyncCompletionTemplateCreateInternal(PVM pVM, PPPDMASYNCCOMPLETIONTEMPLATE ppTemplate, PFNPDMASYNCCOMPLETEINT pfnCompleted, void *pvUser2, const char *pszDesc); 164 165 /**166 * Destroys the specified async completion template.167 *168 * @returns VBox status codes:169 * @retval VINF_SUCCESS on success.170 * @retval VERR_PDM_ASYNC_TEMPLATE_BUSY if the template is still in use.171 *172 * @param pTemplate The template in question.173 */174 108 VMMR3DECL(int) PDMR3AsyncCompletionTemplateDestroy(PPDMASYNCCOMPLETIONTEMPLATE pTemplate); 175 176 /**177 * Destroys all the specified async completion templates for the given device instance.178 *179 * @returns VBox status codes:180 * @retval VINF_SUCCESS on success.181 * @retval VERR_PDM_ASYNC_TEMPLATE_BUSY if one or more of the templates are still in use.182 *183 * @param pVM Pointer to the shared VM structure.184 * @param pDevIns The device instance.185 */186 VMMR3DECL(int) PDMR3AsyncCompletionTemplateDestroyDevice(PVM pVM, PPDMDEVINS pDevIns);187 188 /**189 * Destroys all the specified async completion templates for the given driver instance.190 *191 * @returns VBox status codes:192 * @retval VINF_SUCCESS on success.193 * @retval VERR_PDM_ASYNC_TEMPLATE_BUSY if one or more of the templates are still in use.194 *195 * @param pVM Pointer to the shared VM structure.196 * @param pDrvIns The driver instance.197 */198 VMMR3DECL(int) PDMR3AsyncCompletionTemplateDestroyDriver(PVM pVM, PPDMDRVINS pDrvIns);199 200 /**201 * Destroys all the specified async completion templates for the given USB device instance.202 *203 * @returns VBox status codes:204 * @retval VINF_SUCCESS on success.205 * @retval VERR_PDM_ASYNC_TEMPLATE_BUSY if one or more of the templates are still in use.206 *207 * @param pVM Pointer to the shared VM structure.208 * @param pUsbIns The USB device instance.209 */210 VMMR3DECL(int) PDMR3AsyncCompletionTemplateDestroyUsb(PVM pVM, PPDMUSBINS pUsbIns);211 212 213 /**214 * Opens a file as an async completion endpoint.215 *216 * @returns VBox status code.217 * @param ppEndpoint Where to store the opaque endpoint handle on success.218 * @param pszFilename Path to the file which is to be opened. (UTF-8)219 * @param fFlags Open flags, see grp_pdmacep_file_flags.220 * @param pTemplate Handle to the completion callback template to use221 * for this end point.222 */223 109 VMMR3DECL(int) PDMR3AsyncCompletionEpCreateForFile(PPPDMASYNCCOMPLETIONENDPOINT ppEndpoint, 224 110 const char *pszFilename, uint32_t fFlags, … … 239 125 /** @} */ 240 126 241 /**242 * Closes a endpoint waiting for any pending tasks to finish.243 *244 * @returns nothing.245 * @param pEndpoint Handle of the endpoint.246 */247 127 VMMR3DECL(void) PDMR3AsyncCompletionEpClose(PPDMASYNCCOMPLETIONENDPOINT pEndpoint); 248 249 /**250 * Creates a read task on the given endpoint.251 *252 * @returns VBox status code.253 * @param pEndpoint The file endpoint to read from.254 * @param off Where to start reading from.255 * @param paSegments Scatter gather list to store the data in.256 * @param cSegments Number of segments in the list.257 * @param cbRead The overall number of bytes to read.258 * @param pvUser Opaque user data returned in the completion callback259 * upon completion of the task.260 * @param ppTask Where to store the task handle on success.261 */262 128 VMMR3DECL(int) PDMR3AsyncCompletionEpRead(PPDMASYNCCOMPLETIONENDPOINT pEndpoint, RTFOFF off, 263 129 PCRTSGSEG paSegments, unsigned cSegments, 264 130 size_t cbRead, void *pvUser, 265 131 PPPDMASYNCCOMPLETIONTASK ppTask); 266 267 /**268 * Creates a write task on the given endpoint.269 *270 * @returns VBox status code.271 * @param pEndpoint The file endpoint to write to.272 * @param off Where to start writing at.273 * @param paSegments Scatter gather list of the data to write.274 * @param cSegments Number of segments in the list.275 * @param cbWrite The overall number of bytes to write.276 * @param pvUser Opaque user data returned in the completion callback277 * upon completion of the task.278 * @param ppTask Where to store the task handle on success.279 */280 132 VMMR3DECL(int) PDMR3AsyncCompletionEpWrite(PPDMASYNCCOMPLETIONENDPOINT pEndpoint, RTFOFF off, 281 133 PCRTSGSEG paSegments, unsigned cSegments, 282 134 size_t cbWrite, void *pvUser, 283 135 PPPDMASYNCCOMPLETIONTASK ppTask); 284 285 /** 286 * Creates a flush task on the given endpoint. 287 * 288 * Every read and write task initiated before the flush task is 289 * finished upon completion of this task. 290 * 291 * @returns VBox status code. 292 * @param pEndpoint The file endpoint to flush. 293 * @param pvUser Opaque user data returned in the completion callback 294 * upon completion of the task. 295 * @param ppTask Where to store the task handle on success. 296 */ 297 VMMR3DECL(int) PDMR3AsyncCompletionEpFlush(PPDMASYNCCOMPLETIONENDPOINT pEndpoint, 298 void *pvUser, 299 PPPDMASYNCCOMPLETIONTASK ppTask); 300 301 /** 302 * Queries the size of an endpoint. 303 * Not that some endpoints may not support this and will return an error 304 * (sockets for example). 305 * 306 * @returns VBox status code. 307 * @retval VERR_NOT_SUPPORTED if the endpoint does not support this operation. 308 * @param pEndpoint The file endpoint. 309 * @param pcbSize Where to store the size of the endpoint. 310 */ 311 VMMR3DECL(int) PDMR3AsyncCompletionEpGetSize(PPDMASYNCCOMPLETIONENDPOINT pEndpoint, 312 uint64_t *pcbSize); 313 314 /** 315 * Sets the size of an endpoint. 316 * Not that some endpoints may not support this and will return an error 317 * (sockets for example). 318 * 319 * @returns VBox status code. 320 * @retval VERR_NOT_SUPPORTED if the endpoint does not support this operation. 321 * @param pEndpoint The file endpoint. 322 * @param cbSize The size to set. 323 * 324 * @note PDMR3AsyncCompletionEpFlush should be called before this operation is executed. 325 */ 326 VMMR3DECL(int) PDMR3AsyncCompletionEpSetSize(PPDMASYNCCOMPLETIONENDPOINT pEndpoint, 327 uint64_t cbSize); 328 329 /** 330 * Assigns or removes a bandwidth control manager to/from the endpoint. 331 * 332 * @returns VBox status code. 333 * @param pEndpoint The endpoint. 334 * @param pcszBwMgr The identifer of the new bandwidth manager to assign 335 * or NULL to remove the current one. 336 */ 337 VMMR3DECL(int) PDMR3AsyncCompletionEpSetBwMgr(PPDMASYNCCOMPLETIONENDPOINT pEndpoint, 338 const char *pcszBwMgr); 339 340 /** 341 * Cancels an async completion task. 342 * 343 * If you want to use this method, you have to take great create to make sure 344 * you will never attempt cancel a task which has been completed. Since there is 345 * no reference counting or anything on the task it self, you have to serialize 346 * the cancelation and completion paths such that the aren't racing one another. 347 * 348 * @returns VBox status code 349 * @param pTask The Task to cancel. 350 */ 136 VMMR3DECL(int) PDMR3AsyncCompletionEpFlush(PPDMASYNCCOMPLETIONENDPOINT pEndpoint, void *pvUser, PPPDMASYNCCOMPLETIONTASK ppTask); 137 VMMR3DECL(int) PDMR3AsyncCompletionEpGetSize(PPDMASYNCCOMPLETIONENDPOINT pEndpoint, uint64_t *pcbSize); 138 VMMR3DECL(int) PDMR3AsyncCompletionEpSetSize(PPDMASYNCCOMPLETIONENDPOINT pEndpoint, uint64_t cbSize); 139 VMMR3DECL(int) PDMR3AsyncCompletionEpSetBwMgr(PPDMASYNCCOMPLETIONENDPOINT pEndpoint, const char *pszBwMgr); 351 140 VMMR3DECL(int) PDMR3AsyncCompletionTaskCancel(PPDMASYNCCOMPLETIONTASK pTask); 352 353 /** 354 * Changes the limit of a bandwidth manager for file endpoints to the given value. 355 * 356 * @returns VBox status code. 357 * @param pVM Pointer to the shared VM structure. 358 * @param pcszBwMgr The identifer of the bandwidth manager to change. 359 * @param cbMaxNew The new maximum for the bandwidth manager in bytes/sec. 360 */ 361 VMMR3DECL(int) PDMR3AsyncCompletionBwMgrSetMaxForFile(PVM pVM, const char *pcszBwMgr, uint32_t cbMaxNew); 141 VMMR3DECL(int) PDMR3AsyncCompletionBwMgrSetMaxForFile(PUVM pUVM, const char *pszBwMgr, uint32_t cbMaxNew); 362 142 363 143 /** @} */ -
trunk/src/VBox/Devices/Storage/DrvVD.cpp
r43923 r44358 5 5 6 6 /* 7 * Copyright (C) 2006-201 0Oracle Corporation7 * Copyright (C) 2006-2013 Oracle Corporation 8 8 * 9 9 * This file is part of VirtualBox Open Source Edition (OSE), as -
trunk/src/VBox/Main/src-client/ConsoleImpl.cpp
r44355 r44358 5344 5344 int vrc = VINF_SUCCESS; 5345 5345 if (enmType == BandwidthGroupType_Disk) 5346 vrc = PDMR3AsyncCompletionBwMgrSetMaxForFile(ptrVM , Utf8Str(strName).c_str(), cMax);5346 vrc = PDMR3AsyncCompletionBwMgrSetMaxForFile(ptrVM.rawUVM(), Utf8Str(strName).c_str(), cMax); 5347 5347 #ifdef VBOX_WITH_NETSHAPER 5348 5348 else if (enmType == BandwidthGroupType_Network) -
trunk/src/VBox/VMM/VMMR3/PDM.cpp
r44351 r44358 5 5 6 6 /* 7 * Copyright (C) 2006-201 2Oracle Corporation7 * Copyright (C) 2006-2013 Oracle Corporation 8 8 * 9 9 * This file is part of VirtualBox Open Source Edition (OSE), as … … 664 664 //PDMR3QueueDestroyDevice(pVM, pDevIns); 665 665 PGMR3PhysMMIO2Deregister(pVM, pDevIns, UINT32_MAX); 666 #ifdef VBOX_WITH_PDM_ASYNC_COMPLETION 667 pdmR3AsyncCompletionTemplateDestroyDevice(pVM, pDevIns); 668 #endif 666 669 } 667 670 -
trunk/src/VBox/VMM/VMMR3/PDMAsyncCompletion.cpp
r43599 r44358 5 5 6 6 /* 7 * Copyright (C) 2006-201 2Oracle Corporation7 * Copyright (C) 2006-2013 Oracle Corporation 8 8 * 9 9 * This file is part of VirtualBox Open Source Edition (OSE), as … … 195 195 } 196 196 197 198 #ifdef SOME_UNUSED_FUNCTION 197 199 /** 198 200 * Creates a async completion template for a device instance. … … 207 209 * @param pszDesc Description. 208 210 */ 209 VMMR3DECL(int) PDMR3AsyncCompletionTemplateCreateDevice(PVM pVM, PPDMDEVINS pDevIns, PPPDMASYNCCOMPLETIONTEMPLATE ppTemplate, PFNPDMASYNCCOMPLETEDEV pfnCompleted, const char *pszDesc) 211 int pdmR3AsyncCompletionTemplateCreateDevice(PVM pVM, PPDMDEVINS pDevIns, PPPDMASYNCCOMPLETIONTEMPLATE ppTemplate, 212 PFNPDMASYNCCOMPLETEDEV pfnCompleted, const char *pszDesc) 210 213 { 211 214 LogFlow(("%s: pDevIns=%p ppTemplate=%p pfnCompleted=%p pszDesc=%s\n", … … 236 239 return rc; 237 240 } 241 #endif /* SOME_UNUSED_FUNCTION */ 242 238 243 239 244 /** … … 250 255 * @param pszDesc Description. 251 256 */ 252 VMMR3DECL(int) PDMR3AsyncCompletionTemplateCreateDriver(PVM pVM, PPDMDRVINS pDrvIns, PPPDMASYNCCOMPLETIONTEMPLATE ppTemplate, PFNPDMASYNCCOMPLETEDRV pfnCompleted, void *pvTemplateUser, const char *pszDesc) 253 { 254 LogFlow(("%s: pDrvIns=%p ppTemplate=%p pfnCompleted=%p pszDesc=%s\n", 255 __FUNCTION__, pDrvIns, ppTemplate, pfnCompleted, pszDesc)); 257 int pdmR3AsyncCompletionTemplateCreateDriver(PVM pVM, PPDMDRVINS pDrvIns, PPPDMASYNCCOMPLETIONTEMPLATE ppTemplate, 258 PFNPDMASYNCCOMPLETEDRV pfnCompleted, void *pvTemplateUser, 259 const char *pszDesc) 260 { 261 LogFlow(("PDMR3AsyncCompletionTemplateCreateDriver: pDrvIns=%p ppTemplate=%p pfnCompleted=%p pszDesc=%s\n", pDrvIns, ppTemplate, pfnCompleted, pszDesc)); 256 262 257 263 /* … … 280 286 } 281 287 288 289 #ifdef SOME_UNUSED_FUNCTION 282 290 /** 283 291 * Creates a async completion template for a USB device instance. … … 292 300 * @param pszDesc Description. 293 301 */ 294 VMMR3DECL(int) PDMR3AsyncCompletionTemplateCreateUsb(PVM pVM, PPDMUSBINS pUsbIns, PPPDMASYNCCOMPLETIONTEMPLATE ppTemplate, PFNPDMASYNCCOMPLETEUSB pfnCompleted, const char *pszDesc) 295 { 296 LogFlow(("%s: pUsbIns=%p ppTemplate=%p pfnCompleted=%p pszDesc=%s\n", 297 __FUNCTION__, pUsbIns, ppTemplate, pfnCompleted, pszDesc));302 int pdmR3AsyncCompletionTemplateCreateUsb(PVM pVM, PPDMUSBINS pUsbIns, PPPDMASYNCCOMPLETIONTEMPLATE ppTemplate, 303 PFNPDMASYNCCOMPLETEUSB pfnCompleted, const char *pszDesc) 304 { 305 LogFlow(("pdmR3AsyncCompletionTemplateCreateUsb: pUsbIns=%p ppTemplate=%p pfnCompleted=%p pszDesc=%s\n", pUsbIns, ppTemplate, pfnCompleted, pszDesc)); 298 306 299 307 /* … … 321 329 return rc; 322 330 } 331 #endif 332 323 333 324 334 /** … … 333 343 * @param pvUser2 The 2nd user argument for the callback. 334 344 * @param pszDesc Description. 345 * @internal 335 346 */ 336 347 VMMR3DECL(int) PDMR3AsyncCompletionTemplateCreateInternal(PVM pVM, PPPDMASYNCCOMPLETIONTEMPLATE ppTemplate, PFNPDMASYNCCOMPLETEINT pfnCompleted, void *pvUser2, const char *pszDesc) … … 364 375 } 365 376 377 366 378 /** 367 379 * Destroys the specified async completion template. … … 419 431 } 420 432 433 421 434 /** 422 435 * Destroys all the specified async completion templates for the given device instance. … … 429 442 * @param pDevIns The device instance. 430 443 */ 431 VMMR3DECL(int) PDMR3AsyncCompletionTemplateDestroyDevice(PVM pVM, PPDMDEVINS pDevIns)432 { 433 LogFlow((" %s: pDevIns=%p\n", __FUNCTION__, pDevIns));444 int pdmR3AsyncCompletionTemplateDestroyDevice(PVM pVM, PPDMDEVINS pDevIns) 445 { 446 LogFlow(("pdmR3AsyncCompletionTemplateDestroyDevice: pDevIns=%p\n", pDevIns)); 434 447 435 448 /* … … 468 481 } 469 482 483 470 484 /** 471 485 * Destroys all the specified async completion templates for the given driver instance. … … 478 492 * @param pDrvIns The driver instance. 479 493 */ 480 VMMR3DECL(int) PDMR3AsyncCompletionTemplateDestroyDriver(PVM pVM, PPDMDRVINS pDrvIns)481 { 482 LogFlow((" %s: pDevIns=%p\n", __FUNCTION__, pDrvIns));494 int pdmR3AsyncCompletionTemplateDestroyDriver(PVM pVM, PPDMDRVINS pDrvIns) 495 { 496 LogFlow(("pdmR3AsyncCompletionTemplateDestroyDriver: pDevIns=%p\n", pDrvIns)); 483 497 484 498 /* … … 517 531 } 518 532 533 519 534 /** 520 535 * Destroys all the specified async completion templates for the given USB device instance. … … 527 542 * @param pUsbIns The USB device instance. 528 543 */ 529 VMMR3DECL(int) PDMR3AsyncCompletionTemplateDestroyUsb(PVM pVM, PPDMUSBINS pUsbIns)530 { 531 LogFlow((" %s: pUsbIns=%p\n", __FUNCTION__, pUsbIns));544 int pdmR3AsyncCompletionTemplateDestroyUsb(PVM pVM, PPDMUSBINS pUsbIns) 545 { 546 LogFlow(("pdmR3AsyncCompletionTemplateDestroyUsb: pUsbIns=%p\n", pUsbIns)); 532 547 533 548 /* … … 567 582 568 583 569 static PPDMACBWMGR pdmacBwMgrFindById(PPDMASYNCCOMPLETIONEPCLASS pEpClass, const char *pcszId) 584 /** Lazy coder. */ 585 static PPDMACBWMGR pdmacBwMgrFindById(PPDMASYNCCOMPLETIONEPCLASS pEpClass, const char *pszId) 570 586 { 571 587 PPDMACBWMGR pBwMgr = NULL; 572 588 573 if ( RT_VALID_PTR(pcszId))589 if (pszId) 574 590 { 575 591 int rc = RTCritSectEnter(&pEpClass->CritSect); AssertRC(rc); … … 577 593 pBwMgr = pEpClass->pBwMgrsHead; 578 594 while ( pBwMgr 579 && RTStrCmp(pBwMgr->pszId, p cszId))595 && RTStrCmp(pBwMgr->pszId, pszId)) 580 596 pBwMgr = pBwMgr->pNext; 581 597 … … 586 602 } 587 603 604 605 /** Lazy coder. */ 588 606 static void pdmacBwMgrLink(PPDMACBWMGR pBwMgr) 589 607 { … … 597 615 } 598 616 617 599 618 #ifdef SOME_UNUSED_FUNCTION 619 /** Lazy coder. */ 600 620 static void pdmacBwMgrUnlink(PPDMACBWMGR pBwMgr) 601 621 { … … 620 640 #endif /* SOME_UNUSED_FUNCTION */ 621 641 622 static int pdmacAsyncCompletionBwMgrCreate(PPDMASYNCCOMPLETIONEPCLASS pEpClass, const char *pcszBwMgr, uint32_t cbTransferPerSecMax, 642 643 /** Lazy coder. */ 644 static int pdmacAsyncCompletionBwMgrCreate(PPDMASYNCCOMPLETIONEPCLASS pEpClass, const char *pszBwMgr, uint32_t cbTransferPerSecMax, 623 645 uint32_t cbTransferPerSecStart, uint32_t cbTransferPerSecStep) 624 646 { 625 LogFlowFunc(("pEpClass=%#p p cszBwMgr=%#p{%s} cbTransferPerSecMax=%u cbTransferPerSecStart=%u cbTransferPerSecStep=%u\n",626 pEpClass, p cszBwMgr, cbTransferPerSecMax, cbTransferPerSecStart, cbTransferPerSecStep));647 LogFlowFunc(("pEpClass=%#p pszBwMgr=%#p{%s} cbTransferPerSecMax=%u cbTransferPerSecStart=%u cbTransferPerSecStep=%u\n", 648 pEpClass, pszBwMgr, cbTransferPerSecMax, cbTransferPerSecStart, cbTransferPerSecStep)); 627 649 628 650 AssertPtrReturn(pEpClass, VERR_INVALID_POINTER); 629 AssertPtrReturn(p cszBwMgr, VERR_INVALID_POINTER);630 AssertReturn(*p cszBwMgr != '\0', VERR_INVALID_PARAMETER);651 AssertPtrReturn(pszBwMgr, VERR_INVALID_POINTER); 652 AssertReturn(*pszBwMgr != '\0', VERR_INVALID_PARAMETER); 631 653 632 654 int rc; 633 PPDMACBWMGR pBwMgr = pdmacBwMgrFindById(pEpClass, p cszBwMgr);655 PPDMACBWMGR pBwMgr = pdmacBwMgrFindById(pEpClass, pszBwMgr); 634 656 if (!pBwMgr) 635 657 { … … 639 661 if (RT_SUCCESS(rc)) 640 662 { 641 pBwMgr->pszId = RTStrDup(p cszBwMgr);663 pBwMgr->pszId = RTStrDup(pszBwMgr); 642 664 if (pBwMgr->pszId) 643 665 { … … 670 692 } 671 693 672 DECLINLINE(void) pdmacBwMgrRef(PPDMACBWMGR pBwMgr) 694 695 /** Lazy coder. */ 696 DECLINLINE(void) pdmacBwMgrRetain(PPDMACBWMGR pBwMgr) 673 697 { 674 698 ASMAtomicIncU32(&pBwMgr->cRefs); 675 699 } 676 700 677 DECLINLINE(void) pdmacBwMgrUnref(PPDMACBWMGR pBwMgr) 701 702 /** Lazy coder. */ 703 DECLINLINE(void) pdmacBwMgrRelease(PPDMACBWMGR pBwMgr) 678 704 { 679 705 Assert(pBwMgr->cRefs > 0); … … 681 707 } 682 708 709 710 /** 711 * Checks if the endpoint is allowed to transfer the given amount of bytes. 712 * 713 * @returns true if the endpoint is allowed to transfer the data. 714 * false otherwise 715 * @param pEndpoint The endpoint. 716 * @param cbTransfer The number of bytes to transfer. 717 * @param pmsWhenNext Where to store the number of milliseconds 718 * until the bandwidth is refreshed. 719 * Only set if false is returned. 720 */ 683 721 bool pdmacEpIsTransferAllowed(PPDMASYNCCOMPLETIONENDPOINT pEndpoint, uint32_t cbTransfer, RTMSINTERVAL *pmsWhenNext) 684 722 { … … 729 767 } 730 768 769 770 /** 771 * Called by the endpoint if a task has finished. 772 * 773 * @returns nothing 774 * @param pTask Pointer to the finished task. 775 * @param rc Status code of the completed request. 776 * @param fCallCompletionHandler Flag whether the completion handler should be called to 777 * inform the owner of the task that it has completed. 778 */ 731 779 void pdmR3AsyncCompletionCompleteTask(PPDMASYNCCOMPLETIONTASK pTask, int rc, bool fCallCompletionHandler) 732 780 { … … 763 811 } 764 812 813 765 814 /** 766 815 * Worker initializing a endpoint class. … … 778 827 AssertReturn(pEpClassOps->u32VersionEnd == PDMAC_EPCLASS_OPS_VERSION, VERR_VERSION_MISMATCH); 779 828 780 LogFlow Func((": pVM=%p pEpClassOps=%p{%s}\n", pVM, pEpClassOps, pEpClassOps->pcszName));829 LogFlow(("pdmR3AsyncCompletionEpClassInit: pVM=%p pEpClassOps=%p{%s}\n", pVM, pEpClassOps, pEpClassOps->pszName)); 781 830 782 831 /* Allocate global class data. */ … … 795 844 if (RT_SUCCESS(rc)) 796 845 { 797 PCFGMNODE pCfgNodeClass = CFGMR3GetChild(pCfgHandle, pEpClassOps->p cszName);846 PCFGMNODE pCfgNodeClass = CFGMR3GetChild(pCfgHandle, pEpClassOps->pszName); 798 847 799 848 /* Create task cache */ … … 855 904 856 905 pUVM->pdm.s.apAsyncCompletionEndpointClass[pEpClassOps->enmClassType] = pEndpointClass; 857 LogFlowFunc((": Initialized endpoint class \"%s\" rc=%Rrc\n", pEpClassOps->p cszName, rc));906 LogFlowFunc((": Initialized endpoint class \"%s\" rc=%Rrc\n", pEpClassOps->pszName, rc)); 858 907 return VINF_SUCCESS; 859 908 } … … 871 920 } 872 921 922 873 923 /** 874 924 * Worker terminating all endpoint classes. … … 906 956 MMR3HeapFree(pEndpointClass); 907 957 } 958 908 959 909 960 /** … … 949 1000 } 950 1001 1002 951 1003 /** 952 1004 * Records the required processing time of a request. … … 983 1035 } 984 1036 1037 985 1038 /** 986 1039 * Registers advanced statistics for the given endpoint. … … 1222 1275 return rc; 1223 1276 } 1277 1224 1278 1225 1279 /** … … 1264 1318 } 1265 1319 1320 1266 1321 /** 1267 1322 * Initialize the async completion manager. … … 1284 1339 } 1285 1340 1341 1286 1342 /** 1287 1343 * Terminates the async completion manager. … … 1301 1357 return VINF_SUCCESS; 1302 1358 } 1359 1303 1360 1304 1361 /** … … 1359 1416 } 1360 1417 } 1418 1361 1419 1362 1420 /** … … 1387 1445 } 1388 1446 1447 1389 1448 /** 1390 1449 * Puts a task in one of the caches. … … 1408 1467 } 1409 1468 1410 static PPDMASYNCCOMPLETIONENDPOINT pdmR3AsyncCompletionFindEndpointWithUri(PPDMASYNCCOMPLETIONEPCLASS pEndpointClass, 1411 const char *pszUri) 1469 1470 static PPDMASYNCCOMPLETIONENDPOINT 1471 pdmR3AsyncCompletionFindEndpointWithUri(PPDMASYNCCOMPLETIONEPCLASS pEndpointClass, const char *pszUri) 1412 1472 { 1413 1473 PPDMASYNCCOMPLETIONENDPOINT pEndpoint = pEndpointClass->pEndpointsHead; … … 1424 1484 } 1425 1485 1486 1487 /** 1488 * Opens a file as an async completion endpoint. 1489 * 1490 * @returns VBox status code. 1491 * @param ppEndpoint Where to store the opaque endpoint handle on success. 1492 * @param pszFilename Path to the file which is to be opened. (UTF-8) 1493 * @param fFlags Open flags, see grp_pdmacep_file_flags. 1494 * @param pTemplate Handle to the completion callback template to use 1495 * for this end point. 1496 */ 1426 1497 VMMR3DECL(int) PDMR3AsyncCompletionEpCreateForFile(PPPDMASYNCCOMPLETIONENDPOINT ppEndpoint, 1427 1498 const char *pszFilename, uint32_t fFlags, … … 1519 1590 } 1520 1591 1592 1593 /** 1594 * Closes a endpoint waiting for any pending tasks to finish. 1595 * 1596 * @returns nothing. 1597 * @param pEndpoint Handle of the endpoint. 1598 */ 1521 1599 VMMR3DECL(void) PDMR3AsyncCompletionEpClose(PPDMASYNCCOMPLETIONENDPOINT pEndpoint) 1522 1600 { … … 1566 1644 } 1567 1645 1646 1647 /** 1648 * Creates a read task on the given endpoint. 1649 * 1650 * @returns VBox status code. 1651 * @param pEndpoint The file endpoint to read from. 1652 * @param off Where to start reading from. 1653 * @param paSegments Scatter gather list to store the data in. 1654 * @param cSegments Number of segments in the list. 1655 * @param cbRead The overall number of bytes to read. 1656 * @param pvUser Opaque user data returned in the completion callback 1657 * upon completion of the task. 1658 * @param ppTask Where to store the task handle on success. 1659 */ 1568 1660 VMMR3DECL(int) PDMR3AsyncCompletionEpRead(PPDMASYNCCOMPLETIONENDPOINT pEndpoint, RTFOFF off, 1569 1661 PCRTSGSEG paSegments, unsigned cSegments, … … 1599 1691 } 1600 1692 1693 1694 /** 1695 * Creates a write task on the given endpoint. 1696 * 1697 * @returns VBox status code. 1698 * @param pEndpoint The file endpoint to write to. 1699 * @param off Where to start writing at. 1700 * @param paSegments Scatter gather list of the data to write. 1701 * @param cSegments Number of segments in the list. 1702 * @param cbWrite The overall number of bytes to write. 1703 * @param pvUser Opaque user data returned in the completion callback 1704 * upon completion of the task. 1705 * @param ppTask Where to store the task handle on success. 1706 */ 1601 1707 VMMR3DECL(int) PDMR3AsyncCompletionEpWrite(PPDMASYNCCOMPLETIONENDPOINT pEndpoint, RTFOFF off, 1602 1708 PCRTSGSEG paSegments, unsigned cSegments, … … 1632 1738 } 1633 1739 1634 VMMR3DECL(int) PDMR3AsyncCompletionEpFlush(PPDMASYNCCOMPLETIONENDPOINT pEndpoint, 1635 void *pvUser, 1636 PPPDMASYNCCOMPLETIONTASK ppTask) 1740 1741 /** 1742 * Creates a flush task on the given endpoint. 1743 * 1744 * Every read and write task initiated before the flush task is 1745 * finished upon completion of this task. 1746 * 1747 * @returns VBox status code. 1748 * @param pEndpoint The file endpoint to flush. 1749 * @param pvUser Opaque user data returned in the completion callback 1750 * upon completion of the task. 1751 * @param ppTask Where to store the task handle on success. 1752 */ 1753 VMMR3DECL(int) PDMR3AsyncCompletionEpFlush(PPDMASYNCCOMPLETIONENDPOINT pEndpoint, void *pvUser, PPPDMASYNCCOMPLETIONTASK ppTask) 1637 1754 { 1638 1755 AssertPtrReturn(pEndpoint, VERR_INVALID_POINTER); … … 1654 1771 } 1655 1772 1773 1774 /** 1775 * Queries the size of an endpoint. 1776 * 1777 * Not that some endpoints may not support this and will return an error 1778 * (sockets for example). 1779 * 1780 * @returns VBox status code. 1781 * @retval VERR_NOT_SUPPORTED if the endpoint does not support this operation. 1782 * @param pEndpoint The file endpoint. 1783 * @param pcbSize Where to store the size of the endpoint. 1784 */ 1656 1785 VMMR3DECL(int) PDMR3AsyncCompletionEpGetSize(PPDMASYNCCOMPLETIONENDPOINT pEndpoint, 1657 1786 uint64_t *pcbSize) … … 1665 1794 } 1666 1795 1667 VMMR3DECL(int) PDMR3AsyncCompletionEpSetSize(PPDMASYNCCOMPLETIONENDPOINT pEndpoint, 1668 uint64_t cbSize) 1796 1797 /** 1798 * Sets the size of an endpoint. 1799 * 1800 * Not that some endpoints may not support this and will return an error 1801 * (sockets for example). 1802 * 1803 * @returns VBox status code. 1804 * @retval VERR_NOT_SUPPORTED if the endpoint does not support this operation. 1805 * @param pEndpoint The file endpoint. 1806 * @param cbSize The size to set. 1807 * 1808 * @note PDMR3AsyncCompletionEpFlush should be called before this operation is executed. 1809 */ 1810 VMMR3DECL(int) PDMR3AsyncCompletionEpSetSize(PPDMASYNCCOMPLETIONENDPOINT pEndpoint, uint64_t cbSize) 1669 1811 { 1670 1812 AssertPtrReturn(pEndpoint, VERR_INVALID_POINTER); … … 1675 1817 } 1676 1818 1677 VMMR3DECL(int) PDMR3AsyncCompletionEpSetBwMgr(PPDMASYNCCOMPLETIONENDPOINT pEndpoint, 1678 const char *pcszBwMgr) 1819 1820 /** 1821 * Assigns or removes a bandwidth control manager to/from the endpoint. 1822 * 1823 * @returns VBox status code. 1824 * @param pEndpoint The endpoint. 1825 * @param pszBwMgr The identifer of the new bandwidth manager to assign 1826 * or NULL to remove the current one. 1827 */ 1828 VMMR3DECL(int) PDMR3AsyncCompletionEpSetBwMgr(PPDMASYNCCOMPLETIONENDPOINT pEndpoint, const char *pszBwMgr) 1679 1829 { 1680 1830 AssertPtrReturn(pEndpoint, VERR_INVALID_POINTER); … … 1683 1833 1684 1834 int rc = VINF_SUCCESS; 1685 if (p cszBwMgr)1686 { 1687 pBwMgrNew = pdmacBwMgrFindById(pEndpoint->pEpClass, p cszBwMgr);1835 if (pszBwMgr) 1836 { 1837 pBwMgrNew = pdmacBwMgrFindById(pEndpoint->pEpClass, pszBwMgr); 1688 1838 if (pBwMgrNew) 1689 pdmacBwMgrRe f(pBwMgrNew);1839 pdmacBwMgrRetain(pBwMgrNew); 1690 1840 else 1691 1841 rc = VERR_NOT_FOUND; … … 1696 1846 pBwMgrOld = ASMAtomicXchgPtrT(&pEndpoint->pBwMgr, pBwMgrNew, PPDMACBWMGR); 1697 1847 if (pBwMgrOld) 1698 pdmacBwMgr Unref(pBwMgrOld);1848 pdmacBwMgrRelease(pBwMgrOld); 1699 1849 } 1700 1850 … … 1702 1852 } 1703 1853 1854 1855 /** 1856 * Cancels an async completion task. 1857 * 1858 * If you want to use this method, you have to take great create to make sure 1859 * you will never attempt cancel a task which has been completed. Since there is 1860 * no reference counting or anything on the task it self, you have to serialize 1861 * the cancelation and completion paths such that the aren't racing one another. 1862 * 1863 * @returns VBox status code 1864 * @param pTask The Task to cancel. 1865 */ 1704 1866 VMMR3DECL(int) PDMR3AsyncCompletionTaskCancel(PPDMASYNCCOMPLETIONTASK pTask) 1705 1867 { … … 1708 1870 } 1709 1871 1710 VMMR3DECL(int) PDMR3AsyncCompletionBwMgrSetMaxForFile(PVM pVM, const char *pcszBwMgr, uint32_t cbMaxNew) 1711 { 1712 AssertPtrReturn(pVM, VERR_INVALID_POINTER); 1713 AssertPtrReturn(pcszBwMgr, VERR_INVALID_POINTER); 1872 1873 /** 1874 * Changes the limit of a bandwidth manager for file endpoints to the given value. 1875 * 1876 * @returns VBox status code. 1877 * @param pUVM The user mode VM handle. 1878 * @param pszBwMgr The identifer of the bandwidth manager to change. 1879 * @param cbMaxNew The new maximum for the bandwidth manager in bytes/sec. 1880 */ 1881 VMMR3DECL(int) PDMR3AsyncCompletionBwMgrSetMaxForFile(PUVM pUVM, const char *pszBwMgr, uint32_t cbMaxNew) 1882 { 1883 UVM_ASSERT_VALID_EXT_RETURN(pUVM, VERR_INVALID_VM_HANDLE); 1884 PVM pVM = pUVM->pVM; 1885 VM_ASSERT_VALID_EXT_RETURN(pVM, VERR_INVALID_VM_HANDLE); 1886 AssertPtrReturn(pszBwMgr, VERR_INVALID_POINTER); 1714 1887 1715 1888 int rc = VINF_SUCCESS; 1716 1889 PPDMASYNCCOMPLETIONEPCLASS pEpClass = pVM->pUVM->pdm.s.apAsyncCompletionEndpointClass[PDMASYNCCOMPLETIONEPCLASSTYPE_FILE]; 1717 PPDMACBWMGR pBwMgr = pdmacBwMgrFindById(pEpClass, p cszBwMgr);1890 PPDMACBWMGR pBwMgr = pdmacBwMgrFindById(pEpClass, pszBwMgr); 1718 1891 if (pBwMgr) 1719 1892 { -
trunk/src/VBox/VMM/VMMR3/PDMDriver.cpp
r44355 r44358 5 5 6 6 /* 7 * Copyright (C) 2006-201 2Oracle Corporation7 * Copyright (C) 2006-2013 Oracle Corporation 8 8 * 9 9 * This file is part of VirtualBox Open Source Edition (OSE), as … … 968 968 PDMR3BlkCacheReleaseDriver(pVM, pCur); 969 969 970 #ifdef VBOX_WITH_PDM_ASYNC_COMPLETION 971 /* Completion templates.*/ 972 pdmR3AsyncCompletionTemplateDestroyDriver(pVM, pCur); 973 #endif 974 970 975 /* Finally, the driver it self. */ 971 976 bool fHyperHeap = pCur->Internal.s.fHyperHeap; … … 1545 1550 pDrvIns->pReg->szName, pDrvIns->iInstance, ppTemplate, pfnCompleted, pszDesc, pszDesc)); 1546 1551 1547 int rc = PDMR3AsyncCompletionTemplateCreateDriver(pDrvIns->Internal.s.pVMR3, pDrvIns, ppTemplate, pfnCompleted, pvTemplateUser, pszDesc);1552 int rc = pdmR3AsyncCompletionTemplateCreateDriver(pDrvIns->Internal.s.pVMR3, pDrvIns, ppTemplate, pfnCompleted, pvTemplateUser, pszDesc); 1548 1553 1549 1554 LogFlow(("pdmR3DrvHlp_AsyncCompletionTemplateCreate: caller='%s'/%d: returns %Rrc *ppThread=%p\n", pDrvIns->pReg->szName, -
trunk/src/VBox/VMM/VMMR3/PDMUsb.cpp
r44351 r44358 5 5 6 6 /* 7 * Copyright (C) 2006-20 07Oracle Corporation7 * Copyright (C) 2006-2013 Oracle Corporation 8 8 * 9 9 * This file is part of VirtualBox Open Source Edition (OSE), as … … 970 970 //SSMR3DeregisterUsb(pVM, pUsbIns, NULL, 0); 971 971 pdmR3ThreadDestroyUsb(pVM, pUsbIns); 972 #ifdef VBOX_WITH_PDM_ASYNC_COMPLETION 973 pdmR3AsyncCompletionTemplateDestroyUsb(pVM, pUsbIns); 974 #endif 972 975 973 976 /* -
trunk/src/VBox/VMM/include/PDMAsyncCompletionInternal.h
r43599 r44358 5 5 6 6 /* 7 * Copyright (C) 2006-201 0Oracle Corporation7 * Copyright (C) 2006-2013 Oracle Corporation 8 8 * 9 9 * This file is part of VirtualBox Open Source Edition (OSE), as … … 39 39 uint32_t u32Version; 40 40 /** Name of the endpoint class. */ 41 const char *p cszName;41 const char *pszName; 42 42 /** Class type. */ 43 43 PDMASYNCCOMPLETIONEPCLASSTYPE enmClassType; … … 267 267 } PDMASYNCCOMPLETIONTASK; 268 268 269 /**270 * Called by the endpoint if a task has finished.271 *272 * @returns nothing273 * @param pTask Pointer to the finished task.274 * @param rc Status code of the completed request.275 * @param fCallCompletionHandler Flag whether the completion handler should be called to276 * inform the owner of the task that it has completed.277 */278 269 void pdmR3AsyncCompletionCompleteTask(PPDMASYNCCOMPLETIONTASK pTask, int rc, bool fCallCompletionHandler); 279 280 /**281 * Checks if the endpoint is allowed to transfer the given amount of bytes.282 *283 * @returns true if the endpoint is allowed to transfer the data.284 * false otherwise285 * @param pEndpoint The endpoint.286 * @param cbTransfer The number of bytes to transfer.287 * @param pmsWhenNext Where to store the number of milliseconds288 * until the bandwidth is refreshed.289 * Only set if false is returned.290 */291 270 bool pdmacEpIsTransferAllowed(PPDMASYNCCOMPLETIONENDPOINT pEndpoint, uint32_t cbTransfer, RTMSINTERVAL *pmsWhenNext); 292 271 -
trunk/src/VBox/VMM/include/PDMInternal.h
r44355 r44358 26 26 #include <VBox/vmm/pdmasynccompletion.h> 27 27 #ifdef VBOX_WITH_NETSHAPER 28 #include <VBox/vmm/pdmnetshaper.h> 29 #endif /* VBOX_WITH_NETSHAPER */ 28 # include <VBox/vmm/pdmnetshaper.h> 29 #endif 30 #ifdef VBOX_WITH_PDM_ASYNC_COMPLETION 31 # include <VBox/vmm/pdmasynccompletion.h> 32 #endif 30 33 #include <VBox/vmm/pdmblkcache.h> 31 34 #include <VBox/vmm/pdmcommon.h> … … 1208 1211 int pdmR3AsyncCompletionTerm(PVM pVM); 1209 1212 void pdmR3AsyncCompletionResume(PVM pVM); 1213 int pdmR3AsyncCompletionTemplateCreateDevice(PVM pVM, PPDMDEVINS pDevIns, PPPDMASYNCCOMPLETIONTEMPLATE ppTemplate, PFNPDMASYNCCOMPLETEDEV pfnCompleted, const char *pszDesc); 1214 int pdmR3AsyncCompletionTemplateCreateDriver(PVM pVM, PPDMDRVINS pDrvIns, PPPDMASYNCCOMPLETIONTEMPLATE ppTemplate, 1215 PFNPDMASYNCCOMPLETEDRV pfnCompleted, void *pvTemplateUser, const char *pszDesc); 1216 int pdmR3AsyncCompletionTemplateCreateUsb(PVM pVM, PPDMUSBINS pUsbIns, PPPDMASYNCCOMPLETIONTEMPLATE ppTemplate, PFNPDMASYNCCOMPLETEUSB pfnCompleted, const char *pszDesc); 1217 int pdmR3AsyncCompletionTemplateDestroyDevice(PVM pVM, PPDMDEVINS pDevIns); 1218 int pdmR3AsyncCompletionTemplateDestroyDriver(PVM pVM, PPDMDRVINS pDrvIns); 1219 int pdmR3AsyncCompletionTemplateDestroyUsb(PVM pVM, PPDMUSBINS pUsbIns); 1210 1220 #endif 1211 1221
Note:
See TracChangeset
for help on using the changeset viewer.