Changeset 32449 in vbox
- Timestamp:
- Sep 13, 2010 2:27:19 PM (14 years ago)
- Location:
- trunk/src/VBox/Additions/common/VBoxGuest
- Files:
-
- 4 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Additions/common/VBoxGuest/VBoxGuest.cpp
r32349 r32449 682 682 pDevExt->pIrqAckEvents = NULL; 683 683 pDevExt->PhysIrqAckEvents = NIL_RTCCPHYS; 684 pDevExt->WaitList.pHead = NULL; 685 pDevExt->WaitList.pTail = NULL; 684 RTListInit(&pDevExt->WaitList); 686 685 #ifdef VBOX_WITH_HGCM 687 pDevExt->HGCMWaitList.pHead = NULL; 688 pDevExt->HGCMWaitList.pTail = NULL; 686 RTListInit(&pDevExt->HGCMWaitList); 689 687 #endif 690 pDevExt->FreeList.pHead = NULL; 691 pDevExt->FreeList.pTail = NULL; 688 #ifdef VBOXGUEST_USE_DEFERRED_WAKE_UP 689 RTListInit(&pDevExt->WakeUpList); 690 #endif 691 RTListInit(&pDevExt->WokenUpList); 692 RTListInit(&pDevExt->FreeList); 692 693 pDevExt->f32PendingEvents = 0; 693 694 pDevExt->u32MousePosChangedSeq = 0; … … 807 808 /** 808 809 * Deletes all the items in a wait chain. 809 * @param p Wait The head of the chain.810 */ 811 static void VBoxGuestDeleteWaitList(P VBOXGUESTWAITLISTpList)812 { 813 while ( pList->pHead)810 * @param pList The head of the chain. 811 */ 812 static void VBoxGuestDeleteWaitList(PRTLISTNODE pList) 813 { 814 while (!RTListIsEmpty(pList)) 814 815 { 815 816 int rc2; 816 PVBOXGUESTWAIT pWait = pList->pHead; 817 pList->pHead = pWait->pNext; 818 819 pWait->pNext = NULL; 820 pWait->pPrev = NULL; 817 PVBOXGUESTWAIT pWait = RTListNodeGetFirst(pList, VBOXGUESTWAIT, ListNode); 818 RTListNodeRemove(&pWait->ListNode); 819 821 820 rc2 = RTSemEventMultiDestroy(pWait->Event); AssertRC(rc2); 822 821 pWait->Event = NIL_RTSEMEVENTMULTI; … … 824 823 RTMemFree(pWait); 825 824 } 826 pList->pHead = NULL;827 pList->pTail = NULL;828 825 } 829 826 … … 862 859 VBoxGuestDeleteWaitList(&pDevExt->HGCMWaitList); 863 860 #endif 861 #ifdef VBOXGUEST_USE_DEFERRED_WAKE_UP 862 VBoxGuestDeleteWaitList(&pDevExt->WakeUpList); 863 #endif 864 VBoxGuestDeleteWaitList(&pDevExt->WokenUpList); 864 865 VBoxGuestDeleteWaitList(&pDevExt->FreeList); 865 866 … … 968 969 969 970 /** 970 * Links the wait-for-event entry into the tail of the given list. 971 * 972 * @param pList The list to link it into. 973 * @param pWait The wait for event entry to append. 974 */ 975 DECLINLINE(void) VBoxGuestWaitAppend(PVBOXGUESTWAITLIST pList, PVBOXGUESTWAIT pWait) 976 { 977 const PVBOXGUESTWAIT pTail = pList->pTail; 978 pWait->pNext = NULL; 979 pWait->pPrev = pTail; 980 if (pTail) 981 pTail->pNext = pWait; 982 else 983 pList->pHead = pWait; 984 pList->pTail = pWait; 985 } 986 987 988 /** 989 * Unlinks the wait-for-event entry. 990 * 991 * @param pList The list to unlink it from. 992 * @param pWait The wait for event entry to unlink. 993 */ 994 DECLINLINE(void) VBoxGuestWaitUnlink(PVBOXGUESTWAITLIST pList, PVBOXGUESTWAIT pWait) 995 { 996 const PVBOXGUESTWAIT pPrev = pWait->pPrev; 997 const PVBOXGUESTWAIT pNext = pWait->pNext; 998 if (pNext) 999 pNext->pPrev = pPrev; 1000 else 1001 pList->pTail = pPrev; 1002 if (pPrev) 1003 pPrev->pNext = pNext; 1004 else 1005 pList->pHead = pNext; 1006 } 1007 1008 1009 /** 1010 * Allocates a wiat-for-event entry. 971 * Allocates a wait-for-event entry. 1011 972 * 1012 973 * @returns The wait-for-event entry. … … 1019 980 * Allocate it one way or the other. 1020 981 */ 1021 PVBOXGUESTWAIT pWait = pDevExt->FreeList.pTail;982 PVBOXGUESTWAIT pWait = RTListNodeGetFirst(&pDevExt->FreeList, VBOXGUESTWAIT, ListNode); 1022 983 if (pWait) 1023 984 { … … 1025 986 RTSpinlockAcquireNoInts(pDevExt->EventSpinlock, &Tmp); 1026 987 1027 pWait = pDevExt->FreeList.pTail;988 pWait = RTListNodeGetFirst(&pDevExt->FreeList, VBOXGUESTWAIT, ListNode); 1028 989 if (pWait) 1029 VBoxGuestWaitUnlink(&pDevExt->FreeList, pWait);990 RTListNodeRemove(&pWait->ListNode); 1030 991 1031 992 RTSpinlockReleaseNoInts(pDevExt->EventSpinlock, &Tmp); … … 1052 1013 return NULL; 1053 1014 } 1015 1016 pWait->ListNode.pNext = NULL; 1017 pWait->ListNode.pPrev = NULL; 1054 1018 } 1055 1019 … … 1057 1021 * Zero members just as an precaution. 1058 1022 */ 1059 pWait->pNext = NULL;1060 pWait->pPrev = NULL;1061 1023 pWait->fReqEvents = 0; 1062 1024 pWait->fResEvents = 0; 1025 #ifdef VBOXGUEST_USE_DEFERRED_WAKE_UP 1026 pWait->fPendingWakeUp = false; 1027 pWait->fFreeMe = false; 1028 #endif 1063 1029 pWait->pSession = pSession; 1064 1030 #ifdef VBOX_WITH_HGCM … … 1072 1038 /** 1073 1039 * Frees the wait-for-event entry. 1074 * The caller must own the wait spinlock! 1040 * 1041 * The caller must own the wait spinlock ! 1042 * The entry must be in a list! 1075 1043 * 1076 1044 * @param pDevExt The device extension. … … 1084 1052 pWait->pHGCMReq = NULL; 1085 1053 #endif 1086 VBoxGuestWaitAppend(&pDevExt->FreeList, pWait); 1054 #ifdef VBOXGUEST_USE_DEFERRED_WAKE_UP 1055 Assert(!pWait->fFreeMe); 1056 if (pWait->fPendingWakeUp) 1057 pWait->fFreeMe = true; 1058 else 1059 #endif 1060 { 1061 RTListNodeRemove(&pWait->ListNode); 1062 RTListAppend(&pDevExt->FreeList, &pWait->ListNode); 1063 } 1087 1064 } 1088 1065 … … 1101 1078 RTSpinlockReleaseNoInts(pDevExt->EventSpinlock, &Tmp); 1102 1079 } 1080 1081 1082 #ifdef VBOXGUEST_USE_DEFERRED_WAKE_UP 1083 /** 1084 * Processes the wake-up list. 1085 * 1086 * All entries in the wake-up list gets signalled and moved to the woken-up 1087 * list. 1088 * 1089 * @param pDevExt The device extension. 1090 */ 1091 void VBoxGuestWaitDoWakeUps(PVBOXGUESTDEVEXT pDevExt) 1092 { 1093 if (!RTListIsEmpty(&pDevExt->WakeUpList)) 1094 { 1095 RTSPINLOCKTMP Tmp = RTSPINLOCKTMP_INITIALIZER; 1096 RTSpinlockAcquireNoInts(pDevExt->EventSpinlock, &Tmp); 1097 for (;;) 1098 { 1099 int rc; 1100 PVBOXGUESTWAIT pWait = RTListNodeGetFirst(&pDevExt->WakeUpList, VBOXGUESTWAIT, ListNode); 1101 if (!pWait) 1102 break; 1103 pWait->fPendingWakeUp = true; 1104 RTSpinlockReleaseNoInts(pDevExt->EventSpinlock, &Tmp); 1105 1106 rc = RTSemEventMultiSignal(pWait->Event); 1107 AssertRC(rc); 1108 1109 RTSpinlockAcquireNoInts(pDevExt->EventSpinlock, &Tmp); 1110 pWait->fPendingWakeUp = false; 1111 if (!pWait->fFreeMe) 1112 { 1113 RTListNodeRemove(&pWait->ListNode); 1114 RTListAppend(&pDevExt->WokenUpList, &pWait->ListNode); 1115 } 1116 else 1117 { 1118 pWait->fFreeMe = false; 1119 VBoxGuestWaitFreeLocked(pDevExt, pWait); 1120 } 1121 } 1122 RTSpinlockReleaseNoInts(pDevExt->EventSpinlock, &Tmp); 1123 } 1124 } 1125 #endif /* VBOXGUEST_USE_DEFERRED_WAKE_UP */ 1103 1126 1104 1127 … … 1177 1200 /** 1178 1201 * Worker VBoxGuestCommonIOCtl_WaitEvent. 1179 * The caller enters the spinlock, we may or may not leave it. 1202 * 1203 * The caller enters the spinlock, we leave it. 1180 1204 * 1181 1205 * @returns VINF_SUCCESS if we've left the spinlock and can return immediately. … … 1198 1222 return VINF_SUCCESS; 1199 1223 } 1224 RTSpinlockReleaseNoInts(pDevExt->EventSpinlock, pTmp); 1200 1225 return VERR_TIMEOUT; 1201 1226 } … … 1234 1259 if (rc == VINF_SUCCESS) 1235 1260 return rc; 1236 RTSpinlockReleaseNoInts(pDevExt->EventSpinlock, &Tmp);1237 1261 1238 1262 if (!pInfo->u32TimeoutIn) … … 1254 1278 */ 1255 1279 RTSpinlockAcquireNoInts(pDevExt->EventSpinlock, &Tmp); 1280 RTListAppend(&pDevExt->WaitList, &pWait->ListNode); 1256 1281 rc = WaitEventCheckCondition(pDevExt, pInfo, iEvent, fReqEvents, &Tmp); 1257 1282 if (rc == VINF_SUCCESS) … … 1260 1285 return rc; 1261 1286 } 1262 VBoxGuestWaitAppend(&pDevExt->WaitList, pWait);1263 RTSpinlockReleaseNoInts(pDevExt->EventSpinlock, &Tmp);1264 1287 1265 1288 if (fInterruptible) … … 1282 1305 */ 1283 1306 RTSpinlockAcquireNoInts(pDevExt->EventSpinlock, &Tmp); 1284 VBoxGuestWaitUnlink(&pDevExt->WaitList, pWait);1285 1307 fResEvents = pWait->fResEvents; 1286 1308 VBoxGuestWaitFreeLocked(pDevExt, pWait); … … 1333 1355 { 1334 1356 RTSPINLOCKTMP Tmp = RTSPINLOCKTMP_INITIALIZER; 1335 #if defined(RT_OS_SOLARIS) 1336 RTTHREADPREEMPTSTATE State = RTTHREADPREEMPTSTATE_INITIALIZER; 1357 PVBOXGUESTWAIT pWait; 1358 PVBOXGUESTWAIT pSafe; 1359 int rc = 0; 1360 1361 Log(("VBoxGuestCommonIOCtl: CANCEL_ALL_WAITEVENTS\n")); 1362 1363 /* 1364 * Walk the event list and wake up anyone with a matching session. 1365 */ 1366 RTSpinlockAcquireNoInts(pDevExt->EventSpinlock, &Tmp); 1367 RTListForEachSafe(&pDevExt->WaitList, pWait, pSafe, VBOXGUESTWAIT, ListNode) 1368 { 1369 if (pWait->pSession == pSession) 1370 { 1371 pWait->fResEvents = UINT32_MAX; 1372 RTListNodeRemove(&pWait->ListNode); 1373 #ifdef VBOXGUEST_USE_DEFERRED_WAKE_UP 1374 RTListAppend(&pDevExt->WakeUpList, &pWait->ListNode); 1375 #else 1376 rc |= RTSemEventMultiSignal(pWait->Event); 1377 RTListAppend(&pDevExt->WokenUpList, &pWait->ListNode); 1337 1378 #endif 1338 PVBOXGUESTWAIT pWait; 1339 int rc = 0; 1340 1341 Log(("VBoxGuestCommonIOCtl: CANCEL_ALL_WAITEVENTS\n")); 1342 1343 /* 1344 * Walk the event list and wake up anyone with a matching session. 1345 * 1346 * Note! On Solaris we have to do really ugly stuff here because 1347 * RTSemEventMultiSignal cannot be called with interrupts disabled. 1348 * The hack is racy, but what we can we do... (Eliminate this 1349 * termination hack, perhaps?) 1350 */ 1351 #if defined(RT_OS_SOLARIS) 1352 RTThreadPreemptDisable(&State); 1353 RTSpinlockAcquireNoInts(pDevExt->EventSpinlock, &Tmp); 1354 do 1355 { 1356 for (pWait = pDevExt->WaitList.pHead; pWait; pWait = pWait->pNext) 1357 if ( pWait->pSession == pSession 1358 && pWait->fResEvents != UINT32_MAX) 1359 { 1360 RTSEMEVENTMULTI hEvent = pWait->Event; 1361 pWait->fResEvents = UINT32_MAX; 1362 RTSpinlockReleaseNoInts(pDevExt->EventSpinlock, &Tmp); 1363 /* HACK ALRET! This races wakeup + reuse! */ 1364 rc |= RTSemEventMultiSignal(hEvent); 1365 RTSpinlockAcquireNoInts(pDevExt->EventSpinlock, &Tmp); 1366 break; 1367 } 1368 } while (pWait); 1379 } 1380 } 1369 1381 RTSpinlockReleaseNoInts(pDevExt->EventSpinlock, &Tmp); 1370 RTThreadPreemptDisable(&State); 1371 #else 1372 RTSpinlockAcquireNoInts(pDevExt->EventSpinlock, &Tmp); 1373 for (pWait = pDevExt->WaitList.pHead; pWait; pWait = pWait->pNext) 1374 if (pWait->pSession == pSession) 1375 { 1376 pWait->fResEvents = UINT32_MAX; 1377 rc |= RTSemEventMultiSignal(pWait->Event); 1378 } 1379 RTSpinlockReleaseNoInts(pDevExt->EventSpinlock, &Tmp); 1382 Assert(rc == 0); 1383 1384 #ifdef VBOXGUEST_USE_DEFERRED_WAKE_UP 1385 VBoxGuestWaitDoWakeUps(pDevExt); 1380 1386 #endif 1381 Assert(rc == 0);1382 1387 1383 1388 return VINF_SUCCESS; … … 1530 1535 */ 1531 1536 RTSpinlockAcquireNoInts(pDevExt->EventSpinlock, &Tmp); 1537 RTListAppend(&pDevExt->HGCMWaitList, &pWait->ListNode); 1532 1538 if ((pHdr->fu32Flags & VBOX_HGCM_REQ_DONE) != 0) 1533 1539 { … … 1536 1542 return VINF_SUCCESS; 1537 1543 } 1538 VBoxGuestWaitAppend(&pDevExt->HGCMWaitList, pWait);1539 1544 RTSpinlockReleaseNoInts(pDevExt->EventSpinlock, &Tmp); 1540 1545 … … 1555 1560 LogRel(("VBoxGuestHGCMAsyncWaitCallback: wait failed! %Rrc\n", rc)); 1556 1561 1557 RTSpinlockAcquireNoInts(pDevExt->EventSpinlock, &Tmp); 1558 VBoxGuestWaitUnlink(&pDevExt->HGCMWaitList, pWait); 1559 VBoxGuestWaitFreeLocked(pDevExt, pWait); 1560 RTSpinlockReleaseNoInts(pDevExt->EventSpinlock, &Tmp); 1562 VBoxGuestWaitFreeUnlocked(pDevExt, pWait); 1561 1563 return rc; 1562 1564 } … … 2261 2263 /* 2262 2264 * Enter the spinlock and check if it's our IRQ or not. 2263 * 2264 * Note! Solaris cannot do RTSemEventMultiSignal with interrupts disabled 2265 * so we're entering the spinlock without disabling them. This works 2266 * fine as long as we never called in a nested fashion. 2267 */ 2268 #if defined(RT_OS_SOLARIS) 2269 RTSpinlockAcquire(pDevExt->EventSpinlock, &Tmp); 2270 #else 2265 */ 2271 2266 RTSpinlockAcquireNoInts(pDevExt->EventSpinlock, &Tmp); 2272 #endif2273 2267 fOurIrq = pDevExt->pVMMDevMemory->V.V1_04.fHaveEvents; 2274 2268 if (fOurIrq) … … 2287 2281 uint32_t fEvents = pReq->events; 2288 2282 PVBOXGUESTWAIT pWait; 2283 PVBOXGUESTWAIT pSafe; 2289 2284 2290 2285 Log(("VBoxGuestCommonISR: acknowledge events succeeded %#RX32\n", fEvents)); … … 2305 2300 if (fEvents & VMMDEV_EVENT_HGCM) 2306 2301 { 2307 for (pWait = pDevExt->HGCMWaitList.pHead; pWait; pWait = pWait->pNext)2308 if ( !pWait->fResEvents2309 && (pWait->pHGCMReq->fu32Flags & VBOX_HGCM_REQ_DONE))2302 RTListForEachSafe(&pDevExt->HGCMWaitList, pWait, pSafe, VBOXGUESTWAIT, ListNode) 2303 { 2304 if (pWait->pHGCMReq->fu32Flags & VBOX_HGCM_REQ_DONE) 2310 2305 { 2311 2306 pWait->fResEvents = VMMDEV_EVENT_HGCM; 2307 RTListNodeRemove(&pWait->ListNode); 2308 # ifdef VBOXGUEST_USE_DEFERRED_WAKE_UP 2309 RTListAppend(&pDevExt->WakeUpList, &pWait->ListNode); 2310 # else 2311 RTListAppend(&pDevExt->WokenUpList, &pWait->ListNode); 2312 2312 rc |= RTSemEventMultiSignal(pWait->Event); 2313 # endif 2313 2314 } 2315 } 2314 2316 fEvents &= ~VMMDEV_EVENT_HGCM; 2315 2317 } … … 2320 2322 */ 2321 2323 fEvents |= pDevExt->f32PendingEvents; 2322 for (pWait = pDevExt->WaitList.pHead; pWait; pWait = pWait->pNext) 2324 RTListForEachSafe(&pDevExt->HGCMWaitList, pWait, pSafe, VBOXGUESTWAIT, ListNode) 2325 { 2323 2326 if ( (pWait->fReqEvents & fEvents) 2324 2327 && !pWait->fResEvents) … … 2326 2329 pWait->fResEvents = pWait->fReqEvents & fEvents; 2327 2330 fEvents &= ~pWait->fResEvents; 2331 RTListNodeRemove(&pWait->ListNode); 2332 #ifdef VBOXGUEST_USE_DEFERRED_WAKE_UP 2333 RTListAppend(&pDevExt->WakeUpList, &pWait->ListNode); 2334 #else 2335 RTListAppend(&pDevExt->WokenUpList, &pWait->ListNode); 2328 2336 rc |= RTSemEventMultiSignal(pWait->Event); 2337 #endif 2329 2338 if (!fEvents) 2330 2339 break; 2331 2340 } 2341 } 2332 2342 ASMAtomicWriteU32(&pDevExt->f32PendingEvents, fEvents); 2333 2343 } … … 2339 2349 LogFlow(("VBoxGuestCommonISR: not ours\n")); 2340 2350 2351 RTSpinlockReleaseNoInts(pDevExt->EventSpinlock, &Tmp); 2352 2353 #if defined(VBOXGUEST_USE_DEFERRED_WAKE_UP) && !defined(RT_OS_WINDOWS) 2354 /* 2355 * Do wake-ups. 2356 * Note. On Windows this isn't possible at this IRQL, so a DPC will take 2357 * care of it. 2358 */ 2359 VBoxGuestWaitDoWakeUps(pDevExt); 2360 #endif 2361 2341 2362 /* 2342 2363 * Work the poll and async notification queues on OSes that implements that. 2343 * Do this outside the spinlock to prevent some recursive spinlocking. 2344 */ 2345 #if defined(RT_OS_SOLARIS) 2346 RTSpinlockRelease(pDevExt->EventSpinlock, &Tmp); 2347 #else 2348 RTSpinlockReleaseNoInts(pDevExt->EventSpinlock, &Tmp); 2349 #endif 2350 2364 * (Do this outside the spinlock to prevent some recursive spinlocking.) 2365 */ 2351 2366 if (fMousePositionChanged) 2352 2367 { -
trunk/src/VBox/Additions/common/VBoxGuest/VBoxGuestInternal.h
r32283 r32449 20 20 21 21 #include <iprt/types.h> 22 #include <iprt/list.h> 22 23 #include <iprt/semaphore.h> 23 24 #include <iprt/spinlock.h> … … 26 27 #include <VBox/VBoxGuestLib.h> 27 28 29 /** @def VBOXGUEST_USE_WAKE_UP_LIST 30 * Defer wake-up of waiting thread when defined. */ 31 #if defined(RT_OS_SOLARIS) || defined(RT_OS_WINDOWS) || defined(DOXYGEN_RUNNING) 32 # define VBOXGUEST_USE_DEFERRED_WAKE_UP 33 #endif 34 28 35 29 36 /** Pointer to the VBoxGuest per session data. */ … … 41 48 typedef struct VBOXGUESTWAIT 42 49 { 43 /** The next entry in the list. */ 44 PVBOXGUESTWAIT volatile pNext; 45 /** The previous entry in the list. */ 46 PVBOXGUESTWAIT volatile pPrev; 47 /** The event semaphore. */ 48 RTSEMEVENTMULTI Event; 50 /** The list node. */ 51 RTLISTNODE ListNode; 49 52 /** The events we are waiting on. */ 50 53 uint32_t fReqEvents; 51 54 /** The events we received. */ 52 55 uint32_t volatile fResEvents; 56 #ifdef VBOXGUEST_USE_DEFERRED_WAKE_UP 57 /** Set by VBoxGuestWaitDoWakeUps before leaving the spinlock to call 58 * RTSemEventMultiSignal. */ 59 bool volatile fPendingWakeUp; 60 /** Set by the requestor thread if it got the spinlock before the 61 * signaller. Deals with the race in VBoxGuestWaitDoWakeUps. */ 62 bool volatile fFreeMe; 63 #endif 64 /** The event semaphore. */ 65 RTSEMEVENTMULTI Event; 53 66 /** The session that's waiting. */ 54 67 PVBOXGUESTSESSION pSession; … … 58 71 #endif 59 72 } VBOXGUESTWAIT; 60 61 /**62 * VBox guest wait for event list.63 */64 typedef struct VBOXGUESTWAITLIST65 {66 /** The head. */67 PVBOXGUESTWAIT volatile pHead;68 /** The tail. */69 PVBOXGUESTWAIT volatile pTail;70 } VBOXGUESTWAITLIST;71 /** Pointer to a wait list. */72 typedef VBOXGUESTWAITLIST *PVBOXGUESTWAITLIST;73 73 74 74 … … 122 122 RTCCPHYS PhysIrqAckEvents; 123 123 /** Wait-for-event list for threads waiting for multiple events. */ 124 VBOXGUESTWAITLISTWaitList;124 RTLISTNODE WaitList; 125 125 #ifdef VBOX_WITH_HGCM 126 126 /** Wait-for-event list for threads waiting on HGCM async completion. 127 127 * The entire list is evaluated upon the arrival of an HGCM event, unlike 128 128 * the other lists which are only evaluated till the first thread has been woken up. */ 129 VBOXGUESTWAITLIST HGCMWaitList; 130 #endif 129 RTLISTNODE HGCMWaitList; 130 #endif 131 #ifdef VBOXGUEST_USE_DEFERRED_WAKE_UP 132 /** List of wait-for-event entries that needs waking up. */ 133 RTLISTNODE WakeUpList; 134 #endif 135 /** List of wait-for-event entries that has been woken up. */ 136 RTLISTNODE WokenUpList; 131 137 /** List of free wait-for-event entries. */ 132 VBOXGUESTWAITLISTFreeList;138 RTLISTNODE FreeList; 133 139 /** Mask of pending events. */ 134 140 uint32_t volatile f32PendingEvents; … … 217 223 int VBoxGuestReinitDevExtAfterHibernation(PVBOXGUESTDEVEXT pDevExt, VBOXOSTYPE enmOSType); 218 224 int VBoxGuestSetGuestCapabilities(uint32_t fOr, uint32_t fNot); 225 #ifdef VBOXGUEST_USE_DEFERRED_WAKE_UP 226 void VBoxGuestWaitDoWakeUps(PVBOXGUESTDEVEXT pDevExt); 227 #endif 219 228 220 229 int VBoxGuestCreateUserSession(PVBOXGUESTDEVEXT pDevExt, PVBOXGUESTSESSION *ppSession); -
trunk/src/VBox/Additions/common/VBoxGuest/freebsd/files_vboxguest
r32394 r32449 32 32 ${PATH_ROOT}/include/iprt/handletable.h=>include/iprt/handletable.h \ 33 33 ${PATH_ROOT}/include/iprt/initterm.h=>include/iprt/initterm.h \ 34 ${PATH_ROOT}/include/iprt/list.h=>include/iprt/list.h \ 34 35 ${PATH_ROOT}/include/iprt/lockvalidator.h=>include/iprt/lockvalidator.h \ 35 36 ${PATH_ROOT}/include/iprt/log.h=>include/iprt/log.h \ -
trunk/src/VBox/Additions/common/VBoxGuest/linux/files_vboxguest
r32404 r32449 32 32 ${PATH_ROOT}/include/iprt/heap.h=>include/iprt/heap.h \ 33 33 ${PATH_ROOT}/include/iprt/initterm.h=>include/iprt/initterm.h \ 34 ${PATH_ROOT}/include/iprt/list.h=>include/iprt/list.h \ 34 35 ${PATH_ROOT}/include/iprt/lockvalidator.h=>include/iprt/lockvalidator.h \ 35 36 ${PATH_ROOT}/include/iprt/log.h=>include/iprt/log.h \
Note:
See TracChangeset
for help on using the changeset viewer.