diff options
| author | florian <florian@3c298f89-4303-0410-b956-a3cf2f4a3e73> | 2012-10-14 16:22:04 +0000 | 
|---|---|---|
| committer | florian <florian@3c298f89-4303-0410-b956-a3cf2f4a3e73> | 2012-10-14 16:22:04 +0000 | 
| commit | c663cbf571aa30e3de7ff7199e03d991f3e8bdbf (patch) | |
| tree | cc9289b116fcf017e223a62acbd40b1f97221c8e /package/network/utils/rssileds/src | |
| parent | 8178ce6c3b3efa008e2c43dbf6b4c59a5ac4bdad (diff) | |
[package] rssileds: improve performance
LEDs brightness is now only updated if the value actually changed, thus reducing
the number of fwrite syscalls significantly.
Signed-off-by: Daniel Golle <dgolle@allnet.de>
git-svn-id: svn://svn.openwrt.org/openwrt/trunk@33766 3c298f89-4303-0410-b956-a3cf2f4a3e73
Diffstat (limited to 'package/network/utils/rssileds/src')
| -rw-r--r-- | package/network/utils/rssileds/src/rssileds.c | 58 | 
1 files changed, 34 insertions, 24 deletions
diff --git a/package/network/utils/rssileds/src/rssileds.c b/package/network/utils/rssileds/src/rssileds.c index 2f25c846c..60d30f13b 100644 --- a/package/network/utils/rssileds/src/rssileds.c +++ b/package/network/utils/rssileds/src/rssileds.c @@ -70,6 +70,32 @@ void log_rules(rule_t *rules)  	}  } +int set_led(struct led *led, unsigned char value) +{ +	char buf[8]; + +	if ( ! led ) +		return -1; + +	if ( ! led->controlfd ) +		return -1; + +	if ( led->state == value ) +		return 0; + +	snprintf(buf, 8, "%d", value); + +	rewind(led->controlfd); + +	if ( ! fwrite(buf, sizeof(char), strlen(buf), led->controlfd) ) +		return -2; + +	fflush(led->controlfd); +	led->state=value; + +	return 0; +} +  int init_led(struct led **led, char *ledname)  {  	struct led *newled; @@ -102,8 +128,15 @@ int init_led(struct led **led, char *ledname)  	newled->sysfspath = bp;  	newled->controlfd = bfp; -	 +  	*led = newled; + +	if ( set_led(newled, 255) ) +		goto cleanup_fp; + +	if ( set_led(newled, 0) ) +		goto cleanup_fp; +  	return 0;  cleanup_fp: @@ -124,29 +157,6 @@ void close_led(struct led **led)  	(*led)=NULL;  } -int set_led(struct led *led, unsigned char value) -{ -	char buf[8]; - -	if ( ! led ) -		return -1; - -	if ( ! led->controlfd ) -		return -1; - -	snprintf(buf, 8, "%d", value); - -	rewind(led->controlfd); - -	if ( ! fwrite(buf, sizeof(char), strlen(buf), led->controlfd) ) -		return -2; - -	fflush(led->controlfd); -	led->state=value; - -	return 0; -} -  int quality(const struct iwinfo_ops *iw, const char *ifname)  {  | 
