* [lm-sensors] [PATCH 4/5] sensord: Refactoring of applyToFeature()
@ 2009-06-15 7:49 Andre Prendel
0 siblings, 0 replies; only message in thread
From: Andre Prendel @ 2009-06-15 7:49 UTC (permalink / raw)
To: lm-sensors
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.
Note:
This is just the first step. I'm not happy with the mechanism. IMHO
this generic way (function pointer) is not the best one. Hiding the
compiler warnings (void (label)) in rrdGetSensors_DS() and
rrdCGI_DEF() confirms my opinion.
I think a more conrete way is a better approach. So this should be
just the starting point for further optimizations.
---
rrd.c | 107 ++++++++++++++++++++++++++++++++++++++++--------------------------
1 file changed, 65 insertions(+), 42 deletions(-)
Index: sensors/prog/sensord/rrd.c
=================================--- sensors.orig/prog/sensord/rrd.c 2009-06-14 14:57:03.000000000 +0200
+++ sensors/prog/sensord/rrd.c 2009-06-14 15:30:16.000000000 +0200
@@ -137,54 +137,77 @@
}
}
-static int applyToFeatures(FeatureFN fn, void *data)
+static int generate_features(FeatureFN fn, void *data,
+ const sensors_chip_name *chip,
+ const ChipDescriptor *desc)
{
- const sensors_chip_name *chip;
- int i, j, ret = 0, num = 0;
-
- 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);
- }
- }
+ int i, ret = 0, num = 0;
+ const FeatureDescriptor *features = desc->features;
+ const FeatureDescriptor *feature;
+ const char *rawLabel;
+ char *label;
+
+ for (i = 0; num < 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);
+ ret = -1;
+ break;
+ } else {
+ rrdCheckLabel(rawLabel, num);
+ ret = fn(data, rrdLabels[num], label, feature);
+ ++num;
}
+ free(label);
}
return ret;
}
+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 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 = generate_features(fn, data, chip, desc);
+ if (ret)
+ return ret;
+ }
+ }
+ return 0;
+}
+
struct ds {
int num;
const char **argv;
_______________________________________________
lm-sensors mailing list
lm-sensors@lm-sensors.org
http://lists.lm-sensors.org/mailman/listinfo/lm-sensors
^ permalink raw reply [flat|nested] only message in thread
only message in thread, other threads:[~2009-06-15 7:49 UTC | newest]
Thread overview: (only message) (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2009-06-15 7:49 [lm-sensors] [PATCH 4/5] sensord: Refactoring of applyToFeature() Andre Prendel
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.