diff options
author | Florian Fainelli <florian@openwrt.org> | 2012-10-14 16:22:04 +0000 |
---|---|---|
committer | Florian Fainelli <florian@openwrt.org> | 2012-10-14 16:22:04 +0000 |
commit | c732985266cab6e08fc98bce195669ba59de34cb (patch) | |
tree | cc9289b116fcf017e223a62acbd40b1f97221c8e /package | |
parent | 8aaaec88657ec5908605b4dc121f3aaa42a3c7a3 (diff) | |
download | master-187ad058-c732985266cab6e08fc98bce195669ba59de34cb.tar.gz master-187ad058-c732985266cab6e08fc98bce195669ba59de34cb.tar.bz2 master-187ad058-c732985266cab6e08fc98bce195669ba59de34cb.zip |
[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')
-rw-r--r-- | package/network/utils/rssileds/Makefile | 2 | ||||
-rw-r--r-- | package/network/utils/rssileds/src/rssileds.c | 58 |
2 files changed, 35 insertions, 25 deletions
diff --git a/package/network/utils/rssileds/Makefile b/package/network/utils/rssileds/Makefile index 8e292dffe0..b572eacea5 100644 --- a/package/network/utils/rssileds/Makefile +++ b/package/network/utils/rssileds/Makefile @@ -8,7 +8,7 @@ include $(TOPDIR)/rules.mk PKG_NAME:=rssileds -PKG_VERSION:=0.1 +PKG_VERSION:=0.2 PKG_RELEASE:=1 include $(INCLUDE_DIR)/package.mk diff --git a/package/network/utils/rssileds/src/rssileds.c b/package/network/utils/rssileds/src/rssileds.c index 2f25c846c9..60d30f13b7 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) { |