Lines Matching defs:pQueue

42 DECLINLINE(void)            pdmR3QueueFreeItem(PPDMQUEUE pQueue, PPDMQUEUEITEMCORE pItem);
43 static bool pdmR3QueueFlush(PPDMQUEUE pQueue);
77 PPDMQUEUE pQueue;
80 rc = MMHyperAlloc(pVM, cb, 0, MM_TAG_PDM_QUEUE, (void **)&pQueue );
82 rc = MMR3HeapAllocZEx(pVM, MM_TAG_PDM_QUEUE, cb, (void **)&pQueue);
89 pQueue->pVMR3 = pVM;
90 pQueue->pVMR0 = fRZEnabled ? pVM->pVMR0 : NIL_RTR0PTR;
91 pQueue->pVMRC = fRZEnabled ? pVM->pVMRC : NIL_RTRCPTR;
92 pQueue->pszName = pszName;
93 pQueue->cMilliesInterval = cMilliesInterval;
94 //pQueue->pTimer = NULL;
95 pQueue->cbItem = (uint32_t)cbItem;
96 pQueue->cItems = cItems;
97 //pQueue->pPendingR3 = NULL;
98 //pQueue->pPendingR0 = NULL;
99 //pQueue->pPendingRC = NULL;
100 pQueue->iFreeHead = cItems;
101 //pQueue->iFreeTail = 0;
102 PPDMQUEUEITEMCORE pItem = (PPDMQUEUEITEMCORE)((char *)pQueue + RT_ALIGN_Z(RT_OFFSETOF(PDMQUEUE, aFreeItems[cItems + PDMQUEUE_FREE_SLACK]), 16));
105 pQueue->aFreeItems[i].pItemR3 = pItem;
108 pQueue->aFreeItems[i].pItemR0 = MMHyperR3ToR0(pVM, pItem);
109 pQueue->aFreeItems[i].pItemRC = MMHyperR3ToRC(pVM, pItem);
118 rc = TMR3TimerCreateInternal(pVM, TMCLOCK_REAL, pdmR3QueueTimer, pQueue, "Queue timer", &pQueue->pTimer);
121 rc = TMTimerSetMillies(pQueue->pTimer, cMilliesInterval);
125 int rc2 = TMR3TimerDestroy(pQueue->pTimer); AssertRC(rc2);
133 MMHyperFree(pVM, pQueue);
135 MMR3HeapFree(pQueue);
143 pQueue->pNext = pUVM->pdm.s.pQueuesTimer;
144 pUVM->pdm.s.pQueuesTimer = pQueue;
161 pUVM->pdm.s.pQueuesForced = pQueue;
167 pPrev->pNext = pQueue;
175 STAMR3RegisterF(pVM, &pQueue->cbItem, STAMTYPE_U32, STAMVISIBILITY_ALWAYS, STAMUNIT_BYTES, "Item size.", "/PDM/Queue/%s/cbItem", pQueue->pszName);
176 STAMR3RegisterF(pVM, &pQueue->cItems, STAMTYPE_U32, STAMVISIBILITY_ALWAYS, STAMUNIT_COUNT, "Queue size.", "/PDM/Queue/%s/cItems", pQueue->pszName);
177 STAMR3RegisterF(pVM, &pQueue->StatAllocFailures, STAMTYPE_COUNTER, STAMVISIBILITY_ALWAYS, STAMUNIT_OCCURENCES, "PDMQueueAlloc failures.", "/PDM/Queue/%s/AllocFailures", pQueue->pszName);
178 STAMR3RegisterF(pVM, &pQueue->StatInsert, STAMTYPE_COUNTER, STAMVISIBILITY_ALWAYS, STAMUNIT_CALLS, "Calls to PDMQueueInsert.", "/PDM/Queue/%s/Insert", pQueue->pszName);
179 STAMR3RegisterF(pVM, &pQueue->StatFlush, STAMTYPE_COUNTER, STAMVISIBILITY_ALWAYS, STAMUNIT_CALLS, "Calls to pdmR3QueueFlush.", "/PDM/Queue/%s/Flush", pQueue->pszName);
180 STAMR3RegisterF(pVM, &pQueue->StatFlushLeftovers, STAMTYPE_COUNTER, STAMVISIBILITY_ALWAYS, STAMUNIT_OCCURENCES, "Left over items after flush.", "/PDM/Queue/%s/FlushLeftovers", pQueue->pszName);
182 STAMR3RegisterF(pVM, &pQueue->StatFlushPrf, STAMTYPE_PROFILE, STAMVISIBILITY_ALWAYS, STAMUNIT_CALLS, "Profiling pdmR3QueueFlush.", "/PDM/Queue/%s/FlushPrf", pQueue->pszName);
183 STAMR3RegisterF(pVM, (void *)&pQueue->cStatPending, STAMTYPE_U32, STAMVISIBILITY_ALWAYS, STAMUNIT_COUNT, "Pending items.", "/PDM/Queue/%s/Pending", pQueue->pszName);
186 *ppQueue = pQueue;
226 PPDMQUEUE pQueue;
227 int rc = pdmR3QueueCreate(pVM, cbItem, cItems, cMilliesInterval, fRZEnabled, pszName, &pQueue);
230 pQueue->enmType = PDMQUEUETYPE_DEV;
231 pQueue->u.Dev.pDevIns = pDevIns;
232 pQueue->u.Dev.pfnCallback = pfnCallback;
234 *ppQueue = pQueue;
272 PPDMQUEUE pQueue;
273 int rc = pdmR3QueueCreate(pVM, cbItem, cItems, cMilliesInterval, false, pszName, &pQueue);
276 pQueue->enmType = PDMQUEUETYPE_DRV;
277 pQueue->u.Drv.pDrvIns = pDrvIns;
278 pQueue->u.Drv.pfnCallback = pfnCallback;
280 *ppQueue = pQueue;
318 PPDMQUEUE pQueue;
319 int rc = pdmR3QueueCreate(pVM, cbItem, cItems, cMilliesInterval, fRZEnabled, pszName, &pQueue);
322 pQueue->enmType = PDMQUEUETYPE_INTERNAL;
323 pQueue->u.Int.pfnCallback = pfnCallback;
325 *ppQueue = pQueue;
362 PPDMQUEUE pQueue;
363 int rc = pdmR3QueueCreate(pVM, cbItem, cItems, cMilliesInterval, false, pszName, &pQueue);
366 pQueue->enmType = PDMQUEUETYPE_EXTERNAL;
367 pQueue->u.Ext.pvUser = pvUser;
368 pQueue->u.Ext.pfnCallback = pfnCallback;
370 *ppQueue = pQueue;
382 * @param pQueue Queue to destroy.
385 VMMR3_INT_DECL(int) PDMR3QueueDestroy(PPDMQUEUE pQueue)
387 LogFlow(("PDMR3QueueDestroy: pQueue=%p\n", pQueue));
392 if (!pQueue)
394 Assert(pQueue && pQueue->pVMR3);
395 PVM pVM = pQueue->pVMR3;
403 if (pQueue->pTimer)
405 if (pUVM->pdm.s.pQueuesTimer != pQueue)
410 if (pCur->pNext == pQueue)
412 pCur->pNext = pQueue->pNext;
420 pUVM->pdm.s.pQueuesTimer = pQueue->pNext;
424 if (pUVM->pdm.s.pQueuesForced != pQueue)
429 if (pCur->pNext == pQueue)
431 pCur->pNext = pQueue->pNext;
439 pUVM->pdm.s.pQueuesForced = pQueue->pNext;
441 pQueue->pNext = NULL;
442 pQueue->pVMR3 = NULL;
448 STAMR3DeregisterF(pVM->pUVM, "/PDM/Queue/%s/cbItem", pQueue->pszName);
453 if (pQueue->pTimer)
455 TMR3TimerDestroy(pQueue->pTimer);
456 pQueue->pTimer = NULL;
458 if (pQueue->pVMRC)
460 pQueue->pVMRC = NIL_RTRCPTR;
461 pQueue->pVMR0 = NIL_RTR0PTR;
462 MMHyperFree(pVM, pQueue);
465 MMR3HeapFree(pQueue);
496 PPDMQUEUE pQueue = pUVM->pdm.s.pQueuesForced;
499 while (pQueue)
501 if ( pQueue->enmType == PDMQUEUETYPE_DEV
502 && pQueue->u.Dev.pDevIns == pDevIns)
504 PPDMQUEUE pQueueDestroy = pQueue;
505 pQueue = pQueue->pNext;
510 pQueue = pQueue->pNext;
514 pQueue = pQueueNext;
516 } while (pQueue);
548 PPDMQUEUE pQueue = pUVM->pdm.s.pQueuesForced;
551 while (pQueue)
553 if ( pQueue->enmType == PDMQUEUETYPE_DRV
554 && pQueue->u.Drv.pDrvIns == pDrvIns)
556 PPDMQUEUE pQueueDestroy = pQueue;
557 pQueue = pQueue->pNext;
562 pQueue = pQueue->pNext;
566 pQueue = pQueueNext;
568 } while (pQueue);
588 PPDMQUEUE pQueue = pUVM->pdm.s.pQueuesForced;
591 while (pQueue)
593 if (pQueue->pVMRC)
595 pQueue->pVMRC = pVM->pVMRC;
598 if (pQueue->pPendingRC)
600 pQueue->pPendingRC += offDelta;
601 PPDMQUEUEITEMCORE pCur = (PPDMQUEUEITEMCORE)MMHyperRCToR3(pVM, pQueue->pPendingRC);
610 uint32_t i = pQueue->iFreeTail;
611 while (i != pQueue->iFreeHead)
613 pQueue->aFreeItems[i].pItemRC = MMHyperR3ToRC(pVM, pQueue->aFreeItems[i].pItemR3);
614 i = (i + 1) % (pQueue->cItems + PDMQUEUE_FREE_SLACK);
619 pQueue = pQueue->pNext;
623 pQueue = pQueueNext;
625 } while (pQueue);
677 * @param pQueue The queue.
679 static bool pdmR3QueueFlush(PPDMQUEUE pQueue)
681 STAM_PROFILE_START(&pQueue->StatFlushPrf,p);
686 PPDMQUEUEITEMCORE pItems = ASMAtomicXchgPtrT(&pQueue->pPendingR3, NULL, PPDMQUEUEITEMCORE);
687 RTRCPTR pItemsRC = ASMAtomicXchgRCPtr(&pQueue->pPendingRC, NIL_RTRCPTR);
688 RTR0PTR pItemsR0 = ASMAtomicXchgR0Ptr(&pQueue->pPendingR0, NIL_RTR0PTR);
714 PPDMQUEUEITEMCORE pInsert = (PPDMQUEUEITEMCORE)MMHyperRCToR3(pQueue->pVMR3, pItemsRC);
726 PPDMQUEUEITEMCORE pInsert = (PPDMQUEUEITEMCORE)MMHyperR0ToR3(pQueue->pVMR3, pItemsR0);
736 Log2(("pdmR3QueueFlush: pQueue=%p enmType=%d pItems=%p\n", pQueue, pQueue->enmType, pItems));
737 switch (pQueue->enmType)
742 if (!pQueue->u.Dev.pfnCallback(pQueue->u.Dev.pDevIns, pItems))
746 pdmR3QueueFreeItem(pQueue, pCur);
753 if (!pQueue->u.Drv.pfnCallback(pQueue->u.Drv.pDrvIns, pItems))
757 pdmR3QueueFreeItem(pQueue, pCur);
764 if (!pQueue->u.Int.pfnCallback(pQueue->pVMR3, pItems))
768 pdmR3QueueFreeItem(pQueue, pCur);
775 if (!pQueue->u.Ext.pfnCallback(pQueue->u.Ext.pvUser, pItems))
779 pdmR3QueueFreeItem(pQueue, pCur);
784 AssertMsgFailed(("Invalid queue type %d\n", pQueue->enmType));
811 if (ASMAtomicCmpXchgPtr(&pQueue->pPendingR3, pItems, NULL))
813 PPDMQUEUEITEMCORE pPending = ASMAtomicXchgPtrT(&pQueue->pPendingR3, NULL, PPDMQUEUEITEMCORE);
824 STAM_REL_COUNTER_INC(&pQueue->StatFlushLeftovers);
825 STAM_PROFILE_STOP(&pQueue->StatFlushPrf,p);
829 STAM_PROFILE_STOP(&pQueue->StatFlushPrf,p);
837 * @param pQueue The queue.
840 DECLINLINE(void) pdmR3QueueFreeItem(PPDMQUEUE pQueue, PPDMQUEUEITEMCORE pItem)
842 VM_ASSERT_EMT(pQueue->pVMR3);
844 int i = pQueue->iFreeHead;
845 int iNext = (i + 1) % (pQueue->cItems + PDMQUEUE_FREE_SLACK);
847 pQueue->aFreeItems[i].pItemR3 = pItem;
848 if (pQueue->pVMRC)
850 pQueue->aFreeItems[i].pItemRC = MMHyperR3ToRC(pQueue->pVMR3, pItem);
851 pQueue->aFreeItems[i].pItemR0 = MMHyperR3ToR0(pQueue->pVMR3, pItem);
854 if (!ASMAtomicCmpXchgU32(&pQueue->iFreeHead, iNext, i))
855 AssertMsgFailed(("huh? i=%d iNext=%d iFreeHead=%d iFreeTail=%d\n", i, iNext, pQueue->iFreeHead, pQueue->iFreeTail));
856 STAM_STATS({ ASMAtomicDecU32(&pQueue->cStatPending); });
870 PPDMQUEUE pQueue = (PPDMQUEUE)pvUser;
871 Assert(pTimer == pQueue->pTimer); NOREF(pTimer); NOREF(pVM);
873 if ( pQueue->pPendingR3
874 || pQueue->pPendingR0
875 || pQueue->pPendingRC)
876 pdmR3QueueFlush(pQueue);
877 int rc = TMTimerSetMillies(pQueue->pTimer, pQueue->cMilliesInterval);