Changeset 104920 in vbox for trunk/src/VBox/Runtime
- Timestamp:
- Jun 14, 2024 12:02:03 PM (11 months ago)
- svn:sync-xref-src-repo-rev:
- 163522
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Runtime/tools/RTTraceLogTool.cpp
r104892 r104920 55 55 56 56 57 typedef 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; 68 typedef RTTRACELOGDECODER *PRTTRACELOGDECODER; 69 typedef const RTTRACELOGDECODER *PCRTTRACELOGDECODER; 70 71 57 72 /** 58 73 * Loaded tracelog decoders. 59 74 */ 60 typedef struct RTTRACELOGDECODERS 75 typedef struct RTTRACELOGDECODERSTATE 61 76 { 62 77 /** Pointer to the array of registered decoders. */ 63 PRTTRACELOGDECODER DECODEEVENT paDecodeEvts;78 PRTTRACELOGDECODER paDecoders; 64 79 /** Number of entries in the decoder array. */ 65 80 uint32_t cDecoders; 66 81 /** Allocation size of the decoder array. */ 67 82 uint32_t cDecodersAlloc; 68 } RTTRACELOGDECODERS ;69 typedef RTTRACELOGDECODERS *PRTTRACELOGDECODERS;83 } RTTRACELOGDECODERSTATE; 84 typedef RTTRACELOGDECODERSTATE *PRTTRACELOGDECODERSTATE; 70 85 71 86 … … 191 206 192 207 193 static DECLCALLBACK(int) rtTraceLogToolRegisterDecoders(void *pvUser, PCRTTRACELOGDECODERDECODEEVENT paDecoders, uint32_t cDecoders) 194 { 195 PRTTRACELOGDECODERS pDecoderState = (PRTTRACELOGDECODERS)pvUser; 208 static 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 220 static 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 232 static 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 258 static 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 273 static DECLCALLBACK(void*) rtTraceLogToolDecoderHlpStateGet(PRTTRACELOGDECODERHLP pHlp) 274 { 275 PRTTRACELOGDECODER pDecoder = RT_FROM_MEMBER(pHlp, RTTRACELOGDECODER, Hlp); 276 277 return pDecoder->pvDecoderState; 278 } 279 280 281 static DECLCALLBACK(int) rtTraceLogToolRegisterDecoders(void *pvUser, PCRTTRACELOGDECODERREG paDecoders, uint32_t cDecoders) 282 { 283 PRTTRACELOGDECODERSTATE pDecoderState = (PRTTRACELOGDECODERSTATE)pvUser; 196 284 197 285 if (pDecoderState->cDecodersAlloc - pDecoderState->cDecoders <= cDecoders) 198 286 { 199 PRTTRACELOGDECODER DECODEEVENT paNew = (PRTTRACELOGDECODERDECODEEVENT)RTMemRealloc(pDecoderState->paDecodeEvts,200 (pDecoderState->cDecodersAlloc + cDecoders) * sizeof(*paDecoders));287 PRTTRACELOGDECODER paNew = (PRTTRACELOGDECODER)RTMemRealloc(pDecoderState->paDecoders, 288 (pDecoderState->cDecodersAlloc + cDecoders) * sizeof(*paNew)); 201 289 if (!paNew) 202 290 return VERR_NO_MEMORY; 203 291 204 pDecoderState->paDecode Evts= paNew;292 pDecoderState->paDecoders = paNew; 205 293 pDecoderState->cDecodersAlloc += cDecoders; 206 294 } 207 295 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 209 310 pDecoderState->cDecoders += cDecoders; 210 311 return VINF_SUCCESS; … … 230 331 }; 231 332 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); 236 337 237 338 RTGETOPTUNION ValueUnion; … … 283 384 RegCb.pfnRegisterDecoders = rtTraceLogToolRegisterDecoders; 284 385 285 rc = pfnLoad(&Decoder s, &RegCb);386 rc = pfnLoad(&DecoderState, &RegCb); 286 387 if (RT_FAILURE(rc)) 287 388 return RTMsgErrorExit(RTEXITCODE_FAILURE, "Failed to register decoders %Rrc\n", rc); … … 342 443 * If there is no decoder registered just dump the raw values. 343 444 */ 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) 347 451 { 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++; 350 459 } 351 352 if (pDecodeEvt) 460 } 461 462 if (pDecoder) 353 463 { 464 Assert(pDecodeEvt); 465 354 466 /** @todo Dynamic value allocation (too lazy right now). */ 355 467 RTTRACELOGEVTVAL aVals[32]; … … 360 472 || cVals != pEvtDesc->cEvtItems) 361 473 { 362 rc = pDecodeEvt->pfnDecode(hTraceLogEvt, pEvtDesc, &aVals[0], cVals); 474 rc = pDecoder->pReg->pfnDecode(&pDecoder->Hlp, pDecodeEvt->idDecodeEvt, hTraceLogEvt, 475 pEvtDesc, &aVals[0], cVals); 363 476 if (RT_FAILURE(rc)) 364 477 RTMsgError("Failed to decode event with ID '%s' -> %Rrc\n", pEvtDesc->pszId, rc);
Note:
See TracChangeset
for help on using the changeset viewer.