TraceLoggerEventPayload* TraceLoggerThread::getOrCreateEventPayload(const char* text) { PointerHashMap::AddPtr p = pointerMap.lookupForAdd((const void*)text); if (p) { MOZ_ASSERT(p->value()->textId() < nextTextId); // Sanity check. return p->value(); } TraceLoggerEventPayload* payload = nullptr; startEvent(TraceLogger_Internal); auto guardInternalStopEvent = mozilla::MakeScopeExit([&] { stopEvent(TraceLogger_Internal); if (payload) payload->release(); }); char* str = js_strdup(text); if (!str) return nullptr; uint32_t textId = nextTextId; payload = js_new<TraceLoggerEventPayload>(textId, str); if (!payload) { js_free(str); return nullptr; } if (!textIdPayloads.putNew(textId, payload)) { js_delete(payload); payload = nullptr; return nullptr; } // Temporarily mark the payload as used. To make sure it doesn't get GC'ed. payload->use(); if (graph.get()) graph->addTextId(textId, str); nextTextId++; if (!pointerMap.add(p, text, payload)) return nullptr; return payload; }
TraceLoggerEventPayload* TraceLoggerThread::getOrCreateEventPayload(const char* text) { PointerHashMap::AddPtr p = pointerMap.lookupForAdd((const void*)text); if (p) { MOZ_ASSERT(p->value()->textId() < nextTextId); // Sanity check. return p->value(); } AutoTraceLog internal(this, TraceLogger_Internal); size_t len = strlen(text); char* str = js_pod_malloc<char>(len + 1); if (!str) return nullptr; DebugOnly<size_t> ret = JS_snprintf(str, len + 1, "%s", text); MOZ_ASSERT(ret == len); MOZ_ASSERT(strlen(str) == len); uint32_t textId = nextTextId; TraceLoggerEventPayload* payload = js_new<TraceLoggerEventPayload>(textId, str); if (!payload) { js_free(str); return nullptr; } if (!textIdPayloads.putNew(textId, payload)) { js_delete(payload); return nullptr; } if (graph.get()) graph->addTextId(textId, str); nextTextId++; if (!pointerMap.add(p, text, payload)) return nullptr; return payload; }
TraceLoggerEventPayload* TraceLoggerThread::getOrCreateEventPayload(const char* text) { PointerHashMap::AddPtr p = pointerMap.lookupForAdd((const void*)text); if (p) { MOZ_ASSERT(p->value()->textId() < nextTextId); // Sanity check. return p->value(); } AutoTraceLog internal(this, TraceLogger_Internal); char* str = js_strdup(text); if (!str) return nullptr; uint32_t textId = nextTextId; TraceLoggerEventPayload* payload = js_new<TraceLoggerEventPayload>(textId, str); if (!payload) { js_free(str); return nullptr; } if (!textIdPayloads.putNew(textId, payload)) { js_delete(payload); return nullptr; } if (graph.get()) graph->addTextId(textId, str); nextTextId++; if (!pointerMap.add(p, text, payload)) return nullptr; return payload; }
TraceLoggerEventPayload* TraceLoggerThread::getOrCreateEventPayload(TraceLoggerTextId type, const char* filename, size_t lineno, size_t colno, const void* ptr) { MOZ_ASSERT(type == TraceLogger_Scripts || type == TraceLogger_AnnotateScripts || type == TraceLogger_InlinedScripts); if (!filename) filename = "<unknown>"; // Only log scripts when enabled otherwise return the global Scripts textId, // which will get filtered out. MOZ_ASSERT(traceLoggerState); if (!traceLoggerState->isTextIdEnabled(type)) return getOrCreateEventPayload(type); PointerHashMap::AddPtr p; if (ptr) { p = pointerMap.lookupForAdd(ptr); if (p) { MOZ_ASSERT(p->value()->textId() < nextTextId); // Sanity check. return p->value(); } } AutoTraceLog internal(this, TraceLogger_Internal); // Compute the length of the string to create. size_t lenFilename = strlen(filename); size_t lenLineno = 1; for (size_t i = lineno; i /= 10; lenLineno++); size_t lenColno = 1; for (size_t i = colno; i /= 10; lenColno++); size_t len = 7 + lenFilename + 1 + lenLineno + 1 + lenColno; char* str = js_pod_malloc<char>(len + 1); if (!str) return nullptr; DebugOnly<size_t> ret = snprintf(str, len + 1, "script %s:%" PRIuSIZE ":%" PRIuSIZE, filename, lineno, colno); MOZ_ASSERT(ret == len); MOZ_ASSERT(strlen(str) == len); uint32_t textId = nextTextId; TraceLoggerEventPayload* payload = js_new<TraceLoggerEventPayload>(textId, str); if (!payload) { js_free(str); return nullptr; } if (!textIdPayloads.putNew(textId, payload)) { js_delete(payload); return nullptr; } if (graph.get()) graph->addTextId(textId, str); nextTextId++; if (ptr) { if (!pointerMap.add(p, ptr, payload)) return nullptr; } return payload; }