VirtualBox

Changeset 18915 in vbox


Ignore:
Timestamp:
Apr 15, 2009 8:50:39 PM (16 years ago)
Author:
vboxsync
Message:

Support/FreeBSD: Do reference counting to prevent the driver from getting unloaded while it is used

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/HostDrivers/Support/freebsd/SUPDrv-freebsd.c

    r16030 r18915  
    104104/** The dev_clone event handler tag. */
    105105static eventhandler_tag     g_VBoxDrvFreeBSDEHTag;
     106/** Reference counter */
     107static volatile uint32_t    cUsers;
    106108
    107109/** The device extention. */
     
    148150{
    149151    dprintf(("VBoxDrvFreeBSDLoad:\n"));
     152
     153    cUsers = 0;
    150154
    151155    /*
     
    190194    dprintf(("VBoxDrvFreeBSDUnload:\n"));
    191195
    192     /** @todo verify that FreeBSD does reference counting. */
     196    if (cUsers > 0)
     197        return EBUSY;
    193198
    194199    /*
     
    307312        pSession->Gid = stuff; */
    308313        if (ASMAtomicCmpXchgPtr(&pDev->si_drv1, pSession, (void *)0x42))
     314        {
     315            ASMAtomicIncU32(&cUsers);
    309316            return 0;
     317        }
    310318
    311319        OSDBGPRINT(("VBoxDrvFreeBSDOpen: si_drv1=%p, expected 0x42!\n", pDev->si_drv1));
     
    339347        if (!ASMAtomicCmpXchgPtr(&pDev->si_drv1, NULL, pSession))
    340348            OSDBGPRINT(("VBoxDrvFreeBSDClose: si_drv1=%p expected %p!\n", pDev->si_drv1, pSession));
     349        ASMAtomicDecU32(&cUsers);
     350        /* Don't use destroy_dev here because it may sleep resulting in a hanging user process. */
     351        destroy_dev_sched(pDev);
    341352    }
    342353    else
     
    491502                OSDBGPRINT(("VBoxDrvFreeBSDIOCtlSlow: copyout(%p,%p,%#x) -> %d; uCmd=%#lx!\n", pHdr, pvUser, cbOut, rc, ulCmd));
    492503
     504            dprintf(("VBoxDrvFreeBSDIOCtlSlow: returns %d / %d ulCmd=%lx\n", 0, pHdr->rc, ulCmd));
     505
    493506            /* cleanup */
    494507            RTMemTmpFree(pHdr);
    495508        }
    496         dprintf(("VBoxDrvFreeBSDIOCtlSlow: returns %d / %d ulCmd=%lx\n", 0, pHdr->rc, ulCmd));
    497509    }
    498510    else
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