Re: [PATCH v2 5/6] sensord: Refactoring of file prog/sensord/sense.c

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Mon, 26 Oct 2009 21:57:43 +0100, Andre Prendel wrote:
> This patch does some refactoring of functions doKnownChip().
> 
> * doKnownChip() is a huge function with deep indentation
> levels. Splitting this funcion up into smaller ones makes code much
> more readable.
> 
> Changes in v2:
> 
> * Move breaking long lines in a separate patch.
> * Unite get_alarm() and get_beep() to get_flag() function.
> * Add error message if feature->format() fails.
> * Return value of get_features directly.
> * Fix missing initialization of ret in doKnownChip().
> * Fix permanent alarms.
> * Remove temporary variable feature in doKnownChip().
> * Fix some coding style issues.
> 
> NOTE: Jean, there's a comment in your review using sprintf instead of
> strcat would be more efficient. I don't know what exactly you mean.

I don't remember exactly what I meant either, and it might as well be
that I had no precise idea back then.

> Replacing the inner strcat by sprintf and using a temporary buffer
> like this?
> 
> char buf[64];
> 
> snprintf(buf, 64, ":%s", rrded ? rrded : "U");
> strcat(rrdbuf, buf);
> 
> I've marked the corresponding part with a FIXME comment.

No temporary buffer, that would make things even uglier and slower.

Probably what I had in mind was more along the line of:

	int len = strlen(rrdBuff);
	sprintf(rrdBuff + len, ":%s", rrded ? rrded : "U");

But it's really up to you. If we really cared about ultimate
performance, we would keep track of rrdBuff's length all the time
anyway.

Some more comments below:

> ---
> 
>  prog/sensord/sense.c |  182 ++++++++++++++++++++++++++++-----------------------
>  1 file changed, 102 insertions(+), 80 deletions(-)
> 
> Index: sensors/prog/sensord/sense.c
> ===================================================================
> --- sensors.orig/prog/sensord/sense.c	2009-10-26 21:33:38.000000000 +0100
> +++ sensors/prog/sensord/sense.c	2009-10-26 21:48:49.000000000 +0100
> @@ -47,7 +47,7 @@
>  {
>  	const char *adapter;
>  
> -	sensorLog(LOG_INFO, "Chip: %s", chipName (chip));
> +	sensorLog(LOG_INFO, "Chip: %s", chipName(chip));
>  	adapter = sensors_get_adapter_name(&chip->bus);
>  	if (adapter)
>  		sensorLog(LOG_INFO, "Adapter: %s", adapter);
> @@ -55,92 +55,111 @@
>  	return 0;
>  }
>  
> -static int doKnownChip(const sensors_chip_name *chip,
> -		       const ChipDescriptor *descriptor, int action)
> +static int get_flag(const sensors_chip_name *chip, int num)
>  {
> -	const FeatureDescriptor *features = descriptor->features;
> -	int index0, subindex;
> -	int ret = 0;
> -	double tmp;
> +	double val;
> +	int ret;
>  
> -	if (action == DO_READ)
> -		ret = idChip(chip);
> -	for (index0 = 0; (ret == 0) && features[index0].format; ++ index0) {
> -		const FeatureDescriptor *feature = features + index0;
> -		int alarm, beep;
> -		char *label = NULL;
> +	if (num == -1)
> +		return 0;
> +
> +	ret = sensors_get_value(chip, num, &val);
> +	if (ret) {
> +		sensorLog(LOG_ERR, "Error getting sensor data: %s/#%d: %s",
> +			  chip->prefix, num, sensors_strerror(ret));
> +		return -1;
> +	}
> +
> +	return (int) (val + 0.5);
> +}
> +
> +static int get_features(const sensors_chip_name *chip,
> +			const FeatureDescriptor *feature, int action,
> +			char *label, int alarm, int beep)
> +{
> +	int i, ret;
> +	double val[MAX_DATA];
>  
> -		if (!(label = sensors_get_label(chip, feature->feature))) {
> +	for (i = 0; feature->dataNumbers[i] >= 0; i++) {
> +		ret = sensors_get_value(chip, feature->dataNumbers[i],
> +					val + i);
> +		if (ret) {
>  			sensorLog(LOG_ERR,
> -				  "Error getting sensor label: %s/%s",
> -				  chip->prefix, feature->feature->name);
> -			ret = 22;
> -		} else {
> -			double values[MAX_DATA];
> +				  "Error getting sensor data: %s/#%d: %s",
> +				  chip->prefix, feature->dataNumbers[i],
> +				  sensors_strerror(ret));
> +			return -1;
> +		}
> +	}
>  
> -			alarm = 0;
> -			if (!ret && feature->alarmNumber != -1) {
> -				if ((ret = sensors_get_value(chip,
> -							     feature->alarmNumber,
> -							     &tmp))) {
> -					sensorLog(LOG_ERR,
> -						  "Error getting sensor data: %s/#%d: %s",
> -						  chip->prefix,
> -						  feature->alarmNumber,
> -						  sensors_strerror(ret));
> -					ret = 20;
> -				} else {
> -					alarm = (int) (tmp + 0.5);
> -				}
> -			}
> -			if ((action == DO_SCAN) && !alarm)
> -				continue;
> +	if (action == DO_RRD) {
> +		if (feature->rrd) {
> +			const char *rrded = feature->rrd(val);
>  
> -			beep = 0;
> -			if (!ret && feature->beepNumber != -1) {
> -				if ((ret = sensors_get_value(chip,
> -							     feature->beepNumber,
> -							     &tmp))) {
> -					sensorLog(LOG_ERR,
> -						  "Error getting sensor data: %s/#%d: %s",
> -						  chip->prefix,
> -						  feature->beepNumber,
> -						  sensors_strerror(ret));
> -					ret = 21;
> -				} else {
> -					beep = (int) (tmp + 0.5);
> -				}
> -			}
> +			/* FIXME: Jean's review comment:
> +			 * sprintf would me more efficient.
> +			 */
> +			strcat(strcat (rrdBuff, ":"), rrded ? rrded : "U");
> +		}
> +	} else {
> +		const char *formatted = feature->format(val, alarm, beep);
>  
> -			for (subindex = 0; !ret &&
> -				     (feature->dataNumbers[subindex] >= 0); ++ subindex) {
> -				if ((ret = sensors_get_value(chip, feature->dataNumbers[subindex], values + subindex))) {
> -					sensorLog(LOG_ERR, "Error getting sensor data: %s/#%d: %s", chip->prefix, feature->dataNumbers[subindex], sensors_strerror(ret));
> -					ret = 23;
> -				}
> -			}
> -			if (ret == 0) {
> -				if (action == DO_RRD) { // arse = "N:"
> -					if (feature->rrd) {
> -						const char *rrded = feature->rrd (values);
> -						strcat(strcat (rrdBuff, ":"),
> -						       rrded ? rrded : "U");
> -					}
> -				} else {
> -					const char *formatted = feature->format (values, alarm, beep);
> -					if (formatted) {
> -						if (action == DO_READ) {
> -							sensorLog(LOG_INFO, "  %s: %s", label, formatted);
> -						} else {
> -							sensorLog(LOG_ALERT, "Sensor alarm: Chip %s: %s: %s", chipName(chip), label, formatted);
> -						}
> -					}
> -				}
> -			}
> +		if (!formatted) {
> +			sensorLog(LOG_ERR, "Error formatting sensor data");
> +			return -1;
> +		}
> +
> +		if (action == DO_READ) {
> +			sensorLog(LOG_INFO, "  %s: %s", label, formatted);
> +		} else {
> +			sensorLog(LOG_ALERT, "Sensor alarm: Chip %s: %s: %s",
> +				  chipName(chip), label, formatted);
>  		}
> -		if (label)
> -			free(label);
>  	}
> +	return 0;
> +}
> +
> +static int do_features(const sensors_chip_name *chip,
> +		       const FeatureDescriptor *feature, int action)
> +{
> +	char *label;
> +	int alarm, beep;
> +
> +	label = sensors_get_label(chip, feature->feature);
> +	if (!label) {
> +		sensorLog(LOG_ERR, "Error getting sensor label: %s/%s",
> +			  chip->prefix, feature->feature->name);
> +		return -1;
> +	}
> +
> +	alarm = get_flag(chip, feature->alarmNumber);
> +	if (alarm == -1)
> +		return -1;
> +	else if (action == DO_SCAN && !alarm)
> +		return 0;
> +
> +	beep = get_flag(chip, feature->beepNumber);
> +	if (beep == -1)
> +		return -1;
> +
> +	return get_features(chip, feature, action, label, alarm, beep);
> +}
> +
> +static int doKnownChip(const sensors_chip_name *chip,
> +		       const ChipDescriptor *descriptor, int action)
> +{
> +	const FeatureDescriptor *features = descriptor->features;
> +	int i, ret;
> +
> +	if (action == DO_READ)
> +		ret = idChip(chip);

You don't do anything with ret? Apparently the original code had the
same issue, but it's probably the right time to fix it.

> +
> +	for (i = 0; features[i].format; i++) {
> +		ret = do_features(chip, features + i, action);
> +		if (ret == -1)
> +			break;
> +	}
> +
>  	return ret;

I'm surprised gcc doesn't complain about it, but ret may be
uninitialized at this point.

>  }
>  
> @@ -167,7 +186,7 @@
>  		ret = setChip(chip);
>  	} else {
>  		int index0, chipindex = -1;
> -		for (index0 = 0; knownChips[index0].features; ++ index0)
> +		for (index0 = 0; knownChips[index0].features; ++ index0) {

Remove space after ++ while you're here.

>  			/*
>  			 * Trick: we compare addresses here. We know it works
>  			 * because both pointers were returned by
> @@ -178,9 +197,12 @@
>  				chipindex = index0;
>  				break;
>  			}
> -		if (chipindex >= 0)
> +		}
> +
> +		if (chipindex >= 0) {
>  			ret = doKnownChip(chip, &knownChips[chipindex],
>  					  action);
> +		}
>  	}
>  	return ret;
>  }


-- 
Jean Delvare

_______________________________________________
lm-sensors mailing list
lm-sensors@xxxxxxxxxxxxxx
http://lists.lm-sensors.org/mailman/listinfo/lm-sensors

[Index of Archives]     [Linux Kernel]     [Linux Hardware Monitoring]     [Linux USB Devel]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [Yosemite Backpacking]

  Powered by Linux