VirtualBox

Changeset 104920 in vbox for trunk/src/VBox/Runtime


Ignore:
Timestamp:
Jun 14, 2024 12:02:03 PM (11 months ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
163522
Message:

Runtime/tools/RTTraceLogTool,Devices/VBoxTraceLogDecoders.cpp: Allow attaching a state for a decoder to enable analysis spanning multiple events, bugref:10701

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Runtime/tools/RTTraceLogTool.cpp

    r104892 r104920  
    5555
    5656
     57typedef struct RTTRACELOGDECODER
     58{
     59    /** The tracelog decoder registration structure. */
     60    PCRTTRACELOGDECODERREG      pReg;
     61    /** The helper structure for this decoder. */
     62    RTTRACELOGDECODERHLP        Hlp;
     63    /** The decoder state if created. */
     64    void                        *pvDecoderState;
     65    /** The free callback of any attached decoder state. */
     66    PFNTRACELOGDECODERSTATEFREE pfnDecoderStateFree;
     67} RTTRACELOGDECODER;
     68typedef RTTRACELOGDECODER *PRTTRACELOGDECODER;
     69typedef const RTTRACELOGDECODER *PCRTTRACELOGDECODER;
     70
     71
    5772/**
    5873 * Loaded tracelog decoders.
    5974 */
    60 typedef struct RTTRACELOGDECODERS
     75typedef struct RTTRACELOGDECODERSTATE
    6176{
    6277    /** Pointer to the array of registered decoders. */
    63     PRTTRACELOGDECODERDECODEEVENT paDecodeEvts;
     78    PRTTRACELOGDECODER            paDecoders;
    6479    /** Number of entries in the decoder array. */
    6580    uint32_t                      cDecoders;
    6681    /** Allocation size of the decoder array. */
    6782    uint32_t                      cDecodersAlloc;
    68 } RTTRACELOGDECODERS;
    69 typedef RTTRACELOGDECODERS *PRTTRACELOGDECODERS;
     83} RTTRACELOGDECODERSTATE;
     84typedef RTTRACELOGDECODERSTATE *PRTTRACELOGDECODERSTATE;
    7085
    7186
     
    191206
    192207
    193 static DECLCALLBACK(int) rtTraceLogToolRegisterDecoders(void *pvUser, PCRTTRACELOGDECODERDECODEEVENT paDecoders, uint32_t cDecoders)
    194 {
    195     PRTTRACELOGDECODERS pDecoderState = (PRTTRACELOGDECODERS)pvUser;
     208static DECLCALLBACK(int) rtTraceLogToolDecoderHlpPrintf(PRTTRACELOGDECODERHLP pHlp, const char *pszFormat, ...)
     209                                                       RT_IPRT_FORMAT_ATTR(3, 4)
     210{
     211    RT_NOREF(pHlp);
     212    va_list Args;
     213    va_start(Args, pszFormat);
     214    int rc = RTMsgInfoV(pszFormat, Args);
     215    va_end(Args);
     216    return rc;
     217}
     218
     219
     220static DECLCALLBACK(int) rtTraceLogToolDecoderHlpErrorMsg(PRTTRACELOGDECODERHLP pHlp, const char *pszFormat, ...)
     221                                                         RT_IPRT_FORMAT_ATTR(3, 4)
     222{
     223    RT_NOREF(pHlp);
     224    va_list Args;
     225    va_start(Args, pszFormat);
     226    int rc = RTMsgErrorV(pszFormat, Args);
     227    va_end(Args);
     228    return rc;
     229}
     230
     231
     232static DECLCALLBACK(int) rtTraceLogToolDecoderHlpStateCreate(PRTTRACELOGDECODERHLP pHlp, size_t cbState, PFNTRACELOGDECODERSTATEFREE pfnFree,
     233                                                          void **ppvState)
     234{
     235    PRTTRACELOGDECODER pDecoder = RT_FROM_MEMBER(pHlp, RTTRACELOGDECODER, Hlp);
     236
     237    if (pDecoder->pvDecoderState)
     238    {
     239        if (pDecoder->pfnDecoderStateFree)
     240            pDecoder->pfnDecoderStateFree(pHlp, pDecoder->pvDecoderState);
     241        RTMemFree(pDecoder->pvDecoderState);
     242        pDecoder->pvDecoderState      = NULL;
     243        pDecoder->pfnDecoderStateFree = NULL;
     244    }
     245
     246    pDecoder->pvDecoderState = RTMemAllocZ(cbState);
     247    if (pDecoder->pvDecoderState)
     248    {
     249        pDecoder->pfnDecoderStateFree = pfnFree;
     250        *ppvState = pDecoder->pvDecoderState;
     251        return VINF_SUCCESS;
     252    }
     253
     254    return VERR_NO_MEMORY;
     255}
     256
     257
     258static DECLCALLBACK(void) rtTraceLogToolDecoderHlpStateDestroy(PRTTRACELOGDECODERHLP pHlp)
     259{
     260    PRTTRACELOGDECODER pDecoder = RT_FROM_MEMBER(pHlp, RTTRACELOGDECODER, Hlp);
     261
     262    if (pDecoder->pvDecoderState)
     263    {
     264        if (pDecoder->pfnDecoderStateFree)
     265            pDecoder->pfnDecoderStateFree(pHlp, pDecoder->pvDecoderState);
     266        RTMemFree(pDecoder->pvDecoderState);
     267        pDecoder->pvDecoderState      = NULL;
     268        pDecoder->pfnDecoderStateFree = NULL;
     269    }
     270}
     271
     272
     273static DECLCALLBACK(void*) rtTraceLogToolDecoderHlpStateGet(PRTTRACELOGDECODERHLP pHlp)
     274{
     275    PRTTRACELOGDECODER pDecoder = RT_FROM_MEMBER(pHlp, RTTRACELOGDECODER, Hlp);
     276
     277    return pDecoder->pvDecoderState;
     278}
     279
     280
     281static DECLCALLBACK(int) rtTraceLogToolRegisterDecoders(void *pvUser, PCRTTRACELOGDECODERREG paDecoders, uint32_t cDecoders)
     282{
     283    PRTTRACELOGDECODERSTATE pDecoderState = (PRTTRACELOGDECODERSTATE)pvUser;
    196284
    197285    if (pDecoderState->cDecodersAlloc - pDecoderState->cDecoders <= cDecoders)
    198286    {
    199         PRTTRACELOGDECODERDECODEEVENT paNew = (PRTTRACELOGDECODERDECODEEVENT)RTMemRealloc(pDecoderState->paDecodeEvts,
    200                                                                                           (pDecoderState->cDecodersAlloc + cDecoders) * sizeof(*paDecoders));
     287        PRTTRACELOGDECODER paNew = (PRTTRACELOGDECODER)RTMemRealloc(pDecoderState->paDecoders,
     288                                                                    (pDecoderState->cDecodersAlloc + cDecoders) * sizeof(*paNew));
    201289        if (!paNew)
    202290            return VERR_NO_MEMORY;
    203291
    204         pDecoderState->paDecodeEvts    = paNew;
     292        pDecoderState->paDecoders      = paNew;
    205293        pDecoderState->cDecodersAlloc += cDecoders;
    206294    }
    207295
    208     memcpy(&pDecoderState->paDecodeEvts[pDecoderState->cDecoders], paDecoders, cDecoders * sizeof(*paDecoders));
     296    for (uint32_t i = 0; i < cDecoders; i++)
     297    {
     298        PRTTRACELOGDECODER pDecoder = &pDecoderState->paDecoders[i];
     299
     300        pDecoder->pReg                       = &paDecoders[i];
     301        pDecoder->pvDecoderState             = NULL;
     302        pDecoder->pfnDecoderStateFree        = NULL;
     303        pDecoder->Hlp.pfnPrintf              = rtTraceLogToolDecoderHlpPrintf;
     304        pDecoder->Hlp.pfnErrorMsg            = rtTraceLogToolDecoderHlpErrorMsg;
     305        pDecoder->Hlp.pfnDecoderStateCreate  = rtTraceLogToolDecoderHlpStateCreate;
     306        pDecoder->Hlp.pfnDecoderStateDestroy = rtTraceLogToolDecoderHlpStateDestroy;
     307        pDecoder->Hlp.pfnDecoderStateGet     = rtTraceLogToolDecoderHlpStateGet;
     308    }
     309
    209310    pDecoderState->cDecoders += cDecoders;
    210311    return VINF_SUCCESS;
     
    230331    };
    231332
    232     RTEXITCODE          rcExit   = RTEXITCODE_SUCCESS;
    233     const char         *pszInput = NULL;
    234     const char         *pszSave  = NULL;
    235     RTTRACELOGDECODERS  Decoders; RT_ZERO(Decoders);
     333    RTEXITCODE              rcExit   = RTEXITCODE_SUCCESS;
     334    const char             *pszInput = NULL;
     335    const char             *pszSave  = NULL;
     336    RTTRACELOGDECODERSTATE  DecoderState; RT_ZERO(DecoderState);
    236337
    237338    RTGETOPTUNION   ValueUnion;
     
    283384                        RegCb.pfnRegisterDecoders = rtTraceLogToolRegisterDecoders;
    284385
    285                         rc = pfnLoad(&Decoders, &RegCb);
     386                        rc = pfnLoad(&DecoderState, &RegCb);
    286387                        if (RT_FAILURE(rc))
    287388                            return RTMsgErrorExit(RTEXITCODE_FAILURE, "Failed to register decoders %Rrc\n", rc);
     
    342443                             * If there is no decoder registered just dump the raw values.
    343444                             */
    344                             PCRTTRACELOGDECODERDECODEEVENT pDecodeEvt = NULL;
    345                             for (uint32_t i = 0; i < Decoders.cDecoders; i++)
    346                                 if (!strcmp(Decoders.paDecodeEvts[i].pszId, pEvtDesc->pszId))
     445                            PRTTRACELOGDECODER    pDecoder = NULL;
     446                            PCRTTRACELOGDECODEEVT pDecodeEvt  = NULL;
     447                            for (uint32_t i = 0; (i < DecoderState.cDecoders) && !pDecoder; i++)
     448                            {
     449                                PCRTTRACELOGDECODEEVT pTmp = DecoderState.paDecoders[i].pReg->paEvtIds;
     450                                while (pTmp->pszEvtId)
    347451                                {
    348                                     pDecodeEvt = &Decoders.paDecodeEvts[i];
    349                                     break;
     452                                    if (!strcmp(pTmp->pszEvtId, pEvtDesc->pszId))
     453                                    {
     454                                        pDecoder   = &DecoderState.paDecoders[i];
     455                                        pDecodeEvt = pTmp;
     456                                        break;
     457                                    }
     458                                    pTmp++;
    350459                                }
    351 
    352                             if (pDecodeEvt)
     460                            }
     461
     462                            if (pDecoder)
    353463                            {
     464                                Assert(pDecodeEvt);
     465
    354466                                /** @todo Dynamic value allocation (too lazy right now). */
    355467                                RTTRACELOGEVTVAL aVals[32];
     
    360472                                    || cVals != pEvtDesc->cEvtItems)
    361473                                {
    362                                     rc = pDecodeEvt->pfnDecode(hTraceLogEvt, pEvtDesc, &aVals[0], cVals);
     474                                    rc = pDecoder->pReg->pfnDecode(&pDecoder->Hlp, pDecodeEvt->idDecodeEvt, hTraceLogEvt,
     475                                                                   pEvtDesc, &aVals[0], cVals);
    363476                                    if (RT_FAILURE(rc))
    364477                                        RTMsgError("Failed to decode event with ID '%s' -> %Rrc\n", pEvtDesc->pszId, rc);
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