VirtualBox

Changeset 698 in vbox for trunk/src/VBox/Devices/Network


Ignore:
Timestamp:
Feb 6, 2007 10:53:20 AM (18 years ago)
Author:
vboxsync
Message:

Slirp must be protected by a lock due to recent async send changes.

Location:
trunk/src/VBox/Devices/Network
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Devices/Network/DevPCNet.cpp

    r652 r698  
    37803780            pData->Led.Asserted.s.fError = pData->Led.Actual.s.fError = 1;
    37813781        }
     3782        Assert(!PDMCritSectIsOwner(&pData->CritSect));
    37823783        pData->pDrv->pfnNotifyLinkChanged(pData->pDrv, enmState);
    37833784    }
  • trunk/src/VBox/Devices/Network/DrvNAT.cpp

    r587 r698  
    3636#include <iprt/file.h>
    3737#include <iprt/string.h>
     38#include <iprt/critsect.h>
    3839
    3940#include "Builtins.h"
     
    5455    /** Pointer to the driver instance. */
    5556    PPDMDRVINS              pDrvIns;
    56 
     57    /** Slirp critical section. */
     58    RTCRITSECT              CritSect;
    5759} DRVNAT, *PDRVNAT;
    5860
     
    7375/** The thread id of the select thread (drvNATSelectThread()). */
    7476static RTTHREAD         g_ThreadSelect;
    75 
    76 static RTCRITSECT       g_CritSectSlirp;
    7777#endif
    7878
     
    8989static DECLCALLBACK(int) drvNATSend(PPDMINETWORKCONNECTOR pInterface, const void *pvBuf, size_t cb)
    9090{
     91    PPDMDRVINS pDrvIns = PDMIBASE_2_PDMDRV(pInterface);
     92    PDRVNAT    pData = PDMINS2DATA(pDrvIns, PDRVNAT);
     93
    9194    LogFlow(("drvNATSend: pvBuf=%p cb=%#x\n", pvBuf, cb));
    9295    Log2(("drvNATSend: pvBuf=%p cb=%#x\n"
    9396          "%.*Vhxd\n",
    9497          pvBuf, cb, cb, pvBuf));
     98
     99    int rc = RTCritSectEnter(&pData->CritSect);
     100    AssertReleaseRC(rc);
     101
    95102    slirp_input((uint8_t *)pvBuf, cb);
     103    RTCritSectLeave(&pData->CritSect);
    96104    return VINF_SUCCESS;
    97105}
     
    124132static DECLCALLBACK(void) drvNATNotifyLinkChanged(PPDMINETWORKCONNECTOR pInterface, PDMNETWORKLINKSTATE enmLinkState)
    125133{
     134    PPDMDRVINS pDrvIns = PDMIBASE_2_PDMDRV(pInterface);
     135    PDRVNAT    pData = PDMINS2DATA(pDrvIns, PDRVNAT);
     136
    126137    LogFlow(("drvNATNotifyLinkChanged: enmLinkState=%d\n", enmLinkState));
     138
     139    int rc = RTCritSectEnter(&pData->CritSect);
     140    AssertReleaseRC(rc);
    127141    switch (enmLinkState)
    128142    {
     
    131145            slirp_link_up();
    132146            break;
     147
    133148        case PDMNETWORKLINKSTATE_DOWN:
    134149        case PDMNETWORKLINKSTATE_DOWN_RESUME:
     
    136151            slirp_link_down();
    137152            break;
     153
    138154        default:
    139155            AssertMsgFailed(("drvNATNotifyLinkChanged: unexpected link state %d\n", enmLinkState));
    140156    }
     157    RTCritSectLeave(&pData->CritSect);
    141158}
    142159
     
    162179static DECLCALLBACK(void) drvNATPoller(PPDMDRVINS pDrvIns)
    163180{
     181    PDRVNAT pData = PDMINS2DATA(pDrvIns, PDRVNAT);
    164182    fd_set  ReadFDs;
    165183    fd_set  WriteFDs;
     
    169187    FD_ZERO(&WriteFDs);
    170188    FD_ZERO(&XcptFDs);
     189
     190    int rc = RTCritSectEnter(&pData->CritSect);
     191    AssertReleaseRC(rc);
     192
    171193    slirp_select_fill(&cFDs, &ReadFDs, &WriteFDs, &XcptFDs);
    172194
     
    175197    if (cReadFDs >= 0)
    176198        slirp_select_poll(&ReadFDs, &WriteFDs, &XcptFDs);
     199
     200    RTCritSectLeave(&pData->CritSect);
    177201}
    178202
     
    185209int slirp_can_output(void)
    186210{
     211    int rcCanSend = 0;
     212
     213    Assert(RTCritSectIsOwner(&g_pDrv->CritSect));
     214    RTCritSectLeave(&g_pDrv->CritSect);
     215
    187216    if (g_pDrv)
    188         return g_pDrv->pPort->pfnCanReceive(g_pDrv->pPort);
    189     return 0;
     217        rcCanSend = g_pDrv->pPort->pfnCanReceive(g_pDrv->pPort);
     218
     219    int rc = RTCritSectEnter(&g_pDrv->CritSect);
     220    AssertReleaseRC(rc);
     221
     222    return rcCanSend;
    190223}
    191224
     
    202235    if (g_pDrv)
    203236    {
     237        Assert(RTCritSectIsOwner(&g_pDrv->CritSect));
     238        RTCritSectLeave(&g_pDrv->CritSect);
     239
    204240        int rc = g_pDrv->pPort->pfnReceive(g_pDrv->pPort, pu8Buf, cb);
    205         AssertRC(rc); NOREF(rc);
     241        AssertRC(rc);
     242
     243        rc = RTCritSectEnter(&g_pDrv->CritSect);
     244        AssertReleaseRC(rc);
    206245    }
    207246}
     
    242281static DECLCALLBACK(void) drvNATDestruct(PPDMDRVINS pDrvIns)
    243282{
     283    PDRVNAT pData = PDMINS2DATA(pDrvIns, PDRVNAT);
     284
    244285    LogFlow(("drvNATDestruct:\n"));
     286
    245287#if ARCH_BITS == 64
    246288    LogRel(("NAT: g_cpvHashUsed=%RU32 g_cpvHashCollisions=%RU32 g_cpvHashInserts=%RU64 g_cpvHashDone=%RU64\n",
     
    248290#endif
    249291    slirp_term();
     292    RTCritSectDelete(&pData->CritSect);
    250293    g_pDrv = NULL;
    251294}
     
    368411                                N_("Configuration error: the above device/driver didn't export the network port interface!\n"));
    369412
    370 #if 0
    371413    /*
    372      * The slirp lock and thread sem.
     414     * The slirp lock..
    373415     */
    374     int rc = RTCritSectInit(&g_CritSectSlirp);
     416    int rc = RTCritSectInit(&pData->CritSect);
    375417    if (VBOX_FAILURE(rc))
    376418        return rc;
     419#if 0
    377420    rc = RTSemEventCreate(&g_EventSem);
    378421    if (VBOX_SUCCESS(rc))
     
    386429        {
    387430#endif
    388             int rc;
    389431            /*
    390432             * Initialize slirp.
     
    428470        g_EventSem = NULL;
    429471    }
    430     RTCritSectDelete(&g_CritSectSlirp);
    431472#endif
     473    RTCritSectDelete(&pData->CritSect);
    432474    return rc;
    433475}
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