NS_IMETHODIMP TelemetryImpl::HistogramFrom(const nsACString &name, const nsACString &existing_name, JSContext *cx, jsval *ret) { Histogram *existing; nsresult rv = GetHistogramByName(existing_name, &existing); if (NS_FAILED(rv)) return rv; uint32_t histogramType; bool success = TelemetryHistogramType(existing, &histogramType); if (!success) return NS_ERROR_INVALID_ARG; Histogram *clone; rv = HistogramGet(PromiseFlatCString(name).get(), existing->declared_min(), existing->declared_max(), existing->bucket_count(), histogramType, &clone); if (NS_FAILED(rv)) return rv; Histogram::SampleSet ss; existing->SnapshotSample(&ss); clone->AddSampleSet(ss); return WrapAndReturnHistogram(clone, cx, ret); }
NS_IMETHODIMP TelemetryImpl::NewHistogram(const nsACString &name, uint32_t min, uint32_t max, uint32_t bucketCount, uint32_t histogramType, JSContext *cx, jsval *ret) { Histogram *h; nsresult rv = HistogramGet(PromiseFlatCString(name).get(), min, max, bucketCount, histogramType, &h); if (NS_FAILED(rv)) return rv; h->ClearFlags(Histogram::kUmaTargetedHistogramFlag); return WrapAndReturnHistogram(h, cx, ret); }
bool TelemetryImpl::CreateHistogramForAddon(const nsACString &name, AddonHistogramInfo &info) { Histogram *h; nsresult rv = HistogramGet(PromiseFlatCString(name).get(), info.min, info.max, info.bucketCount, info.histogramType, &h); if (NS_FAILED(rv)) { return false; } // Don't let this histogram be reported via the normal means // (e.g. Telemetry.registeredHistograms); we'll make it available in // other ways. h->ClearFlags(Histogram::kUmaTargetedHistogramFlag); info.h = h; return true; }
// O(1) histogram lookup by numeric id nsresult GetHistogramByEnumId(Telemetry::ID id, Histogram **ret) { static Histogram* knownHistograms[Telemetry::HistogramCount] = {0}; Histogram *h = knownHistograms[id]; if (h) { *ret = h; return NS_OK; } const TelemetryHistogram &p = gHistograms[id]; nsresult rv = HistogramGet(p.id, p.min, p.max, p.bucketCount, p.histogramType, &h); if (NS_FAILED(rv)) return rv; *ret = knownHistograms[id] = h; return NS_OK; }
NS_IMETHODIMP TelemetryImpl::GetAddonHistogram(const nsACString &id, const nsACString &name, JSContext *cx, jsval *ret) { AddonEntryType *addonEntry = mAddonMap.GetEntry(id); // The given id has not been registered. if (!addonEntry) { return NS_ERROR_INVALID_ARG; } AddonHistogramMapType *histogramMap = addonEntry->mData; AddonHistogramEntryType *histogramEntry = histogramMap->GetEntry(name); // The given histogram name has not been registered. if (!histogramEntry) { return NS_ERROR_INVALID_ARG; } AddonHistogramInfo &info = histogramEntry->mData; Histogram *h; if (info.h) { h = info.h; } else { nsCAutoString actualName; AddonHistogramName(id, name, actualName); nsresult rv = HistogramGet(PromiseFlatCString(actualName).get(), info.min, info.max, info.bucketCount, info.histogramType, &h); if (NS_FAILED(rv)) { return rv; } // Don't let this histogram be reported via the normal means // (e.g. Telemetry.registeredHistograms); we'll make it available in // other ways. h->ClearFlags(Histogram::kUmaTargetedHistogramFlag); info.h = h; } return WrapAndReturnHistogram(h, cx, ret); }