VirtualBox

Changeset 31644 in vbox for trunk/src/VBox/Main


Ignore:
Timestamp:
Aug 13, 2010 12:47:07 PM (14 years ago)
Author:
vboxsync
Message:

Main/HostHardwareLinux: switch the stl vectors to a C implementation

Location:
trunk/src/VBox/Main
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Main/include/HostHardwareLinux.h

    r28882 r31644  
    109109typedef VBoxMainDriveInfo::DriveInfo DriveInfo;
    110110
     111
     112/** Vector type for the list of interfaces. */
     113#define VECTOR_TYPE       char *
     114#define VECTOR_TYPENAME   USBInterfaceList
     115static inline void USBInterfaceListCleanup(char **ppsz)
     116{
     117    RTStrFree(*ppsz);
     118}
     119#define VECTOR_DESTRUCTOR USBInterfaceListCleanup
     120#include "vector.h"
     121
     122/** Structure describing a host USB device */
     123typedef struct USBDeviceInfo
     124{
     125    /** The device node of the device. */
     126    char *mDevice;
     127    /** The system identifier of the device.  Specific to the probing
     128     * method. */
     129    char *mSysfsPath;
     130    /** Type for the list of interfaces. */
     131    USBInterfaceList mInterfaces;
     132} USBDeviceInfo;
     133
     134
     135/** Destructor. */
     136static inline void USBDevInfoCleanup(USBDeviceInfo *pSelf)
     137{
     138    RTStrFree(pSelf->mDevice);
     139    RTStrFree(pSelf->mSysfsPath);
     140    pSelf->mDevice = pSelf->mSysfsPath = NULL;
     141    USBInterfaceList_cleanup(&pSelf->mInterfaces);
     142}
     143
     144
     145/** Constructor - the strings will be duplicated. */
     146static inline int USBDevInfoInit(USBDeviceInfo *pSelf, const char *aDevice,
     147                                 const char *aSystemID)
     148{
     149    pSelf->mDevice = aDevice ? RTStrDup(aDevice) : NULL;
     150    pSelf->mSysfsPath = aSystemID ? RTStrDup(aSystemID) : NULL;
     151    if (   !USBInterfaceList_init(&pSelf->mInterfaces)
     152        || (aDevice && !pSelf->mDevice) || (aSystemID && ! pSelf->mSysfsPath))
     153    {
     154        USBDevInfoCleanup(pSelf);
     155        return 0;
     156    }
     157    return 1;
     158}
     159
     160
     161/** Vector type holding device information */
     162#define VECTOR_TYPE       USBDeviceInfo
     163#define VECTOR_TYPENAME   USBDeviceInfoList
     164#define VECTOR_DESTRUCTOR USBDevInfoCleanup
     165#include "vector.h"
     166
     167
    111168/**
    112169 * Class for probing and returning information about host USB devices.
     
    114171 * actual probing and use the iterator methods to get the result of the probe.
    115172 */
    116 class VBoxMainUSBDeviceInfo
    117 {
    118 public:
    119     /** Structure describing a host USB device */
    120     struct USBDeviceInfo
    121     {
    122         /** The device node of the device. */
    123         iprt::MiniString mDevice;
    124         /** The system identifier of the device.  Specific to the probing
    125          * method. */
    126         iprt::MiniString mSysfsPath;
    127         /** Type for the list of interfaces. */
    128         typedef std::vector<iprt::MiniString> InterfaceList;
    129         /** The system IDs of the device's interfaces. */
    130         InterfaceList mInterfaces;
    131 
    132         /** Constructors */
    133         USBDeviceInfo(const iprt::MiniString &aDevice,
    134                       const iprt::MiniString &aSystemID)
    135             : mDevice(aDevice),
    136               mSysfsPath(aSystemID)
    137         { }
    138     };
    139 
    140     /** List (resp vector) holding drive information */
    141     typedef std::vector<USBDeviceInfo> DeviceInfoList;
    142 
    143     /**
    144      * Search for host USB devices and rebuild the list, which remains empty
    145      * until the first time this method is called.
    146      * @returns iprt status code
    147      */
    148     int UpdateDevices ();
    149 
    150     /** Get the first element in the list of USB devices. */
    151     DeviceInfoList::const_iterator DevicesBegin()
    152     {
    153         return mDeviceList.begin();
    154     }
    155 
    156     /** Get the last element in the list of USB devices. */
    157     DeviceInfoList::const_iterator DevicesEnd()
    158     {
    159         return mDeviceList.end();
    160     }
    161 
    162 private:
     173typedef struct VBoxMainUSBDeviceInfo
     174{
    163175    /** The list of currently available USB devices */
    164     DeviceInfoList mDeviceList;
    165 };
    166 
    167 /** Convenience typedef. */
    168 typedef VBoxMainUSBDeviceInfo::DeviceInfoList USBDeviceInfoList;
    169 /** Convenience typedef. */
    170 typedef VBoxMainUSBDeviceInfo::USBDeviceInfo USBDeviceInfo;
    171 /** Convenience typedef. */
    172 typedef VBoxMainUSBDeviceInfo::USBDeviceInfo::InterfaceList USBInterfaceList;
     176    USBDeviceInfoList mDeviceList;
     177} VBoxMainUSBDeviceInfo;
     178
     179/** Constructor */
     180static inline int VBoxMainUSBDevInfoInit(VBoxMainUSBDeviceInfo *pSelf)
     181{
     182    return USBDeviceInfoList_init(&pSelf->mDeviceList);
     183}
     184
     185/** Destructor */
     186static inline void VBoxMainUSBDevInfoCleanup(VBoxMainUSBDeviceInfo *pSelf)
     187{
     188    USBDeviceInfoList_cleanup(&pSelf->mDeviceList);
     189}
     190
     191/**
     192 * Search for host USB devices and rebuild the list, which remains empty
     193 * until the first time this method is called.
     194 * @returns iprt status code
     195 */
     196int USBDevInfoUpdateDevices(VBoxMainUSBDeviceInfo *pSelf);
     197
     198
     199/** Get the first element in the list of USB devices. */
     200static inline const USBDeviceInfoList_iterator *USBDevInfoBegin
     201                (VBoxMainUSBDeviceInfo *pSelf)
     202{
     203    return USBDeviceInfoList_begin(&pSelf->mDeviceList);
     204}
     205
     206
     207/** Get the last element in the list of USB devices. */
     208static inline const USBDeviceInfoList_iterator *USBDevInfoEnd
     209                (VBoxMainUSBDeviceInfo *pSelf)
     210{
     211    return USBDeviceInfoList_end(&pSelf->mDeviceList);
     212}
     213
    173214
    174215/** Implementation of the hotplug waiter class below */
  • trunk/src/VBox/Main/linux/HostHardwareLinux.cpp

    r31581 r31644  
    995995
    996996
    997 int VBoxMainUSBDeviceInfo::UpdateDevices ()
    998 {
    999     LogFlowThisFunc(("entered\n"));
     997int USBDevInfoUpdateDevices (VBoxMainUSBDeviceInfo *pSelf)
     998{
     999    LogFlowFunc(("entered\n"));
    10001000    int rc = VINF_SUCCESS;
    10011001    bool success = false;  /* Have we succeeded in finding anything yet? */
    1002     try
    1003     {
    1004         mDeviceList.clear();
     1002    USBDeviceInfoList_clear(&pSelf->mDeviceList);
    10051003#ifdef VBOX_USB_WITH_SYSFS
    10061004# ifdef VBOX_USB_WITH_INOTIFY
    1007         if (   RT_SUCCESS(rc)
    1008             && (!success || testing()))
    1009             rc = getUSBDeviceInfoFromSysfs(&mDeviceList, &success);
     1005    if (   RT_SUCCESS(rc)
     1006        && (!success || testing()))
     1007        rc = getUSBDeviceInfoFromSysfs(&pSelf->mDeviceList, &success);
    10101008# endif
    10111009#else /* !VBOX_USB_WITH_SYSFS */
    1012         NOREF(success);
     1010    NOREF(success);
    10131011#endif /* !VBOX_USB_WITH_SYSFS */
    1014     }
    1015     catch(std::bad_alloc &e)
    1016     {
    1017         rc = VERR_NO_MEMORY;
    1018     }
    1019     LogFlowThisFunc(("rc=%Rrc\n", rc));
     1012    LogFlowFunc(("rc=%Rrc\n", rc));
    10201013    return rc;
    10211014}
     
    15041497    if (cchDevPath < 0)
    15051498        return true;
    1506     try
    1507     {
    1508         pSelf->mList->push_back(USBDeviceInfo(szDevPath, pcszNode));
    1509     }
    1510     catch(std::bad_alloc &e)
    1511     {
    1512         return false;
    1513     }
    1514     return true;
     1499   
     1500    USBDeviceInfo info;
     1501    if (USBDevInfoInit(&info, szDevPath, pcszNode))
     1502        if (USBDeviceInfoList_push_back(pSelf->mList, &info))
     1503            return true;
     1504    USBDevInfoCleanup(&info);
     1505    return false;
    15151506}
    15161507
     
    15681559    AssertReturn(pParent->handle == muiHandle, false);
    15691560    matchUSBInterface *pSelf = (matchUSBInterface *)pParent;
    1570     if (!muiIsAnInterfaceOf(pcszNode, pSelf->mInfo->mSysfsPath.c_str()))
    1571         return true;
    1572     try
    1573     {
    1574         pSelf->mInfo->mInterfaces.push_back(pcszNode);
    1575     }
    1576     catch(std::bad_alloc &e)
    1577     {
    1578         return false;
    1579     }
    1580     return true;
     1561    if (!muiIsAnInterfaceOf(pcszNode, pSelf->mInfo->mSysfsPath))
     1562        return true;
     1563    char *pcszDup = RTStrDup(pcszNode);
     1564    if (pcszDup)
     1565        if (USBInterfaceList_push_back(&pSelf->mInfo->mInterfaces, &pcszDup))
     1566            return true;
     1567    RTStrFree(pcszDup);
     1568    return false;
    15811569}
    15821570
     
    16131601    LogFlowFunc (("pList=%p, pfSuccess=%p\n",
    16141602                  pList, pfSuccess));
    1615     size_t cDevices = pList->size();
    16161603    matchUSBDevice devHandler;
    16171604    mudInit(&devHandler, pList);
     
    16201607        if (RT_FAILURE(rc))
    16211608            break;
    1622         for (USBDeviceInfoList::iterator pInfo = pList->begin();
    1623              pInfo != pList->end(); ++pInfo)
     1609        USBDeviceInfoList_iterator info;
     1610        USBDeviceInfoList_iter_init(&info,
     1611                                    USBDeviceInfoList_begin(pList));
     1612        while (!USBDeviceInfoList_iter_eq(&info,
     1613                                          USBDeviceInfoList_end(pList)))
    16241614        {
    16251615            matchUSBInterface ifaceHandler;
    1626             muiInit(&ifaceHandler, &*pInfo);
     1616            muiInit(&ifaceHandler, USBDeviceInfoList_iter_target(&info));
    16271617            rc = getDeviceInfoFromSysfs("/sys/bus/usb/devices",
    16281618                                        &ifaceHandler.mParent);
    16291619            if (RT_FAILURE(rc))
    16301620                break;
     1621            USBDeviceInfoList_iter_incr(&info);
    16311622        }
    16321623    } while(0);
    1633     if (RT_FAILURE(rc))
    1634         /* Clean up again */
    1635         while (pList->size() > cDevices)
    1636             pList->pop_back();
    16371624    if (pfSuccess)
    16381625        *pfSuccess = RT_SUCCESS(rc);
  • trunk/src/VBox/Main/testcase/tstHostHardwareLinux.cpp

    r31564 r31644  
    9292#ifdef VBOX_USB_WITH_SYSFS
    9393    VBoxMainUSBDeviceInfo deviceInfo;
    94     rc = deviceInfo.UpdateDevices();
     94    AssertReturn(VBoxMainUSBDevInfoInit(&deviceInfo), 1);
     95    rc = USBDevInfoUpdateDevices(&deviceInfo);
    9596    if (RT_FAILURE(rc))
    9697    {
     
    100101    }
    101102    RTPrintf ("Listing USB devices detected:\n");
    102     for (USBDeviceInfoList::const_iterator it = deviceInfo.DevicesBegin();
    103          it != deviceInfo.DevicesEnd(); ++it)
     103    USBDeviceInfoList_iterator it;
     104    USBDeviceInfoList_iter_init(&it, USBDevInfoBegin(&deviceInfo));
     105    for (; !USBDeviceInfoList_iter_eq(&it, USBDevInfoEnd(&deviceInfo));
     106           USBDeviceInfoList_iter_incr(&it))
    104107    {
    105108        char szProduct[1024];
     109        USBDeviceInfo *pInfo = USBDeviceInfoList_iter_target(&it);
    106110        if (RTLinuxSysFsReadStrFile(szProduct, sizeof(szProduct),
    107                                     "%s/product", it->mSysfsPath.c_str()) == -1)
     111                                    "%s/product", pInfo->mSysfsPath) == -1)
    108112        {
    109113            if (errno != ENOENT)
    110114            {
    111115                RTPrintf ("Failed to get the product name for device %s: error %s\n",
    112                           it->mDevice.c_str(), strerror(errno));
     116                          pInfo->mDevice, strerror(errno));
    113117                return 1;
    114118            }
     
    116120                szProduct[0] = '\0';
    117121        }
    118         RTPrintf ("  device: %s (%s), sysfs path: %s\n", szProduct, it->mDevice.c_str(),
    119                   it->mSysfsPath.c_str());
     122        RTPrintf ("  device: %s (%s), sysfs path: %s\n", szProduct, pInfo->mDevice,
     123                  pInfo->mSysfsPath);
    120124        RTPrintf ("    interfaces:\n");
    121         for (USBInterfaceList::const_iterator it2 = it->mInterfaces.begin();
    122              it2 != it->mInterfaces.end(); ++it2)
     125        USBInterfaceList_iterator it2;
     126        USBInterfaceList_iter_init(&it2, USBInterfaceList_begin(&pInfo->mInterfaces));
     127        for (; !USBInterfaceList_iter_eq(&it2, USBInterfaceList_end(&pInfo->mInterfaces));
     128               USBInterfaceList_iter_incr(&it2))
    123129        {
    124130            char szDriver[RTPATH_MAX];
     131            char *pszIf = *USBInterfaceList_iter_target(&it2);
    125132            strcpy(szDriver, "none");
    126133            ssize_t size = RTLinuxSysFsGetLinkDest(szDriver, sizeof(szDriver),
    127                                                    "%s/driver", it2->c_str());
     134                                                   "%s/driver", pszIf);
    128135            if (size == -1 && errno != ENOENT)
    129136            {
    130137                RTPrintf ("Failed to get the driver for interface %s of device %s: error %s\n",
    131                           it2->c_str(), it->mDevice.c_str(), strerror(errno));
     138                          pszIf, pInfo->mDevice, strerror(errno));
    132139                return 1;
    133140            }
    134             if (RTLinuxSysFsExists("%s/driver", it2->c_str()) != (size != -1))
     141            if (RTLinuxSysFsExists("%s/driver", pszIf) != (size != -1))
    135142            {
    136143                RTPrintf ("RTLinuxSysFsExists did not return the expected value for the driver link of interface %s of device %s.\n",
    137                           it2->c_str(), it->mDevice.c_str());
     144                          pszIf, pInfo->mDevice);
    138145                return 1;
    139146            }
    140147            uint64_t u64InterfaceClass;
    141148            u64InterfaceClass = RTLinuxSysFsReadIntFile(16, "%s/bInterfaceClass",
    142                                                         it2->c_str());
     149                                                        pszIf);
    143150            RTPrintf ("      sysfs path: %s, driver: %s, interface class: 0x%x\n",
    144                       it2->c_str(), szDriver, u64InterfaceClass);
     151                      pszIf, szDriver, u64InterfaceClass);
    145152        }
    146153    }
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