[lm-sensors] [PATCH v3 4/8] sensord: Refactoring of applyToFeature()

Andre Prendel andre.prendel at gmx.de
Tue Nov 3 21:03:05 CET 2009


This patch cleans up function applyToFeature().

Function applyToFeature() is nearly unreadable. There are some deep
levels of indentation and cascades of loops makes code flow difficult to
read.

I split up this function into three smaller one. This reduces
indentation levels and makes code flow clearer.

Changes in v2:

* Rename generate_features() to _appyToFeatures().
* Get rid of needless variable num.
* Change prototype of function pointer FeatureFN. None of the
  functions returns with an error, so we needn't a return value.

Changes in v3:

* Drop change in rrdGetSensors()
* Move signature change of FeatureFN to a separate patch (5/8).

Note: The issue (in v1) with the overwritten return value will be
fixed by the next patch.
---
 prog/sensord/rrd.c |  104 +++++++++++++++++++++++++++++++----------------------
 1 file changed, 62 insertions(+), 42 deletions(-)

Index: sensors/prog/sensord/rrd.c
===================================================================
--- sensors.orig/prog/sensord/rrd.c	2009-11-03 20:02:45.000000000 +0100
+++ sensors/prog/sensord/rrd.c	2009-11-03 20:03:14.000000000 +0100
@@ -137,52 +137,72 @@
 	}
 }
 
-static int applyToFeatures(FeatureFN fn, void *data)
+static int _applyToFeatures(FeatureFN fn, void *data,
+			    const sensors_chip_name *chip,
+			    const ChipDescriptor *desc)
 {
-	const sensors_chip_name *chip;
-	int i, j, ret = 0, num = 0;
+	int i, ret;
+	const FeatureDescriptor *features = desc->features;
+	const FeatureDescriptor *feature;
+	const char *rawLabel;
+	char *label;
+
+	for (i = 0; i < MAX_RRD_SENSORS && features[i].format; ++i) {
+		feature = features + i;
+		rawLabel = feature->feature->name;
+
+		label = sensors_get_label(chip, feature->feature);
+		if (!label) {
+			sensorLog(LOG_ERR, "Error getting sensor label: %s/%s",
+				  chip->prefix, rawLabel);
+			return -1;
+		}
 
-	for (j = 0; (ret == 0) && (j < sensord_args.numChipNames); ++ j) {
-		i = 0;
-		while ((ret == 0) && ((chip = sensors_get_detected_chips(&sensord_args.chipNames[j], &i)) != NULL)) {
-			int index0, chipindex = -1;
-
-			/* Trick: we compare addresses here. We know it works
-			 * because both pointers were returned by
-			 * sensors_get_detected_chips(), so they refer to
-			 * libsensors internal structures, which do not move.
-			 */
-			for (index0 = 0; knownChips[index0].features; ++index0)
-				if (knownChips[index0].name == chip) {
-					chipindex = index0;
-					break;
-				}
-			if (chipindex >= 0) {
-				const ChipDescriptor *descriptor = &knownChips[chipindex];
-				const FeatureDescriptor *features = descriptor->features;
-
-				for (index0 = 0; (ret == 0) && (num < MAX_RRD_SENSORS) && features[index0].format; ++index0) {
-					const FeatureDescriptor *feature = features + index0;
-					const char *rawLabel = feature->feature->name;
-					char *label = NULL;
-
-					if (!(label = sensors_get_label(chip, feature->feature))) {
-						sensorLog(LOG_ERR, "Error getting sensor label: %s/%s", chip->prefix, rawLabel);
-						ret = -1;
-					} else  {
-						rrdCheckLabel(rawLabel, num);
-						ret = fn(data,
-							 rrdLabels[num],
-							 label, feature);
-						++ num;
-					}
-					if (label)
-						free(label);
-				}
-			}
+		rrdCheckLabel(rawLabel, i);
+		ret = fn(data, rrdLabels[i], label, feature);
+		free(label);
+	}
+	return 0;
+}
+
+static ChipDescriptor *lookup_known_chips(const sensors_chip_name *chip)
+{
+	int i;
+
+	/* Trick: we compare addresses here. We know it works
+	 * because both pointers were returned by
+	 * sensors_get_detected_chips(), so they refer to
+	 * libsensors internal structures, which do not move.
+	 */
+	for (i = 0; knownChips[i].features; i++) {
+		if (knownChips[i].name == chip) {
+			return &knownChips[i];
 		}
 	}
-	return ret;
+	return NULL;
+}
+
+static int applyToFeatures(FeatureFN fn, void *data)
+{
+	int i, i_detected, ret;
+	const sensors_chip_name *chip, *chip_arg;
+	ChipDescriptor *desc;
+
+	for (i = 0; i < sensord_args.numChipNames; i++) {
+		chip_arg = &sensord_args.chipNames[i];
+		i_detected = 0;
+		while ((chip = sensors_get_detected_chips(chip_arg,
+							  &i_detected))) {
+
+			desc = lookup_known_chips(chip);
+			if (!desc)
+				continue;
+			ret = _applyToFeatures(fn, data, chip, desc);
+			if (ret)
+				return ret;
+		}
+	}
+	return 0;
 }
 
 struct ds {




More information about the lm-sensors mailing list