Lines Matching refs:pThread

45 DECLINLINE(bool) pdmR3AtomicCmpXchgState(PPDMTHREAD pThread, PDMTHREADSTATE enmNewState, PDMTHREADSTATE enmOldState)
48 ASMAtomicCmpXchgSize(&pThread->enmState, enmNewState, enmOldState, fRc);
57 * @param pThread The PDM thread.
59 static DECLCALLBACK(int) pdmR3ThreadWakeUp(PPDMTHREAD pThread)
61 RTSemEventMultiSignal(pThread->Internal.s.SleepEvent);
64 switch (pThread->Internal.s.enmType)
67 rc = pThread->u.Dev.pfnWakeUp(pThread->u.Dev.pDevIns, pThread);
71 rc = pThread->u.Usb.pfnWakeUp(pThread->u.Usb.pUsbIns, pThread);
75 rc = pThread->u.Drv.pfnWakeUp(pThread->u.Drv.pDrvIns, pThread);
79 rc = pThread->u.Int.pfnWakeUp(pThread->Internal.s.pVM, pThread);
83 rc = pThread->u.Ext.pfnWakeUp(pThread);
87 AssertMsgFailed(("%d\n", pThread->Internal.s.enmType));
105 PPDMTHREAD pThread;
106 int rc = MMR3HeapAllocZEx(pVM, MM_TAG_PDM_THREAD, sizeof(*pThread), (void **)&pThread);
110 pThread->u32Version = PDMTHREAD_VERSION;
111 pThread->enmState = PDMTHREADSTATE_INITIALIZING;
112 pThread->Thread = NIL_RTTHREAD;
113 pThread->Internal.s.pVM = pVM;
115 *ppThread = pThread;
133 PPDMTHREAD pThread = *ppThread;
139 pThread->Internal.s.pVM = pVM;
141 int rc = RTSemEventMultiCreate(&pThread->Internal.s.BlockEvent);
144 rc = RTSemEventMultiCreate(&pThread->Internal.s.SleepEvent);
152 rc = RTThreadCreate(&Thread, pdmR3ThreadMain, pThread, cbStack, enmType, RTTHREADFLAGS_WAITABLE, pszName);
157 && pThread->enmState != PDMTHREADSTATE_SUSPENDED)
165 pThread->Internal.s.pNext = NULL;
167 pUVM->pdm.s.pThreadsTail->Internal.s.pNext = pThread;
169 pUVM->pdm.s.pThreads = pThread;
170 pUVM->pdm.s.pThreadsTail = pThread;
181 RTSemEventMultiDestroy(pThread->Internal.s.SleepEvent);
182 pThread->Internal.s.SleepEvent = NIL_RTSEMEVENTMULTI;
184 RTSemEventMultiDestroy(pThread->Internal.s.BlockEvent);
185 pThread->Internal.s.BlockEvent = NIL_RTSEMEVENTMULTI;
187 MMHyperFree(pVM, pThread);
215 PPDMTHREAD pThread = *ppThread;
216 pThread->pvUser = pvUser;
217 pThread->Internal.s.enmType = PDMTHREADTYPE_DEVICE;
218 pThread->u.Dev.pDevIns = pDevIns;
219 pThread->u.Dev.pfnThread = pfnThread;
220 pThread->u.Dev.pfnWakeUp = pfnWakeUp;
248 PPDMTHREAD pThread = *ppThread;
249 pThread->pvUser = pvUser;
250 pThread->Internal.s.enmType = PDMTHREADTYPE_USB;
251 pThread->u.Usb.pUsbIns = pUsbIns;
252 pThread->u.Usb.pfnThread = pfnThread;
253 pThread->u.Usb.pfnWakeUp = pfnWakeUp;
281 PPDMTHREAD pThread = *ppThread;
282 pThread->pvUser = pvUser;
283 pThread->Internal.s.enmType = PDMTHREADTYPE_DRIVER;
284 pThread->u.Drv.pDrvIns = pDrvIns;
285 pThread->u.Drv.pfnThread = pfnThread;
286 pThread->u.Drv.pfnWakeUp = pfnWakeUp;
313 PPDMTHREAD pThread = *ppThread;
314 pThread->pvUser = pvUser;
315 pThread->Internal.s.enmType = PDMTHREADTYPE_INTERNAL;
316 pThread->u.Int.pfnThread = pfnThread;
317 pThread->u.Int.pfnWakeUp = pfnWakeUp;
344 PPDMTHREAD pThread = *ppThread;
345 pThread->pvUser = pvUser;
346 pThread->Internal.s.enmType = PDMTHREADTYPE_EXTERNAL;
347 pThread->u.Ext.pfnThread = pfnThread;
348 pThread->u.Ext.pfnWakeUp = pfnWakeUp;
363 * @param pThread The thread to destroy.
367 VMMR3DECL(int) PDMR3ThreadDestroy(PPDMTHREAD pThread, int *pRcThread)
372 AssertPtrReturn(pThread, VERR_INVALID_POINTER);
373 AssertReturn(pThread->u32Version == PDMTHREAD_VERSION, VERR_INVALID_MAGIC);
374 Assert(pThread->Thread != RTThreadSelf());
376 PVM pVM = pThread->Internal.s.pVM;
384 if (pThread->enmState <= PDMTHREADSTATE_TERMINATING)
388 PDMTHREADSTATE enmState = pThread->enmState;
392 if (!pdmR3AtomicCmpXchgState(pThread, PDMTHREADSTATE_TERMINATING, enmState))
394 rc = pdmR3ThreadWakeUp(pThread);
401 if (!pdmR3AtomicCmpXchgState(pThread, PDMTHREADSTATE_TERMINATING, enmState))
417 int rc2 = RTSemEventMultiSignal(pThread->Internal.s.BlockEvent);
423 rc2 = RTThreadWait(pThread->Thread, RT_SUCCESS(rc) ? 60*1000 : 150, pRcThread);
427 pThread->u32Version = 0xffffffff;
428 pThread->enmState = PDMTHREADSTATE_INVALID;
429 pThread->Thread = NIL_RTTHREAD;
433 if (pUVM->pdm.s.pThreads == pThread)
435 pUVM->pdm.s.pThreads = pThread->Internal.s.pNext;
436 if (!pThread->Internal.s.pNext)
442 while (pPrev && pPrev->Internal.s.pNext != pThread)
446 pPrev->Internal.s.pNext = pThread->Internal.s.pNext;
447 if (!pThread->Internal.s.pNext)
450 pThread->Internal.s.pNext = NULL;
454 RTSemEventMultiDestroy(pThread->Internal.s.BlockEvent);
455 pThread->Internal.s.BlockEvent = NIL_RTSEMEVENTMULTI;
457 RTSemEventMultiDestroy(pThread->Internal.s.SleepEvent);
458 pThread->Internal.s.SleepEvent = NIL_RTSEMEVENTMULTI;
460 MMR3HeapFree(pThread);
487 PPDMTHREAD pThread = pUVM->pdm.s.pThreads;
488 while (pThread)
490 PPDMTHREAD pNext = pThread->Internal.s.pNext;
491 if ( pThread->Internal.s.enmType == PDMTHREADTYPE_DEVICE
492 && pThread->u.Dev.pDevIns == pDevIns)
494 int rc2 = PDMR3ThreadDestroy(pThread, NULL);
498 pThread = pNext;
522 PPDMTHREAD pThread = pUVM->pdm.s.pThreads;
523 while (pThread)
525 PPDMTHREAD pNext = pThread->Internal.s.pNext;
526 if ( pThread->Internal.s.enmType == PDMTHREADTYPE_DEVICE
527 && pThread->u.Usb.pUsbIns == pUsbIns)
529 int rc2 = PDMR3ThreadDestroy(pThread, NULL);
533 pThread = pNext;
557 PPDMTHREAD pThread = pUVM->pdm.s.pThreads;
558 while (pThread)
560 PPDMTHREAD pNext = pThread->Internal.s.pNext;
561 if ( pThread->Internal.s.enmType == PDMTHREADTYPE_DRIVER
562 && pThread->u.Drv.pDrvIns == pDrvIns)
564 int rc2 = PDMR3ThreadDestroy(pThread, NULL);
568 pThread = pNext;
584 PPDMTHREAD pThread = pUVM->pdm.s.pThreads;
585 while (pThread)
587 PPDMTHREAD pNext = pThread->Internal.s.pNext;
588 int rc2 = PDMR3ThreadDestroy(pThread, NULL);
590 pThread = pNext;
600 * @param pThread The PDM thread.
602 static void pdmR3ThreadBailMeOut(PPDMTHREAD pThread)
606 PDMTHREADSTATE enmState = pThread->enmState;
613 if (!pdmR3AtomicCmpXchgState(pThread, PDMTHREADSTATE_TERMINATING, enmState))
641 * @param pThread The PDM thread.
643 VMMR3DECL(int) PDMR3ThreadIAmSuspending(PPDMTHREAD pThread)
648 AssertPtr(pThread);
649 AssertReturn(pThread->u32Version == PDMTHREAD_VERSION, VERR_INVALID_MAGIC);
650 Assert(pThread->Thread == RTThreadSelf() || pThread->enmState == PDMTHREADSTATE_INITIALIZING);
651 PDMTHREADSTATE enmState = pThread->enmState;
659 if (pdmR3AtomicCmpXchgState(pThread, PDMTHREADSTATE_SUSPENDED, enmState))
661 rc = RTThreadUserSignal(pThread->Thread);
664 rc = RTSemEventMultiWait(pThread->Internal.s.BlockEvent, RT_INDEFINITE_WAIT);
666 && pThread->enmState != PDMTHREADSTATE_SUSPENDED)
674 AssertMsgFailed(("rc=%d enmState=%d\n", rc, pThread->enmState));
675 pdmR3ThreadBailMeOut(pThread);
689 * @param pThread The PDM thread.
691 VMMR3DECL(int) PDMR3ThreadIAmRunning(PPDMTHREAD pThread)
696 Assert(pThread->enmState == PDMTHREADSTATE_RESUMING);
697 Assert(pThread->Thread == RTThreadSelf());
703 if (pdmR3AtomicCmpXchgState(pThread, PDMTHREADSTATE_RUNNING, PDMTHREADSTATE_RESUMING))
705 rc = RTThreadUserSignal(pThread->Thread);
710 AssertMsgFailed(("rc=%d enmState=%d\n", rc, pThread->enmState));
711 pdmR3ThreadBailMeOut(pThread);
726 * @param pThread The PDM thread.
729 VMMR3DECL(int) PDMR3ThreadSleep(PPDMTHREAD pThread, RTMSINTERVAL cMillies)
734 AssertReturn(pThread->enmState > PDMTHREADSTATE_INVALID && pThread->enmState < PDMTHREADSTATE_TERMINATED, VERR_PDM_THREAD_IPE_2);
735 AssertReturn(pThread->Thread == RTThreadSelf(), VERR_PDM_THREAD_INVALID_CALLER);
740 RTSemEventMultiReset(pThread->Internal.s.SleepEvent);
741 if (pThread->enmState != PDMTHREADSTATE_RUNNING)
743 return RTSemEventMultiWaitNoResume(pThread->Internal.s.SleepEvent, cMillies);
757 PPDMTHREAD pThread = (PPDMTHREAD)pvUser;
758 Log(("PDMThread: Initializing thread %RTthrd / %p / '%s'...\n", Thread, pThread, RTThreadGetName(Thread)));
759 pThread->Thread = Thread;
761 PUVM pUVM = pThread->Internal.s.pVM->pUVM;
776 switch (pThread->Internal.s.enmType)
779 rc = pThread->u.Dev.pfnThread(pThread->u.Dev.pDevIns, pThread);
783 rc = pThread->u.Usb.pfnThread(pThread->u.Usb.pUsbIns, pThread);
787 rc = pThread->u.Drv.pfnThread(pThread->u.Drv.pDrvIns, pThread);
791 rc = pThread->u.Int.pfnThread(pThread->Internal.s.pVM, pThread);
795 rc = pThread->u.Ext.pfnThread(pThread);
799 AssertMsgFailed(("%d\n", pThread->Internal.s.enmType));
810 if ( pThread->enmState != PDMTHREADSTATE_SUSPENDING
811 && pThread->enmState != PDMTHREADSTATE_INITIALIZING)
813 Assert(pThread->enmState == PDMTHREADSTATE_TERMINATING);
816 rc = PDMR3ThreadIAmSuspending(pThread);
819 if (pThread->enmState != PDMTHREADSTATE_RESUMING)
821 Assert(pThread->enmState == PDMTHREADSTATE_TERMINATING);
825 rc = PDMR3ThreadIAmRunning(pThread);
838 PDMTHREADSTATE enmState = pThread->enmState;
840 || pdmR3AtomicCmpXchgState(pThread, PDMTHREADSTATE_TERMINATING, enmState))
844 ASMAtomicXchgSize(&pThread->enmState, PDMTHREADSTATE_TERMINATED);
850 Log(("PDMThread: Terminating thread %RTthrd / %p / '%s': %Rrc\n", Thread, pThread, RTThreadGetName(Thread), rc));
858 * @param pThread The PDM thread.
860 static void pdmR3ThreadBailOut(PPDMTHREAD pThread)
864 PDMTHREADSTATE enmState = pThread->enmState;
869 if (!pdmR3AtomicCmpXchgState(pThread, PDMTHREADSTATE_TERMINATING, enmState))
871 RTSemEventMultiSignal(pThread->Internal.s.BlockEvent);
875 if (!pdmR3AtomicCmpXchgState(pThread, PDMTHREADSTATE_TERMINATING, enmState))
880 if (!pdmR3AtomicCmpXchgState(pThread, PDMTHREADSTATE_TERMINATING, enmState))
882 pdmR3ThreadWakeUp(pThread);
910 * @param pThread The PDM thread.
912 VMMR3DECL(int) PDMR3ThreadSuspend(PPDMTHREAD pThread)
917 AssertPtrReturn(pThread, VERR_INVALID_POINTER);
918 AssertReturn(pThread->u32Version == PDMTHREAD_VERSION, VERR_INVALID_MAGIC);
919 Assert(pThread->Thread != RTThreadSelf());
924 if (pThread->enmState == PDMTHREADSTATE_SUSPENDED)
930 int rc = RTSemEventMultiReset(pThread->Internal.s.BlockEvent);
933 rc = RTThreadUserReset(pThread->Thread);
937 if (pdmR3AtomicCmpXchgState(pThread, PDMTHREADSTATE_SUSPENDING, PDMTHREADSTATE_RUNNING))
939 rc = pdmR3ThreadWakeUp(pThread);
945 if (pThread->enmState != PDMTHREADSTATE_SUSPENDED)
946 rc = RTThreadUserWait(pThread->Thread, 60*1000);
948 && pThread->enmState != PDMTHREADSTATE_SUSPENDED)
961 rc, pThread->enmState, RTThreadGetName(pThread->Thread)));
962 pdmR3ThreadBailOut(pThread);
980 for (PPDMTHREAD pThread = pUVM->pdm.s.pThreads; pThread; pThread = pThread->Internal.s.pNext)
981 switch (pThread->enmState)
985 int rc = PDMR3ThreadSuspend(pThread);
995 AssertMsgFailed(("pThread=%p enmState=%d\n", pThread, pThread->enmState));
1014 * @param pThread The PDM thread.
1016 VMMR3DECL(int) PDMR3ThreadResume(PPDMTHREAD pThread)
1021 AssertPtrReturn(pThread, VERR_INVALID_POINTER);
1022 AssertReturn(pThread->u32Version == PDMTHREAD_VERSION, VERR_INVALID_MAGIC);
1023 Assert(pThread->Thread != RTThreadSelf());
1028 int rc = RTThreadUserReset(pThread->Thread);
1032 if (pdmR3AtomicCmpXchgState(pThread, PDMTHREADSTATE_RESUMING, PDMTHREADSTATE_SUSPENDED))
1034 rc = RTSemEventMultiSignal(pThread->Internal.s.BlockEvent);
1040 rc = RTThreadUserWait(pThread->Thread, 60*1000);
1042 && pThread->enmState != PDMTHREADSTATE_RUNNING)
1053 AssertMsgFailed(("PDMR3ThreadResume -> rc=%Rrc enmState=%d\n", rc, pThread->enmState));
1054 pdmR3ThreadBailOut(pThread);
1072 for (PPDMTHREAD pThread = pUVM->pdm.s.pThreads; pThread; pThread = pThread->Internal.s.pNext)
1073 switch (pThread->enmState)
1077 int rc = PDMR3ThreadResume(pThread);
1083 AssertMsgFailed(("pThread=%p enmState=%d\n", pThread, pThread->enmState));