VirtualBox

Changeset 45756 in vbox for trunk/src/VBox/Devices


Ignore:
Timestamp:
Apr 26, 2013 4:09:56 AM (12 years ago)
Author:
vboxsync
Message:

VBox/USB:proxy:darwin: detaching bits for vSMP case.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Devices/USB/darwin/USBProxyDevice-darwin.cpp

    r45626 r45756  
    3737#include <iprt/assert.h>
    3838#include <iprt/critsect.h>
     39#include <iprt/list.h>
    3940#include <iprt/mem.h>
    4041#include <iprt/once.h>
     
    165166    uint64_t                u64NextFrameNo;
    166167} USBPROXYPIPEOSX, *PUSBPROXYPIPEOSX, **PPUSBPROXYPIPEOSX;
     168
     169typedef struct RUNLOOPREFLIST
     170{
     171    RTLISTNODE   List;
     172    CFRunLoopRef RunLoopRef;
     173} RUNLOOPREFLIST, *PRUNLOOPREFLIST;
     174typedef RUNLOOPREFLIST **PPRUNLOOPREFLIST;
    167175
    168176/**
     
    192200    /** List of isochronous buffer collections.
    193201     * These are allocated on demand by the URB queuing routine and then recycled until the interface is destroyed. */
     202    RTLISTANCHOR HeadOfRunLoopLst;
    194203    PUSBPROXYISOCBUFCOL     pIsocBufCols;
    195204} USBPROXYIFOSX, *PUSBPROXYIFOSX, **PPUSBPROXYIFOSX;
     
    209218     * (i.e. the default control pipe stuff). */
    210219    CFRunLoopSourceRef      RunLoopSrcRef;
    211     /** The run loop this device and its interfaces send their events to. */
    212     CFRunLoopRef            RunLoopRef;
    213 
     220    /** we want to add and remove RunLoopSourceRefs to run loop's of
     221     * every EMT thread participated in USB processing. */
     222    RTLISTANCHOR        HeadOfRunLoopLst;
    214223    /** Pointer to the proxy device instance. */
    215224    PUSBPROXYDEV            pProxyDev;
     
    270279        rc = RTErrConvertFromDarwin(krc);
    271280    return rc;
     281}
     282
     283/**
     284 * Adds Source ref to current run loop and adds it the list of runloops.
     285 */
     286static int usbProxyDarwinAddRunLoopRef(PRTLISTANCHOR pListHead,
     287                                       CFRunLoopSourceRef SourceRef)
     288{
     289    AssertPtrReturn(pListHead, VERR_INVALID_PARAMETER);
     290    AssertReturn(CFRunLoopSourceIsValid(SourceRef), VERR_INVALID_PARAMETER);
     291
     292    if (CFRunLoopContainsSource(CFRunLoopGetCurrent(), SourceRef, g_pRunLoopMode))
     293        return VINF_SUCCESS;
     294
     295    /* Add to the list */
     296    PRUNLOOPREFLIST pListNode = (PRUNLOOPREFLIST)RTMemAllocZ(sizeof(RUNLOOPREFLIST));
     297    if (!pListNode)
     298        return VERR_NO_MEMORY;
     299
     300    pListNode->RunLoopRef = CFRunLoopGetCurrent();
     301
     302    CFRetain(pListNode->RunLoopRef);
     303    CFRetain(SourceRef); /* We want to be aware of releasing */
     304
     305    CFRunLoopAddSource(pListNode->RunLoopRef, SourceRef, g_pRunLoopMode);
     306
     307    RTListInit(&pListNode->List);
     308
     309    RTListAppend((PRTLISTNODE)pListHead, &pListNode->List);
     310     
     311    return VINF_SUCCESS;
     312}
     313
     314
     315/*
     316 * Removes all source reference from mode of run loop's we've registered them.
     317 *
     318 */
     319static int usbProxyDarwinRemoveSourceRefFromAllRunLoops(PRTLISTANCHOR pHead,
     320                                                        CFRunLoopSourceRef SourceRef)
     321{
     322    AssertPtrReturn(pHead, VERR_INVALID_PARAMETER);
     323   
     324    while (RTListIsEmpty(pHead))
     325    {
     326        PRUNLOOPREFLIST pNode = RTListGetFirst(pHead, RUNLOOPREFLIST, List);
     327        /* XXX: Should Release Reference? */
     328        Assert(CFGetRetainCount(pNode->RunLoopRef));
     329       
     330        CFRunLoopRemoveSource(pNode->RunLoopRef, SourceRef, g_pRunLoopMode);
     331        CFRelease(SourceRef);
     332        CFRelease(pNode->RunLoopRef);
     333
     334        RTListNodeRemove(&pNode->List);
     335
     336        RTMemFree(pNode);
     337    }
     338
     339    return VINF_SUCCESS;
    272340}
    273341
     
    570638    }
    571639
    572     Assert(pDevOsX->pInFlightHead == pUrbOsX);
    573640    /*
    574641     * Remove from the active list.
     
    579646        pUrbOsX->pPrev->pNext = pUrbOsX->pNext;
    580647    else
     648    {
     649        Assert(pDevOsX->pInFlightHead == pUrbOsX);
    581650        pDevOsX->pInFlightHead = pUrbOsX->pNext;
     651    }
    582652
    583653    /*
     
    615685        if (pIf->RunLoopSrcRef)
    616686        {
    617             CFRunLoopRemoveSource(pDevOsX->RunLoopRef, pIf->RunLoopSrcRef, g_pRunLoopMode);
     687            int rc = usbProxyDarwinRemoveSourceRefFromAllRunLoops((PRTLISTANCHOR)&pIf->HeadOfRunLoopLst, pIf->RunLoopSrcRef);
     688            AssertRC(rc);
     689
    618690            CFRelease(pIf->RunLoopSrcRef);
    619691            pIf->RunLoopSrcRef = NULL;
     692            RTListInit((PRTLISTNODE)&pIf->HeadOfRunLoopLst);
    620693        }
    621694
     
    822895                                    if (irc == kIOReturnSuccess)
    823896                                    {
    824                                         CFRunLoopAddSource(pDevOsX->RunLoopRef, pIf->RunLoopSrcRef, g_pRunLoopMode);
     897                                        RTListInit((PRTLISTNODE)&pIf->HeadOfRunLoopLst);
     898                                        usbProxyDarwinAddRunLoopRef(&pIf->HeadOfRunLoopLst,
     899                                                                    pIf->RunLoopSrcRef);
    825900
    826901                                        /*
     
    11501225                if (pDevOsX)
    11511226                {
     1227                    RTListInit((PRTLISTNODE)&pDevOsX->HeadOfRunLoopLst);
    11521228                    vrc = RTCritSectInit(&pDevOsX->CritSect);
    11531229                    if (RT_SUCCESS(vrc))
     
    11561232                        pDevOsX->ppDevI = ppDevI;
    11571233                        pDevOsX->pProxyDev = pProxyDev;
    1158                         pDevOsX->RunLoopRef = CFRunLoopGetCurrent();
    1159                         CFRetain(pDevOsX->RunLoopRef); /* paranoia */
    11601234
    11611235                        /*
     
    11741248                            if (irc == kIOReturnSuccess)
    11751249                            {
    1176                                 CFRunLoopAddSource(pDevOsX->RunLoopRef, pDevOsX->RunLoopSrcRef, g_pRunLoopMode);
    1177 
    11781250                                /*
    11791251                                 * Determine the active configuration.
     
    11901262
    11911263                                    pProxyDev->Backend.pv = pDevOsX;
     1264                                    usbProxyDarwinAddRunLoopRef(&pDevOsX->HeadOfRunLoopLst, pDevOsX->RunLoopSrcRef);
    11921265                                    return VINF_SUCCESS;        /* return */
    11931266                                }
    11941267                                vrc = VERR_VUSB_DEVICE_NOT_ATTACHED;
    1195 
    1196                                 CFRunLoopRemoveSource(pDevOsX->RunLoopRef, pDevOsX->RunLoopSrcRef, g_pRunLoopMode);
    11971268                            }
    11981269                            else
     
    12671338    if (pDevOsX->RunLoopSrcRef)
    12681339    {
    1269         CFRunLoopRemoveSource(pDevOsX->RunLoopRef, pDevOsX->RunLoopSrcRef, g_pRunLoopMode);
     1340        int rc = usbProxyDarwinRemoveSourceRefFromAllRunLoops(&pDevOsX->HeadOfRunLoopLst, pDevOsX->RunLoopSrcRef);
     1341        AssertRC(rc);
     1342
     1343        RTListInit((PRTLISTNODE)&pDevOsX->HeadOfRunLoopLst);
     1344
    12701345        CFRelease(pDevOsX->RunLoopSrcRef);
    12711346        pDevOsX->RunLoopSrcRef = NULL;
     
    12951370     */
    12961371    RTCritSectDelete(&pDevOsX->CritSect);
    1297 
    1298     if (pDevOsX->RunLoopRef)
    1299     {
    1300         CFRelease(pDevOsX->RunLoopRef);
    1301         pDevOsX->RunLoopRef = NULL;
    1302     }
    13031372
    13041373    PUSBPROXYURBOSX pUrbOsX;
     
    15301599
    15311600        if (!CFRunLoopContainsSource(CFRunLoopGetCurrent(), pIf->RunLoopSrcRef, g_pRunLoopMode))
    1532             CFRunLoopAddSource(CFRunLoopGetCurrent(), pIf->RunLoopSrcRef, g_pRunLoopMode);
     1601            usbProxyDarwinAddRunLoopRef(&pIf->HeadOfRunLoopLst, pIf->RunLoopSrcRef);
    15331602
    15341603    }
     
    15361605
    15371606    if (!CFRunLoopContainsSource(CFRunLoopGetCurrent(), pDevOsX->RunLoopSrcRef, g_pRunLoopMode))
    1538         CFRunLoopAddSource(CFRunLoopGetCurrent(), pDevOsX->RunLoopSrcRef, g_pRunLoopMode);
     1607        usbProxyDarwinAddRunLoopRef(&pDevOsX->HeadOfRunLoopLst, pDevOsX->RunLoopSrcRef);
    15391608
    15401609    /*
Note: See TracChangeset for help on using the changeset viewer.

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