IOReportCategories categories,
uint64_t channelID,
const char *channelName,
- IOReportUnits unit,
+ IOReportUnit unit,
int nSegments,
IOHistogramSegmentConfig *config)
{
return reporter;
}
}
+ OSSafeReleaseNULL(reporter);
+ OSSafeReleaseNULL(tmpChannelName);
return 0;
}
IOReportCategories categories,
uint64_t channelID,
const OSSymbol *channelName,
- IOReportUnits unit,
+ IOReportUnit unit,
int nSegments,
IOHistogramSegmentConfig *config)
{
if (cnt3 >= _nElements) {
IORLOG("ERROR: _bucketBounds init");
- return false;
+ result = false;
+ goto finish;
}
if (_histogramSegmentsConfig[cnt].scale_flag) {
result = true;
finish:
- if (result != true) {
-
- if (_histogramSegmentsConfig)
- IOFree(_histogramSegmentsConfig, configSize);
-
- if (_elements)
- IOFree(_elements, elementsSize);
-
- if (_enableCounts)
- IOFree(_enableCounts, eCountsSize);
-
- if (_bucketBounds)
- IOFree(_bucketBounds, boundsSize);
- }
-
return result;
}
IOReportLegendEntry*
IOHistogramReporter::handleCreateLegend(void)
{
- OSData *tmpConfigData;
- OSDictionary *tmpDict;
- IOReportLegendEntry *legendEntry = NULL;
+ IOReportLegendEntry *rval = NULL, *legendEntry = NULL;
+ OSData *tmpConfigData = NULL;
+ OSDictionary *tmpDict; // no refcount
legendEntry = super::handleCreateLegend();
+ if (!legendEntry) goto finish;
- if (legendEntry) {
-
- PREFL_MEMOP_PANIC(_segmentCount, IOHistogramSegmentConfig);
- tmpConfigData = OSData::withBytes(_histogramSegmentsConfig,
- (unsigned)_segmentCount *
- (unsigned)sizeof(IOHistogramSegmentConfig));
- if (!tmpConfigData) {
- legendEntry->release();
- goto finish;
- }
-
- tmpDict = OSDynamicCast(OSDictionary, legendEntry->getObject(kIOReportLegendInfoKey));
- if (!tmpDict) {
- legendEntry->release();
- goto finish;
- }
-
- tmpDict->setObject(kIOReportLegendConfigKey, tmpConfigData);
+ PREFL_MEMOP_PANIC(_segmentCount, IOHistogramSegmentConfig);
+ tmpConfigData = OSData::withBytes(_histogramSegmentsConfig,
+ (unsigned)_segmentCount *
+ sizeof(IOHistogramSegmentConfig));
+ if (!tmpConfigData) goto finish;
+
+ tmpDict = OSDynamicCast(OSDictionary,
+ legendEntry->getObject(kIOReportLegendInfoKey));
+ if (!tmpDict) goto finish;
+
+ tmpDict->setObject(kIOReportLegendConfigKey, tmpConfigData);
+
+ // success
+ rval = legendEntry;
+
+finish:
+ if (tmpConfigData) tmpConfigData->release();
+ if (!rval && legendEntry) {
+ legendEntry->release();
}
-
+
+ return rval;
+}
+
+IOReturn
+IOHistogramReporter::overrideBucketValues(unsigned int index,
+ uint64_t bucket_hits,
+ int64_t bucket_min,
+ int64_t bucket_max,
+ int64_t bucket_sum)
+{
+ IOReturn result;
+ IOHistogramReportValues bucket;
+ lockReporter();
+
+ if (index >= (unsigned int)_bucketCount) {
+ result = kIOReturnBadArgument;
+ goto finish;
+ }
+
+ bucket.bucket_hits = bucket_hits;
+ bucket.bucket_min = bucket_min;
+ bucket.bucket_max = bucket_max;
+ bucket.bucket_sum = bucket_sum;
+
+ result = setElementValues(index, (IOReportElementValues *)&bucket);
finish:
- return legendEntry;
+ unlockReporter();
+ return result;
}
int