VirtualBox

Changeset 28265 in vbox for trunk/src/VBox


Ignore:
Timestamp:
Apr 13, 2010 4:02:10 PM (15 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
60007
Message:

PDMThread: serialize list manipulations using ListCritSect.

Location:
trunk/src/VBox/VMM
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/VMM/PDMInternal.h

    r28263 r28265  
    10261026    R3PTRTYPE(struct PDMQUEUE *)    pQueuesForced;
    10271027
    1028     /** Head of the PDM Thread list. (singly linked) */
    1029     R3PTRTYPE(PPDMTHREAD)           pThreads;
    1030     /** Tail of the PDM Thread list. (singly linked) */
    1031     R3PTRTYPE(PPDMTHREAD)           pThreadsTail;
    1032 
    10331028    /** Lock protecting the lists below it. */
    10341029    RTCRITSECT                      ListCritSect;
     
    10371032    /** List of initialized critical sections. (LIFO) */
    10381033    R3PTRTYPE(PPDMCRITSECTINT)      pCritSects;
     1034    /** Head of the PDM Thread list. (singly linked) */
     1035    R3PTRTYPE(PPDMTHREAD)           pThreads;
     1036    /** Tail of the PDM Thread list. (singly linked) */
     1037    R3PTRTYPE(PPDMTHREAD)           pThreadsTail;
    10391038
    10401039    /** @name   PDM Async Completion
  • trunk/src/VBox/VMM/PDMThread.cpp

    r28262 r28265  
    166166                     * Insert it into the thread list.
    167167                     */
     168                    RTCritSectEnter(&pUVM->pdm.s.ListCritSect);
    168169                    pThread->Internal.s.pNext = NULL;
    169170                    if (pUVM->pdm.s.pThreadsTail)
     
    172173                        pUVM->pdm.s.pThreads = pThread;
    173174                    pUVM->pdm.s.pThreadsTail = pThread;
     175                    RTCritSectLeave(&pUVM->pdm.s.ListCritSect);
    174176
    175177                    rc = RTThreadUserReset(Thread);
     
    432434
    433435        /* unlink */
     436        RTCritSectEnter(&pUVM->pdm.s.ListCritSect);
    434437        if (pUVM->pdm.s.pThreads == pThread)
    435438        {
     
    450453        }
    451454        pThread->Internal.s.pNext = NULL;
     455        RTCritSectLeave(&pUVM->pdm.s.ListCritSect);
    452456
    453457        /* free the resources */
     
    483487
    484488    AssertPtr(pDevIns);
     489
     490    RTCritSectEnter(&pUVM->pdm.s.ListCritSect);
    485491    PPDMTHREAD pThread = pUVM->pdm.s.pThreads;
    486492    while (pThread)
     
    496502        pThread = pNext;
    497503    }
    498 
     504    RTCritSectLeave(&pUVM->pdm.s.ListCritSect);
    499505    return rc;
    500506}
     
    516522
    517523    AssertPtr(pUsbIns);
     524
     525    RTCritSectEnter(&pUVM->pdm.s.ListCritSect);
    518526    PPDMTHREAD pThread = pUVM->pdm.s.pThreads;
    519527    while (pThread)
     
    529537        pThread = pNext;
    530538    }
    531 
     539    RTCritSectLeave(&pUVM->pdm.s.ListCritSect);
    532540    return rc;
    533541}
     
    549557
    550558    AssertPtr(pDrvIns);
     559
     560    RTCritSectEnter(&pUVM->pdm.s.ListCritSect);
    551561    PPDMTHREAD pThread = pUVM->pdm.s.pThreads;
    552562    while (pThread)
     
    562572        pThread = pNext;
    563573    }
    564 
     574    RTCritSectLeave(&pUVM->pdm.s.ListCritSect);
    565575    return rc;
    566576}
     
    574584void pdmR3ThreadDestroyAll(PVM pVM)
    575585{
    576     PUVM        pUVM    = pVM->pUVM;
    577     PPDMTHREAD  pThread = pUVM->pdm.s.pThreads;
     586    PUVM pUVM = pVM->pUVM;
     587    RTCritSectEnter(&pUVM->pdm.s.ListCritSect);
     588    PPDMTHREAD pThread = pUVM->pdm.s.pThreads;
    578589    while (pThread)
    579590    {
     
    584595    }
    585596    Assert(!pUVM->pdm.s.pThreads && !pUVM->pdm.s.pThreadsTail);
     597    RTCritSectLeave(&pUVM->pdm.s.ListCritSect);
    586598}
    587599
     
    959971int pdmR3ThreadSuspendAll(PVM pVM)
    960972{
    961     for (PPDMTHREAD pThread = pVM->pUVM->pdm.s.pThreads; pThread; pThread = pThread->Internal.s.pNext)
     973    PUVM pUVM = pVM->pUVM;
     974    RTCritSectEnter(&pUVM->pdm.s.ListCritSect); /* This may cause deadlocks later... */
     975    for (PPDMTHREAD pThread = pUVM->pdm.s.pThreads; pThread; pThread = pThread->Internal.s.pNext)
    962976        switch (pThread->enmState)
    963977        {
     
    977991                break;
    978992        }
     993    RTCritSectLeave(&pUVM->pdm.s.ListCritSect);
    979994    return VINF_SUCCESS;
    980995}
     
    10481063int pdmR3ThreadResumeAll(PVM pVM)
    10491064{
    1050     for (PPDMTHREAD pThread = pVM->pUVM->pdm.s.pThreads; pThread; pThread = pThread->Internal.s.pNext)
     1065    PUVM pUVM = pVM->pUVM;
     1066    RTCritSectEnter(&pUVM->pdm.s.ListCritSect);
     1067    for (PPDMTHREAD pThread = pUVM->pdm.s.pThreads; pThread; pThread = pThread->Internal.s.pNext)
    10511068        switch (pThread->enmState)
    10521069        {
     
    10621079                break;
    10631080        }
     1081    RTCritSectLeave(&pUVM->pdm.s.ListCritSect);
    10641082    return VINF_SUCCESS;
    10651083}
Note: See TracChangeset for help on using the changeset viewer.

© 2025 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette