浏览代码

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 <[email protected]>

SVN-Revision: 33766
Florian Fainelli 13 年之前
父节点
当前提交
19f91b26f5
共有 2 个文件被更改,包括 35 次插入25 次删除
  1. 1 1
      package/network/utils/rssileds/Makefile
  2. 34 24
      package/network/utils/rssileds/src/rssileds.c

+ 1 - 1
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

+ 34 - 24
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)
 {