Changeset 29220 in vbox for trunk/src/VBox/Main
- Timestamp:
- May 7, 2010 3:09:53 PM (15 years ago)
- svn:sync-xref-src-repo-rev:
- 61300
- Location:
- trunk/src/VBox/Main
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Main/GuestImpl.cpp
r29005 r29220 117 117 CallbackListIter it; 118 118 for (it = mCallbackList.begin(); it != mCallbackList.end(); it++) 119 removeCtrlCallbackContext(it);119 destroyCtrlCallbackContext(it); 120 120 121 121 /* Clear process list. */ … … 467 467 int rc = VINF_SUCCESS; 468 468 469 AutoWriteLock alock(this COMMA_LOCKVAL_SRC_POS); 470 469 471 AssertPtr(pData); 470 472 CallbackListIter it = getCtrlCallbackContextByID(pData->hdr.u32ContextID); … … 473 475 if (it != mCallbackList.end()) 474 476 { 475 AutoWriteLock alock(this COMMA_LOCKVAL_SRC_POS);476 477 477 PHOSTEXECCALLBACKDATA pCBData = (HOSTEXECCALLBACKDATA*)it->pvData; 478 478 AssertPtr(pCBData); … … 581 581 int rc = VINF_SUCCESS; 582 582 583 AutoWriteLock alock(this COMMA_LOCKVAL_SRC_POS); 584 583 585 AssertPtr(pData); 584 586 CallbackListIter it = getCtrlCallbackContextByID(pData->hdr.u32ContextID); … … 589 591 AssertPtr(pCBData); 590 592 591 AutoWriteLock alock(this COMMA_LOCKVAL_SRC_POS);592 593 593 pCBData->u32PID = pData->u32PID; 594 594 pCBData->u32HandleId = pData->u32HandleId; … … 601 601 /* Allocate data buffer and copy it */ 602 602 pCBData->pvData = RTMemAlloc(pData->cbData); 603 pCBData->cbData = pData->cbData; 604 603 605 AssertReturn(pCBData->pvData, VERR_NO_MEMORY); 604 606 memcpy(pCBData->pvData, pData->pvData, pData->cbData); 605 pCBData->cbData = pData->cbData;606 607 } 607 608 else … … 646 647 } 647 648 648 void Guest::removeCtrlCallbackContext(Guest::CallbackListIter it) 649 /* No locking here; */ 650 void Guest::destroyCtrlCallbackContext(Guest::CallbackListIter it) 649 651 { 650 652 LogFlowFuncEnter(); 651 AutoWriteLock alock(this COMMA_LOCKVAL_SRC_POS);652 653 if (it->pvData) 653 654 { … … 678 679 { 679 680 LogFlowFuncEnter(); 680 AutoWriteLock alock(this COMMA_LOCKVAL_SRC_POS);681 681 uint32_t uNewContext = ASMAtomicIncU32(&mNextContextID); 682 682 if (uNewContext == UINT32_MAX) 683 683 ASMAtomicUoWriteU32(&mNextContextID, 1000); 684 684 685 /** @todo Put this stuff into a constructor! */ 685 686 CallbackContext context; 686 687 context.mContextID = uNewContext; … … 691 692 context.pProgress = pProgress; 692 693 693 mCallbackList.push_back(context); 694 if (mCallbackList.size() > 256) /* Don't let the container size get too big! */ 694 uint32_t nCallbacks; 695 { 696 AutoWriteLock alock(this COMMA_LOCKVAL_SRC_POS); 697 mCallbackList.push_back(context); 698 nCallbacks = mCallbackList.size(); 699 } 700 701 #if 0 702 if (nCallbacks > 256) /* Don't let the container size get too big! */ 695 703 { 696 704 Guest::CallbackListIter it = mCallbackList.begin(); 697 removeCtrlCallbackContext(it); 698 mCallbackList.erase(it); 699 } 705 destroyCtrlCallbackContext(it); 706 { 707 AutoWriteLock alock(this COMMA_LOCKVAL_SRC_POS); 708 mCallbackList.erase(it); 709 } 710 } 711 #endif 700 712 701 713 LogFlowFuncLeave(); … … 823 835 paParms[i++].setUInt32(aTimeoutMS); 824 836 825 /* Make sure mParent is valid, so set a read lock in this scope. */ 826 AutoReadLock alock(this COMMA_LOCKVAL_SRC_POS); 827 828 /* Forward the information to the VMM device. */ 829 AssertPtr(mParent); 830 VMMDev *vmmDev = mParent->getVMMDev(); 837 VMMDev *vmmDev; 838 { 839 /* Make sure mParent is valid, so set the read lock while using. 840 * Do not keep this lock while doing the actual call, because in the meanwhile 841 * another thread could request a write lock which would be a bad idea ... */ 842 AutoReadLock alock(this COMMA_LOCKVAL_SRC_POS); 843 844 /* Forward the information to the VMM device. */ 845 AssertPtr(mParent); 846 vmmDev = mParent->getVMMDev(); 847 } 848 831 849 if (vmmDev) 832 850 { … … 1065 1083 1066 1084 { 1067 /* Make sure mParent is valid, so set the read lock while using. */ 1068 AutoReadLock alock(this COMMA_LOCKVAL_SRC_POS); 1069 1070 /* Forward the information to the VMM device. */ 1071 AssertPtr(mParent); 1072 VMMDev *vmmDev = mParent->getVMMDev(); 1085 VMMDev *vmmDev; 1086 { 1087 /* Make sure mParent is valid, so set the read lock while using. 1088 * Do not keep this lock while doing the actual call, because in the meanwhile 1089 * another thread could request a write lock which would be a bad idea ... */ 1090 AutoReadLock alock(this COMMA_LOCKVAL_SRC_POS); 1091 1092 /* Forward the information to the VMM device. */ 1093 AssertPtr(mParent); 1094 vmmDev = mParent->getVMMDev(); 1095 } 1096 1073 1097 if (vmmDev) 1074 1098 { … … 1171 1195 } 1172 1196 } 1197 1198 { 1199 AutoWriteLock alock(this COMMA_LOCKVAL_SRC_POS); 1200 destroyCtrlCallbackContext(it); 1201 } 1173 1202 } 1174 1203 else /* PID lookup failed. */ -
trunk/src/VBox/Main/include/GuestImpl.h
r28800 r29220 151 151 CallbackListIter getCtrlCallbackContextByID(uint32_t u32ContextID); 152 152 GuestProcessIter getProcessByPID(uint32_t u32PID); 153 void removeCtrlCallbackContext(CallbackListIter it);153 void destroyCtrlCallbackContext(CallbackListIter it); 154 154 uint32_t addCtrlCallbackContext(eVBoxGuestCtrlCallbackType enmType, void *pvData, uint32_t cbData, Progress* pProgress); 155 155 # endif
Note:
See TracChangeset
for help on using the changeset viewer.