VirtualBox

Ignore:
Timestamp:
Jan 24, 2014 9:16:37 PM (11 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
91829
Message:

USB/Proxy: Start a source code cleanup, remove unused struct members and make the generic proxy code do the backend specific memory allocation (fixes a small memory leak in the VRDP backend when closing a proxy device)

File:
1 edited

Legend:

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

    r49816 r50228  
    55
    66/*
    7  * Copyright (C) 2009-2013 Oracle Corporation
     7 * Copyright (C) 2009-2014 Oracle Corporation
    88 *
    99 * This file is part of VirtualBox Open Source Edition (OSE), as
     
    9292    /** The tail of the landed solaris URBs. */
    9393    PUSBPROXYURBSOL                pTaxingTail;
    94     /** Pipe handle for waiking up - writing end. */
     94    /** Pipe handle for waking up - writing end. */
    9595    RTPIPE                         hPipeWakeupW;
    96     /** Pipe handle for waiking up - reading end. */
     96    /** Pipe handle for waking up - reading end. */
    9797    RTPIPE                         hPipeWakeupR;
    9898} USBPROXYDEVSOL, *PUSBPROXYDEVSOL;
     
    288288 * @param   pvBackend       Backend specific pointer, unused for the solaris backend.
    289289 */
    290 static int usbProxySolarisOpen(PUSBPROXYDEV pProxyDev, const char *pszAddress, void *pvBackend)
    291 {
     290static DECLCALLBACK(int) usbProxySolarisOpen(PUSBPROXYDEV pProxyDev, const char *pszAddress, void *pvBackend)
     291{
     292    PUSBPROXYDEVFBSD pDevSol = USBPROXYDEV_2_DATA(pProxyDev, PUSBPROXYDEVSOL);
     293
    292294    LogFlowFunc((USBPROXY ":usbProxySolarisOpen pProxyDev=%p pszAddress=%s pvBackend=%p\n", pProxyDev, pszAddress, pvBackend));
    293295
     
    301303         * Allocate and initialize the solaris backend data.
    302304         */
    303         PUSBPROXYDEVSOL pDevSol = (PUSBPROXYDEVSOL)RTMemAllocZ(sizeof(*pDevSol));
    304         if (RT_LIKELY(pDevSol))
     305        AssertCompile(PATH_MAX >= MAXPATHLEN);
     306        char szDeviceIdent[PATH_MAX+48];
     307        rc = RTStrPrintf(szDeviceIdent, sizeof(szDeviceIdent), "%s", pszAddress);
     308        if (RT_SUCCESS(rc))
    305309        {
    306             AssertCompile(PATH_MAX >= MAXPATHLEN);
    307             char szDeviceIdent[PATH_MAX+48];
    308             rc = RTStrPrintf(szDeviceIdent, sizeof(szDeviceIdent), "%s", pszAddress);
     310            rc = RTCritSectInit(&pDevSol->CritSect);
    309311            if (RT_SUCCESS(rc))
    310312            {
    311                 rc = RTCritSectInit(&pDevSol->CritSect);
     313                /*
     314                 * Create wakeup pipe.
     315                 */
     316                rc = RTPipeCreate(&pDevSol->hPipeWakeupR, &pDevSol->hPipeWakeupW, 0);
    312317                if (RT_SUCCESS(rc))
    313318                {
    314                     pProxyDev->Backend.pv = pDevSol;
    315 
    316                     /*
    317                      * Create wakeup pipe.
    318                      */
    319                     rc = RTPipeCreate(&pDevSol->hPipeWakeupR, &pDevSol->hPipeWakeupW, 0);
     319                    int Instance;
     320                    char *pszDevicePath = NULL;
     321                    rc = USBLibGetClientInfo(szDeviceIdent, &pszDevicePath, &Instance);
    320322                    if (RT_SUCCESS(rc))
    321323                    {
    322                         int Instance;
    323                         char *pszDevicePath = NULL;
    324                         rc = USBLibGetClientInfo(szDeviceIdent, &pszDevicePath, &Instance);
     324                        pDevSol->pszDevicePath = pszDevicePath;
     325
     326                        /*
     327                         * Open the client driver.
     328                         */
     329                        RTFILE hFile;
     330                        rc = RTFileOpen(&hFile, pDevSol->pszDevicePath, RTFILE_O_READWRITE | RTFILE_O_OPEN | RTFILE_O_DENY_NONE);
    325331                        if (RT_SUCCESS(rc))
    326332                        {
    327                             pDevSol->pszDevicePath = pszDevicePath;
     333                            pDevSol->hFile = hFile;
     334                            pDevSol->pProxyDev = pProxyDev;
    328335
    329336                            /*
    330                              * Open the client driver.
     337                             * Verify client driver version.
    331338                             */
    332                             RTFILE hFile;
    333                             rc = RTFileOpen(&hFile, pDevSol->pszDevicePath, RTFILE_O_READWRITE | RTFILE_O_OPEN | RTFILE_O_DENY_NONE);
     339                            VBOXUSBREQ_GET_VERSION GetVersionReq;
     340                            bzero(&GetVersionReq, sizeof(GetVersionReq));
     341                            rc = usbProxySolarisIOCtl(pDevSol, VBOXUSB_IOCTL_GET_VERSION, &GetVersionReq, sizeof(GetVersionReq));
    334342                            if (RT_SUCCESS(rc))
    335343                            {
    336                                 pDevSol->hFile = hFile;
    337                                 pDevSol->pProxyDev = pProxyDev;
    338 
    339                                 /*
    340                                  * Verify client driver version.
    341                                  */
    342                                 VBOXUSBREQ_GET_VERSION GetVersionReq;
    343                                 bzero(&GetVersionReq, sizeof(GetVersionReq));
    344                                 rc = usbProxySolarisIOCtl(pDevSol, VBOXUSB_IOCTL_GET_VERSION, &GetVersionReq, sizeof(GetVersionReq));
    345                                 if (RT_SUCCESS(rc))
     344                                if (   GetVersionReq.u32Major == VBOXUSB_VERSION_MAJOR
     345                                    && GetVersionReq.u32Minor >= VBOXUSB_VERSION_MINOR)
    346346                                {
    347                                     if (   GetVersionReq.u32Major == VBOXUSB_VERSION_MAJOR
    348                                         && GetVersionReq.u32Minor >= VBOXUSB_VERSION_MINOR)
    349                                     {
    350                                         /*
    351                                          * Try & get the current cached config from Solaris.
    352                                          */
    353                                         usbProxySolarisGetActiveConfig(pDevSol);
    354                                         return VINF_SUCCESS;
    355                                     }
    356                                     else
    357                                     {
    358                                         LogRel((USBPROXY ":version mismatch! driver v%d.%d expecting ~v%d.%d\n", GetVersionReq.u32Major,
    359                                                 GetVersionReq.u32Minor, VBOXUSB_VERSION_MAJOR, VBOXUSB_VERSION_MINOR));
    360                                         rc = VERR_VERSION_MISMATCH;
    361                                     }
     347                                    /*
     348                                     * Try & get the current cached config from Solaris.
     349                                     */
     350                                    usbProxySolarisGetActiveConfig(pDevSol);
     351                                    return VINF_SUCCESS;
    362352                                }
    363353                                else
    364354                                {
    365                                     LogRel((USBPROXY ":failed to query driver version. rc=%Rrc\n", rc));
     355                                    LogRel((USBPROXY ":version mismatch! driver v%d.%d expecting ~v%d.%d\n", GetVersionReq.u32Major,
     356                                            GetVersionReq.u32Minor, VBOXUSB_VERSION_MAJOR, VBOXUSB_VERSION_MINOR));
     357                                    rc = VERR_VERSION_MISMATCH;
    366358                                }
    367 
    368                                 RTFileClose(pDevSol->hFile);
    369                                 pDevSol->hFile = NIL_RTFILE;
    370                                 pDevSol->pProxyDev = NULL;
    371359                            }
    372360                            else
    373                                 LogRel((USBPROXY ":failed to open device. rc=%Rrc pszDevicePath=%s\n", rc, pDevSol->pszDevicePath));
    374 
    375                             RTStrFree(pDevSol->pszDevicePath);
    376                             pDevSol->pszDevicePath = NULL;
     361                                LogRel((USBPROXY ":failed to query driver version. rc=%Rrc\n", rc));
     362
     363                            RTFileClose(pDevSol->hFile);
     364                            pDevSol->hFile = NIL_RTFILE;
     365                            pDevSol->pProxyDev = NULL;
    377366                        }
    378367                        else
    379                         {
    380                             LogRel((USBPROXY ":failed to get client info. rc=%Rrc pszDevicePath=%s\n", rc, pDevSol->pszDevicePath));
    381                             if (rc == VERR_NOT_FOUND)
    382                                 rc = VERR_OPEN_FAILED;
    383                         }
    384                         RTPipeClose(pDevSol->hPipeWakeupR);
    385                         RTPipeClose(pDevSol->hPipeWakeupW);
     368                            LogRel((USBPROXY ":failed to open device. rc=%Rrc pszDevicePath=%s\n", rc, pDevSol->pszDevicePath));
     369
     370                        RTStrFree(pDevSol->pszDevicePath);
     371                        pDevSol->pszDevicePath = NULL;
    386372                    }
    387 
    388                     RTCritSectDelete(&pDevSol->CritSect);
     373                    else
     374                    {
     375                        LogRel((USBPROXY ":failed to get client info. rc=%Rrc pszDevicePath=%s\n", rc, pDevSol->pszDevicePath));
     376                        if (rc == VERR_NOT_FOUND)
     377                            rc = VERR_OPEN_FAILED;
     378                    }
     379                    RTPipeClose(pDevSol->hPipeWakeupR);
     380                    RTPipeClose(pDevSol->hPipeWakeupW);
    389381                }
    390                 else
    391                     LogRel((USBPROXY ":RTCritSectInit failed. rc=%Rrc pszAddress=%s\n", rc, pszAddress));
     382
     383                RTCritSectDelete(&pDevSol->CritSect);
    392384            }
    393385            else
    394                 LogRel((USBPROXY ":RTStrAPrintf failed. rc=%Rrc pszAddress=%s\n", rc, pszAddress));
    395 
    396             RTMemFree(pDevSol);
    397             pDevSol = NULL;
     386                LogRel((USBPROXY ":RTCritSectInit failed. rc=%Rrc pszAddress=%s\n", rc, pszAddress));
    398387        }
    399388        else
    400             rc = VERR_NO_MEMORY;
     389            LogRel((USBPROXY ":RTStrAPrintf failed. rc=%Rrc pszAddress=%s\n", rc, pszAddress));
    401390    }
    402391    else
     
    404393
    405394    USBLibTerm();
    406     pProxyDev->Backend.pv = NULL;
    407395    return rc;
    408396}
     
    414402 * @param   pProxyDev   The device instance.
    415403 */
    416 static void usbProxySolarisClose(PUSBPROXYDEV pProxyDev)
     404static DECLCALLBACK(void) usbProxySolarisClose(PUSBPROXYDEV pProxyDev)
    417405{
    418406    LogFlow((USBPROXY ":usbProxySolarisClose: pProxyDev=%p\n", pProxyDev));
    419407
    420     PUSBPROXYDEVSOL pDevSol = (PUSBPROXYDEVSOL)pProxyDev->Backend.pv;
     408    PUSBPROXYDEVFBSD pDevSol = USBPROXYDEV_2_DATA(pProxyDev, PUSBPROXYDEVSOL);
    421409
    422410    /* Close the device (do not re-enumerate). */
     
    452440    pDevSol->pszDevicePath = NULL;
    453441
    454     RTMemFree(pDevSol);
    455     pProxyDev->Backend.pv = NULL;
    456 
    457442    USBLibTerm();
    458443}
     
    466451 * @param   fRootHubReset       Is this a root hub reset or device specific reset request.
    467452 */
    468 static int usbProxySolarisReset(PUSBPROXYDEV pProxyDev, bool fRootHubReset)
     453static DECLCALLBACK(int) usbProxySolarisReset(PUSBPROXYDEV pProxyDev, bool fRootHubReset)
    469454{
    470455    LogFlowFunc((USBPROXY ":usbProxySolarisReset pProxyDev=%s fRootHubReset=%d\n", pProxyDev->pUsbIns->pszName, fRootHubReset));
    471456
    472457    /** Pass all resets to the device. The Trekstor USB (1.1) stick requires this to work. */
    473     PUSBPROXYDEVSOL pDevSol = (PUSBPROXYDEVSOL)pProxyDev->Backend.pv;
     458    PUSBPROXYDEVFBSD pDevSol = USBPROXYDEV_2_DATA(pProxyDev, PUSBPROXYDEVSOL);
    474459
    475460    /* Soft reset the device. */
     
    499484 * @param   iCfg            The configuration value to set.
    500485 */
    501 static int usbProxySolarisSetConfig(PUSBPROXYDEV pProxyDev, int iCfg)
     486static DECLCALLBACK(int) usbProxySolarisSetConfig(PUSBPROXYDEV pProxyDev, int iCfg)
    502487{
    503488    LogFlowFunc((USBPROXY ":usbProxySolarisSetConfig: pProxyDev=%p iCfg=%#x\n", pProxyDev, iCfg));
    504489
    505     PUSBPROXYDEVSOL pDevSol = (PUSBPROXYDEVSOL)pProxyDev->Backend.pv;
     490    PUSBPROXYDEVFBSD pDevSol = USBPROXYDEV_2_DATA(pProxyDev, PUSBPROXYDEVSOL);
    506491    AssertPtrReturn(pDevSol, VERR_INVALID_POINTER);
    507492
     
    527512 * @returns success indicator (always true).
    528513 */
    529 static int usbProxySolarisClaimInterface(PUSBPROXYDEV pProxyDev, int iIf)
     514static DECLCALLBACK(int) usbProxySolarisClaimInterface(PUSBPROXYDEV pProxyDev, int iIf)
    530515{
    531516    return true;
     
    541526 * @returns success indicator.
    542527 */
    543 static int usbProxySolarisReleaseInterface(PUSBPROXYDEV pProxyDev, int iIf)
     528static DECLCALLBACK(int) usbProxySolarisReleaseInterface(PUSBPROXYDEV pProxyDev, int iIf)
    544529{
    545530    return true;
     
    552537 * @returns success indicator.
    553538 */
    554 static int usbProxySolarisSetInterface(PUSBPROXYDEV pProxyDev, int iIf, int iAlt)
     539static DECLCALLBACK(int) usbProxySolarisSetInterface(PUSBPROXYDEV pProxyDev, int iIf, int iAlt)
    555540{
    556541    LogFlowFunc((USBPROXY ":usbProxySolarisSetInterface: pProxyDev=%p iIf=%d iAlt=%d\n", pProxyDev, iIf, iAlt));
    557542
    558     PUSBPROXYDEVSOL pDevSol = (PUSBPROXYDEVSOL)pProxyDev->Backend.pv;
     543    PUSBPROXYDEVFBSD pDevSol = USBPROXYDEV_2_DATA(pProxyDev, PUSBPROXYDEVSOL);
    559544    AssertPtrReturn(pDevSol, VERR_INVALID_POINTER);
    560545
     
    576561 * Clears the halted endpoint 'EndPt'.
    577562 */
    578 static bool usbProxySolarisClearHaltedEp(PUSBPROXYDEV pProxyDev, unsigned int EndPt)
     563static DECLCALLBACK(bool) usbProxySolarisClearHaltedEp(PUSBPROXYDEV pProxyDev, unsigned int EndPt)
    579564{
    580565    LogFlowFunc((USBPROXY ":usbProxySolarisClearHaltedEp pProxyDev=%p EndPt=%#x\n", pProxyDev, EndPt));
    581566
    582     PUSBPROXYDEVSOL pDevSol = (PUSBPROXYDEVSOL)pProxyDev->Backend.pv;
     567    PUSBPROXYDEVFBSD pDevSol = USBPROXYDEV_2_DATA(pProxyDev, PUSBPROXYDEVSOL);
    583568    AssertPtrReturn(pDevSol, VERR_INVALID_POINTER);
    584569
     
    599584 * @copydoc USBPROXYBACK::pfnUrbQueue
    600585 */
    601 static int usbProxySolarisUrbQueue(PVUSBURB pUrb)
     586static DECLCALLBACK(int) usbProxySolarisUrbQueue(PVUSBURB pUrb)
    602587{
    603588    PUSBPROXYDEV    pProxyDev = PDMINS_2_DATA(pUrb->pUsbIns, PUSBPROXYDEV);
    604     PUSBPROXYDEVSOL pDevSol = (PUSBPROXYDEVSOL)pProxyDev->Backend.pv;
     589    PUSBPROXYDEVFBSD pDevSol = USBPROXYDEV_2_DATA(pProxyDev, PUSBPROXYDEVSOL);
    605590
    606591    LogFlowFunc((USBPROXY ": usbProxySolarisUrbQueue: pProxyDev=%s pUrb=%p EndPt=%#x enmDir=%d cbData=%d pvData=%p\n",
     
    665650 *          on Solaris. So we just abort pending URBs on the pipe.
    666651 */
    667 static void usbProxySolarisUrbCancel(PVUSBURB pUrb)
     652static DECLCALLBACK(void) usbProxySolarisUrbCancel(PVUSBURB pUrb)
    668653{
    669654    PUSBPROXYURBSOL pUrbSol = (PUSBPROXYURBSOL)pUrb->Dev.pvPrivate;
    670655
    671656    PUSBPROXYDEV pProxyDev = PDMINS_2_DATA(pUrb->pUsbIns, PUSBPROXYDEV);
    672     PUSBPROXYDEVSOL pDevSol = (PUSBPROXYDEVSOL)pProxyDev->Backend.pv;
     657    PUSBPROXYDEVFBSD pDevSol = USBPROXYDEV_2_DATA(pProxyDev, PUSBPROXYDEVSOL);
    673658    AssertPtrReturnVoid(pDevSol);
    674659
     
    701686 * @param   cMillies    Number of milliseconds to wait. Use 0 to not wait at all.
    702687 */
    703 static PVUSBURB usbProxySolarisUrbReap(PUSBPROXYDEV pProxyDev, RTMSINTERVAL cMillies)
     688static DECLCALLBACK(PVUSBURB) usbProxySolarisUrbReap(PUSBPROXYDEV pProxyDev, RTMSINTERVAL cMillies)
    704689{
    705690    //LogFlowFunc((USBPROXY ":usbProxySolarisUrbReap pProxyDev=%p cMillies=%u\n", pProxyDev, cMillies));
    706691
    707     PUSBPROXYDEVSOL pDevSol = (PUSBPROXYDEVSOL)pProxyDev->Backend.pv;
     692    PUSBPROXYDEVFBSD pDevSol = USBPROXYDEV_2_DATA(pProxyDev, PUSBPROXYDEVSOL);
    708693
    709694    /*
     
    805790 * @param   pDevSol         The Solaris device instance.
    806791 */
    807 PVUSBURB usbProxySolarisUrbComplete(PUSBPROXYDEVSOL pDevSol)
     792static PVUSBURB usbProxySolarisUrbComplete(PUSBPROXYDEVSOL pDevSol)
    808793{
    809794    LogFlowFunc((USBPROXY ":usbProxySolarisUrbComplete pDevSol=%p\n", pDevSol));
     
    895880static DECLCALLBACK(int) usbProxySolarisWakeup(PUSBPROXYDEV pProxyDev)
    896881{
    897     PUSBPROXYDEVSOL pDevSol = (PUSBPROXYDEVSOL)pProxyDev->Backend.pv;
     882    PUSBPROXYDEVFBSD pDevSol = USBPROXYDEV_2_DATA(pProxyDev, PUSBPROXYDEVSOL);
    898883    size_t cbIgnored;
    899884
     
    909894extern const USBPROXYBACK g_USBProxyDeviceHost =
    910895{
     896    /* pszName */
    911897    "host",
     898    /* cbBackend */
     899    sizeof(USBPROXYDEVSOL),
    912900    usbProxySolarisOpen,
    913901    NULL,
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