Changeset 21151 in vbox for trunk/src/VBox/VMM/PDMQueue.cpp
- Timestamp:
- Jul 2, 2009 11:47:24 AM (16 years ago)
- svn:sync-xref-src-repo-rev:
- 49434
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/VMM/PDMQueue.cpp
r21148 r21151 674 674 && !pItemsRC 675 675 && !pItemsR0) 676 /* Somebody was racing us. */676 /* Somebody may be racing us ... never mind. */ 677 677 return true; 678 678 … … 723 723 while (pItems) 724 724 { 725 if (!pQueue->u.Dev.pfnCallback(pQueue->u.Dev.pDevIns, pItems)) 726 break; 725 727 pCur = pItems; 726 728 pItems = pItems->pNextR3; 727 if (!pQueue->u.Dev.pfnCallback(pQueue->u.Dev.pDevIns, pCur))728 break;729 729 pdmR3QueueFree(pQueue, pCur); 730 730 } … … 734 734 while (pItems) 735 735 { 736 if (!pQueue->u.Drv.pfnCallback(pQueue->u.Drv.pDrvIns, pItems)) 737 break; 736 738 pCur = pItems; 737 739 pItems = pItems->pNextR3; 738 if (!pQueue->u.Drv.pfnCallback(pQueue->u.Drv.pDrvIns, pCur))739 break;740 740 pdmR3QueueFree(pQueue, pCur); 741 741 } … … 745 745 while (pItems) 746 746 { 747 if (!pQueue->u.Int.pfnCallback(pQueue->pVMR3, pItems)) 748 break; 747 749 pCur = pItems; 748 750 pItems = pItems->pNextR3; 749 if (!pQueue->u.Int.pfnCallback(pQueue->pVMR3, pCur))750 break;751 751 pdmR3QueueFree(pQueue, pCur); 752 752 } … … 756 756 while (pItems) 757 757 { 758 if (!pQueue->u.Ext.pfnCallback(pQueue->u.Ext.pvUser, pItems)) 759 break; 758 760 pCur = pItems; 759 761 pItems = pItems->pNextR3; 760 if (!pQueue->u.Ext.pfnCallback(pQueue->u.Ext.pvUser, pCur))761 break;762 762 pdmR3QueueFree(pQueue, pCur); 763 763 } … … 775 775 { 776 776 /* 777 * Shit, no! 778 * 1. Insert pCur. 779 * 2. Reverse the list. 780 * 3. Insert the LIFO at the tail of the pending list. 777 * Reverse the list. 781 778 */ 782 pCur->pNextR3 = pItems; 783 pItems = pCur; 784 785 //pCur = pItems; 779 pCur = pItems; 786 780 pItems = NULL; 787 781 while (pCur) 788 782 { 789 783 PPDMQUEUEITEMCORE pInsert = pCur; 790 pCur = p Cur->pNextR3;784 pCur = pInsert->pNextR3; 791 785 pInsert->pNextR3 = pItems; 792 786 pItems = pInsert; 793 787 } 794 788 795 if (!ASMAtomicCmpXchgPtr((void * volatile *)&pQueue->pPendingR3, pItems, NULL)) 796 { 797 pCur = pQueue->pPendingR3; 798 while (pCur->pNextR3) 799 pCur = pCur->pNextR3; 800 pCur->pNextR3 = pItems; 789 /* 790 * Insert the list at the tail of the pending list. 791 */ 792 for (;;) 793 { 794 if (ASMAtomicCmpXchgPtr((void * volatile *)&pQueue->pPendingR3, pItems, NULL)) 795 break; 796 PPDMQUEUEITEMCORE pPending = (PPDMQUEUEITEMCORE)ASMAtomicXchgPtr((void * volatile *)&pQueue->pPendingR3, NULL); 797 if (pPending) 798 { 799 pCur = pPending; 800 while (pCur->pNextR3) 801 pCur = pCur->pNextR3; 802 pCur->pNextR3 = pItems; 803 pItem = pPending; 804 } 801 805 } 802 806 return false;
Note:
See TracChangeset
for help on using the changeset viewer.