VirtualBox

Ignore:
Timestamp:
Mar 25, 2012 7:36:15 PM (13 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
77032
Message:

SUPDrv-dtrace.c: Made it work.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/HostDrivers/Support/SUPDrv-dtrace.cpp

    r40612 r40617  
    7878    /** The ID of this provider. */
    7979    dtrace_provider_id_t idDtProv;
     80    /** The number of probes we've provided to DTrace. */
     81    uint32_t            cProvidedProbes;
    8082} SUPDRVDTPROVIDER;
    8183/** Pointer to the data for a provider. */
     
    454456        if (pProv)
    455457        {
    456             pProv->pDesc        = pDesc;
    457             pProv->pHdr         = pVtgHdr;
    458             pProv->pImage       = pImage;
    459             pProv->pSession     = pSession;
    460             pProv->pszModName   = pszModName;
    461             pProv->idDtProv     = 0;
     458            pProv->pDesc            = pDesc;
     459            pProv->pHdr             = pVtgHdr;
     460            pProv->pImage           = pImage;
     461            pProv->pSession         = pSession;
     462            pProv->pszModName       = pszModName;
     463            pProv->idDtProv         = 0;
     464            pProv->cProvidedProbes  = 0;
    462465            supdrvVtgConvAttr(&pProv->DtAttrs.dtpa_provider, &pDesc->AttrSelf);
    463466            supdrvVtgConvAttr(&pProv->DtAttrs.dtpa_mod,      &pDesc->AttrModules);
     
    674677        return;  /* We don't generate probes, so never mind these requests. */
    675678
     679    if (pProv->cProvidedProbes >= pProv->pDesc->cProbes)
     680        return;
     681
    676682     /* Need a buffer for extracting the function names and mangling them in
    677683        case of collision. */
     
    689695     {
    690696         PVTGDESCPROBE pProbeDesc = (PVTGDESCPROBE)pProbeLoc->pbProbe;
    691          if (pProbeDesc->idxProvider == idxProv)
     697         if (   pProbeDesc->idxProvider == idxProv
     698             && pProbeLoc->idProbe      == UINT32_MAX)
    692699         {
    693700             /* The function name normally needs to be stripped since we're
     
    751758             pProbeLoc->idProbe = dtrace_probe_create(pProv->idDtProv, pProv->pszModName, pszFnNmBuf, pszPrbName,
    752759                                                      0 /*aframes*/, pProbeLoc);
     760             pProv->cProvidedProbes++;
    753761         }
    754762
     
    765773static int      supdrvDTracePOps_Enable(void *pvProv, dtrace_id_t idProbe, void *pvProbe)
    766774{
    767     PVTGPROBELOC    pProbeLoc  = (PVTGPROBELOC)pvProbe;
    768     PVTGDESCPROBE   pProbeDesc = (PVTGDESCPROBE)pProbeLoc->pbProbe;
     775    PSUPDRVDTPROVIDER   pProv      = (PSUPDRVDTPROVIDER)pvProv;
     776    PVTGPROBELOC        pProbeLoc  = (PVTGPROBELOC)pvProbe;
     777    PVTGDESCPROBE       pProbeDesc = (PVTGDESCPROBE)pProbeLoc->pbProbe;
    769778
    770779    if (!pProbeLoc->fEnabled)
     
    772781        pProbeLoc->fEnabled = 1;
    773782        if (ASMAtomicIncU32(&pProbeDesc->u32User) == 1)
    774             pProbeLoc->fEnabled = 1;
     783            pProv->pHdr->pafProbeEnabled[pProbeDesc->idxEnabled] = 1;
    775784    }
    776785
     
    785794static void     supdrvDTracePOps_Disable(void *pvProv, dtrace_id_t idProbe, void *pvProbe)
    786795{
    787     PVTGPROBELOC    pProbeLoc  = (PVTGPROBELOC)pvProbe;
    788     PVTGDESCPROBE   pProbeDesc = (PVTGDESCPROBE)pProbeLoc->pbProbe;
     796    PSUPDRVDTPROVIDER   pProv      = (PSUPDRVDTPROVIDER)pvProv;
     797    PVTGPROBELOC        pProbeLoc  = (PVTGPROBELOC)pvProbe;
     798    PVTGDESCPROBE       pProbeDesc = (PVTGDESCPROBE)pProbeLoc->pbProbe;
    789799
    790800    if (pProbeLoc->fEnabled)
     
    792802        pProbeLoc->fEnabled = 0;
    793803        if (ASMAtomicDecU32(&pProbeDesc->u32User) == 0)
    794             pProbeLoc->fEnabled = 0;
     804            pProv->pHdr->pafProbeEnabled[pProbeDesc->idxEnabled] = 1;
    795805    }
    796806
     
    816826        size_t      cchType = strlen(pszType);
    817827        if (cchType < sizeof(pArgDesc->dtargd_native))
     828        {
    818829            memcpy(pArgDesc->dtargd_native, pszType, cchType + 1);
     830            /** @todo mapping */
     831        }
    819832        else
    820833            pArgDesc->dtargd_ndx = DTRACE_ARGNONE;
     
    842855static void    supdrvDTracePOps_Destroy(void *pvProv, dtrace_id_t idProbe, void *pvProbe)
    843856{
     857    PSUPDRVDTPROVIDER   pProv      = (PSUPDRVDTPROVIDER)pvProv;
    844858    PVTGPROBELOC        pProbeLoc  = (PVTGPROBELOC)pvProbe;
    845859
     
    847861    Assert(pProbeLoc->idProbe == idProbe); NOREF(idProbe);
    848862    pProbeLoc->idProbe = UINT32_MAX;
    849 
    850     NOREF(pvProv);
    851 }
    852 
     863    pProv->cProvidedProbes--;
     864}
     865
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