VirtualBox

Changeset 90911 in vbox


Ignore:
Timestamp:
Aug 26, 2021 1:27:36 PM (3 years ago)
Author:
vboxsync
Message:

Audio/ATS: Client disconnection fixes. bugref:10008

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Devices/Audio/AudioTestService.cpp

    r90905 r90911  
    118118/** Pointer to a ATS client instance. */
    119119typedef ATSCLIENTINST *PATSCLIENTINST;
     120
     121
     122/*********************************************************************************************************************************
     123*   Prototypes                                                                                                                   *
     124*********************************************************************************************************************************/
     125static int atsClientDisconnect(PATSSERVER pThis, PATSCLIENTINST pInst);
     126
     127
    120128
    121129/**
     
    483491        }
    484492        else
    485             rc = atsReplyRC(pThis, pInst, pPktHdr, rc, "Shutting down server failed");
    486 
    487         if (RT_SUCCESS(rc))
    488             pThis->pTransport->pfnNotifyBye(pThis->pTransportInst, pInst->pTransportClient);
     493            rc = atsReplyRC(pThis, pInst, pPktHdr, rc, "Disconnecting client failed");
    489494    }
    490495    else
     
    786791 * @returns IPRT status code.
    787792 * @param   pThis               The ATS instance.
    788  * @param   pInst             The ATS client structure sending the request.
    789  */
    790 static int atsClientReqProcess(PATSSERVER pThis, PATSCLIENTINST pInst)
     793 * @param   pInst               The ATS client structure sending the request.
     794 * @param   pfDisconnect        Where to return whether to disconnect the client on success or not.
     795 */
     796static int atsClientReqProcess(PATSSERVER pThis, PATSCLIENTINST pInst, bool *pfDisconnect)
    791797{
    792798    /*
     
    805811        rc = atsDoHowdy(pThis, pInst, pPktHdr);
    806812    else if (atsIsSameOpcode(pPktHdr, ATSPKT_OPCODE_BYE))
     813    {
    807814        rc = atsDoBye(pThis, pInst, pPktHdr);
     815        if (RT_SUCCESS(rc))
     816            *pfDisconnect = true;
     817    }
    808818    /* Test set handling: */
    809819    else if (atsIsSameOpcode(pPktHdr, ATSPKT_OPCODE_TESTSET_BEGIN))
     
    827837}
    828838
    829 /**
    830  * Destroys a client instance.
     839static int atsClientDisconnect(PATSSERVER pThis, PATSCLIENTINST pInst)
     840{
     841    AssertReturn(pInst->enmState != ATSCLIENTSTATE_DESTROYING, VERR_WRONG_ORDER);
     842
     843    pInst->enmState = ATSCLIENTSTATE_DESTROYING;
     844    pThis->pTransport->pfnNotifyBye(pThis->pTransportInst, pInst->pTransportClient);
     845
     846    return VINF_SUCCESS;
     847}
     848
     849/**
     850 * Free's (destroys) a client instance.
    831851 *
    832852 * @returns nothing.
    833853 * @param   pInst               The opaque ATS instance structure.
    834854 */
    835 static void atsClientDestroy(PATSCLIENTINST pInst)
     855static void atsClientFree(PATSCLIENTINST pInst)
    836856{
    837857    if (pInst->pszHostname)
     
    911931                            else
    912932                            {
    913                                 pThis->pTransport->pfnNotifyBye(pThis->pTransportInst, pIt->pTransportClient);
    914                                 atsClientDestroy(pIt);
     933                                atsClientDisconnect(pThis, pIt);
     934                                atsClientFree(pIt);
     935                                pIt = NULL;
    915936                            }
    916937                        }
    917938                        else
    918939                        {
    919                             pThis->pTransport->pfnNotifyBye(pThis->pTransportInst, pIt->pTransportClient);
    920                             atsClientDestroy(pIt);
     940                            atsClientDisconnect(pThis, pIt);
     941                            atsClientFree(pIt);
     942                            pIt = NULL;
    921943                        }
    922944                    }
     
    925947                else
    926948                {
     949                    bool fDisconnect = false;
     950
    927951                    /* Client sends a request, pick the right client and process it. */
    928952                    PATSCLIENTINST pInst = papInsts[uId - 1];
    929953                    AssertPtr(pInst);
    930954                    if (fEvts & RTPOLL_EVT_READ)
    931                         rc = atsClientReqProcess(pThis, pInst);
     955                        rc = atsClientReqProcess(pThis, pInst, &fDisconnect);
    932956
    933957                    if (   (fEvts & RTPOLL_EVT_ERROR)
    934                         || RT_FAILURE(rc))
     958                        || RT_FAILURE(rc)
     959                        || fDisconnect)
    935960                    {
    936961                        /* Close connection and remove client from array. */
    937                         rc = pThis->pTransport->pfnPollSetRemove(pThis->pTransportInst, pThis->hPollSet, pInst->pTransportClient, uId);
    938                         AssertRC(rc);
    939 
    940                         pThis->pTransport->pfnNotifyBye(pThis->pTransportInst, pInst->pTransportClient);
    941                         pInst->pTransportClient = NULL;
     962                        int rc2 = pThis->pTransport->pfnPollSetRemove(pThis->pTransportInst, pThis->hPollSet, pInst->pTransportClient, uId);
     963                        AssertRC(rc2);
     964
     965                        atsClientDisconnect(pThis, pInst);
     966                        atsClientFree(pInst);
     967                        pInst = NULL;
     968
    942969                        papInsts[uId - 1] = NULL;
     970                        Assert(cClientsCur);
    943971                        cClientsCur--;
    944                         atsClientDestroy(pInst);
    945972                    }
    946973                }
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