- Timestamp:
- Jul 17, 2008 11:04:13 PM (16 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Devices/Network/SrvIntNetR0.cpp
r10733 r10734 666 666 static void intnetR0TrunkIfSend(PINTNETTRUNKIF pThis, PINTNETNETWORK pNetwork, uint32_t fDst, PINTNETSG pSG, bool fTrunkLocked) 667 667 { 668 Assert(fTrunkLocked); 669 /** @todo implement + move? */ 668 /* 669 * Quick sanity check. 670 */ 671 AssertPtr(pThis); 672 AssertPtr(pNetwork); 673 AssertPtr(pSG); 674 Assert(fDst); 675 AssertReturnVoid(pThis->pIfPort); 676 677 /* 678 * Temporarily leave the network lock while transmitting the frame. 679 * 680 * Note that we're relying on the out-bound lock to serialize threads down 681 * in INTNETR0IfSend. It's theoretically possible for there to be race now 682 * because I didn't implement async SG handling yet. Which is why we currently 683 * require the trunk to be locked, well, one of the reasons. 684 */ 685 AssertReturnVoid(fTrunkLocked); /* to be removed. */ 686 687 int rc; 688 if ( fTrunkLocked 689 || intnetR0TrunkIfRetain(pThis)) 690 { 691 rc = RTSemFastMutexRelease(pNetwork->FastMutex); 692 AssertRC(rc); 693 if (RT_SUCCESS(rc)) 694 { 695 if ( fTrunkLocked 696 || intnetR0TrunkIfOutLock(pThis)) 697 { 698 rc = pThis->pIfPort->pfnXmit(pThis->pIfPort, pSG, fDst); 699 700 if (!fTrunkLocked) 701 intnetR0TrunkIfOutUnlock(pThis); 702 } 703 else 704 { 705 AssertFailed(); 706 rc = VERR_SEM_DESTROYED; 707 } 708 709 int rc2 = RTSemFastMutexRequest(pNetwork->FastMutex); 710 AssertRC(rc2); 711 } 712 713 if (!fTrunkLocked) 714 intnetR0TrunkIfRelease(pThis); 715 } 716 else 717 { 718 AssertFailed(); 719 rc = VERR_SEM_DESTROYED; 720 } 721 722 /** @todo failure statistics? */ 670 723 } 671 724
Note:
See TracChangeset
for help on using the changeset viewer.