VirtualBox

Ignore:
Timestamp:
May 31, 2012 4:48:33 PM (13 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
78291
Message:

Main/HostUSBDevice(all platforms)+USBProxyService: redo USB locking, fixes major regression, added lots of assertions to catch locking flaws early, whitespace cleanup
Main/Machine: small USB locking fix to be consistent with the remaining code
Main/Host+glue/AutoLock: replace USB list lock by host lock, small numbering cleanup
Main/Console: redo USB locking, do less in USB callbacks/EMT (addresses long standing todo items), eliminate unsafe iterator parameters

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Main/src-server/linux/USBProxyServiceLinux.cpp

    r37618 r41528  
    55
    66/*
    7  * Copyright (C) 2006-2011 Oracle Corporation
     7 * Copyright (C) 2005-2012 Oracle Corporation
    88 *
    99 * This file is part of VirtualBox Open Source Edition (OSE), as
     
    222222int USBProxyServiceLinux::captureDevice(HostUSBDevice *aDevice)
    223223{
    224     Log(("USBProxyServiceLinux::captureDevice: %p {%s}\n", aDevice, aDevice->getName().c_str()));
    225224    AssertReturn(aDevice, VERR_GENERAL_FAILURE);
    226     AssertReturn(aDevice->isWriteLockOnCurrentThread(), VERR_GENERAL_FAILURE);
     225    AssertReturn(!aDevice->isWriteLockOnCurrentThread(), VERR_GENERAL_FAILURE);
     226
     227    AutoReadLock devLock(aDevice COMMA_LOCKVAL_SRC_POS);
     228    LogFlowThisFunc(("aDevice=%s\n", aDevice->getName().c_str()));
    227229
    228230    /*
     
    230232     */
    231233    Assert(aDevice->getUnistate() == kHostUSBDeviceState_Capturing);
     234    devLock.release();
    232235    interruptWait();
    233236
     
    238241int USBProxyServiceLinux::releaseDevice(HostUSBDevice *aDevice)
    239242{
    240     Log(("USBProxyServiceLinux::releaseDevice: %p\n", aDevice));
    241243    AssertReturn(aDevice, VERR_GENERAL_FAILURE);
    242     AssertReturn(aDevice->isWriteLockOnCurrentThread(), VERR_GENERAL_FAILURE);
     244    AssertReturn(!aDevice->isWriteLockOnCurrentThread(), VERR_GENERAL_FAILURE);
     245
     246    AutoReadLock devLock(aDevice COMMA_LOCKVAL_SRC_POS);
     247    LogFlowThisFunc(("aDevice=%s\n", aDevice->getName().c_str()));
    243248
    244249    /*
     
    246251     */
    247252    Assert(aDevice->getUnistate() == kHostUSBDeviceState_ReleasingToHost);
     253    devLock.release();
    248254    interruptWait();
    249255
     
    254260bool USBProxyServiceLinux::updateDeviceState(HostUSBDevice *aDevice, PUSBDEVICE aUSBDevice, bool *aRunFilters, SessionMachine **aIgnoreMachine)
    255261{
     262    AssertReturn(aDevice, false);
     263    AssertReturn(!aDevice->isWriteLockOnCurrentThread(), false);
     264    AutoReadLock devLock(aDevice COMMA_LOCKVAL_SRC_POS);
    256265    if (    aUSBDevice->enmState == USBDEVICESTATE_USED_BY_HOST_CAPTURABLE
    257266        &&  aDevice->mUsb->enmState == USBDEVICESTATE_USED_BY_HOST)
    258267        LogRel(("USBProxy: Device %04x:%04x (%s) has become accessible.\n",
    259268                aUSBDevice->idVendor, aUSBDevice->idProduct, aUSBDevice->pszAddress));
     269    devLock.release();
    260270    return updateDeviceStateFake(aDevice, aUSBDevice, aRunFilters, aIgnoreMachine);
    261271}
     
    269279void USBProxyServiceLinux::deviceAdded(ComObjPtr<HostUSBDevice> &aDevice, SessionMachinesList &llOpenedMachines, PUSBDEVICE aUSBDevice)
    270280{
     281    AssertReturnVoid(aDevice);
     282    AssertReturnVoid(!aDevice->isWriteLockOnCurrentThread());
     283    AutoReadLock devLock(aDevice COMMA_LOCKVAL_SRC_POS);
    271284    if (aUSBDevice->enmState == USBDEVICESTATE_USED_BY_HOST)
    272285    {
     
    276289    }
    277290
     291    devLock.release();
    278292    USBProxyService::deviceAdded(aDevice, llOpenedMachines, aUSBDevice);
    279293}
     
    349363int USBProxyServiceLinux::interruptWait(void)
    350364{
     365    AssertReturn(!isWriteLockOnCurrentThread(), VERR_GENERAL_FAILURE);
     366
     367    AutoReadLock alock(this COMMA_LOCKVAL_SRC_POS);
    351368#ifdef VBOX_USB_WITH_SYSFS
    352369    LogFlowFunc(("mUsingUsbfsDevices=%d\n", mUsingUsbfsDevices));
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