Loading...
--- xnu/xnu-3248.50.21/iokit/Kernel/IOHistogramReporter.cpp
+++ xnu/xnu-4570.71.2/iokit/Kernel/IOHistogramReporter.cpp
@@ -43,7 +43,7 @@
IOReportCategories categories,
uint64_t channelID,
const char *channelName,
- IOReportUnits unit,
+ IOReportUnit unit,
int nSegments,
IOHistogramSegmentConfig *config)
{
@@ -62,6 +62,8 @@
return reporter;
}
}
+ OSSafeReleaseNULL(reporter);
+ OSSafeReleaseNULL(tmpChannelName);
return 0;
}
@@ -72,7 +74,7 @@
IOReportCategories categories,
uint64_t channelID,
const OSSymbol *channelName,
- IOReportUnits unit,
+ IOReportUnit unit,
int nSegments,
IOHistogramSegmentConfig *config)
{
@@ -208,7 +210,8 @@
if (cnt3 >= _nElements) {
IORLOG("ERROR: _bucketBounds init");
- return false;
+ result = false;
+ goto finish;
}
if (_histogramSegmentsConfig[cnt].scale_flag) {
@@ -245,21 +248,6 @@
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;
}
@@ -284,34 +272,62 @@
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) {
-
- 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);
- }
-
+ if (!legendEntry) goto finish;
+
+ 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:
- return legendEntry;
+ 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:
+ unlockReporter();
+ return result;
}
int