device/network and tuning/ethernet had the same "/sys/class/net/"
directory traverse code with the only difference in post-actions (filling
all_tunables or nics/all_devices).
- Remove duplicate code and introduce function callback to perform mentioned
post-actions:
. netdev_callback -- (default) to fill nics and all_devices
. ethtunable_callback -- to fill all_tunables.
Signature of create_all_nics has been changed accordingly to accept
`typedef void (*callback)(const char*);' and "/sys/class/net/" traverse moved
to read_all_nics() (from original code removed unused `ifstream file', char
filename[4096] replaced with std::string later in netdev_callback).
- network::network(char*, char*) has been changed to accept const char*
parameters (T* to const T* cast is trivial), stack usage optimized by
replacing `char filename[4096]' with std::string.
Signed-off-by: Sergey Senozhatsky <[email protected]>
---
diff --git a/devices/device.h b/devices/device.h
index cc444f1..a95e281 100644
--- a/devices/device.h
+++ b/devices/device.h
@@ -77,7 +77,7 @@ extern void report_devices(void);
extern void html_report_devices(void);
-
extern void create_all_devices(void);
-#endif
\ No newline at end of file
+#endif
+
diff --git a/devices/network.cpp b/devices/network.cpp
index e350eec..181ae15 100644
--- a/devices/network.cpp
+++ b/devices/network.cpp
@@ -107,10 +107,10 @@ static void do_proc_net_dev(void)
}
-network::network(char *_name, char *path): device()
+network::network(const char *_name, const char *path): device()
{
char line[4096];
- char filename[4096];
+ std::string filename(path);
char devname[128];
start_up = 0;
end_up = 0;
@@ -155,9 +155,9 @@ network::network(char *_name, char *path): device()
rindex_pkts = get_result_index(devname);
memset(line, 0, 4096);
- sprintf(filename, "%s/device/driver", path);
- if (readlink(filename, line, 4096) > 0) {
- sprintf(humanname, _("Network interface: %s (%s)"),_name,
basename(line));
+ filename.append("/device/driver");
+ if (readlink(filename.c_str(), line, 4096) > 0) {
+ sprintf(humanname, _("Network interface: %s (%s)"), _name,
basename(line));
};
}
@@ -327,17 +327,15 @@ const char * network::device_name(void)
return name;
}
-void create_all_nics(void)
+
+void read_all_nics(callback fn)
{
struct dirent *entry;
DIR *dir;
- char filename[4096];
dir = opendir("/sys/class/net/");
if (!dir)
return;
while (1) {
- class network *bl;
- ifstream file;
entry = readdir(dir);
if (!entry)
break;
@@ -346,16 +344,33 @@ void create_all_nics(void)
if (strcmp(entry->d_name, "lo")==0)
continue;
- sprintf(filename, "/sys/class/net/%s", entry->d_name);
- bl = new class network(entry->d_name, filename);
- all_devices.push_back(bl);
- nics[entry->d_name] = bl;
+ fn(entry->d_name);
}
+
closedir(dir);
+}
+
+void netdev_callback(const char *d_name)
+{
+ std::string f_name("/sys/class/net/");
+ f_name.append(d_name);
+
+ network *bl = new(std::nothrow) class network(d_name, f_name.c_str());
+ if (bl) {
+ all_devices.push_back(bl);
+ nics[d_name] = bl;
+ }
}
+void create_all_nics(callback fn)
+{
+ if (!fn)
+ fn = &netdev_callback;
+ read_all_nics(fn);
+}
+
double network::power_usage(struct result_bundle *result, struct
parameter_bundle *bundle)
{
@@ -369,8 +384,6 @@ double network::power_usage(struct result_bundle *result,
struct parameter_bundl
power += util * factor;
-
-
if (valid_100 == -1) {
valid_100 = utilization_power_valid(rindex_link_100);
valid_1000 = utilization_power_valid(rindex_link_1000);
@@ -411,4 +424,5 @@ double network::power_usage(struct result_bundle *result,
struct parameter_bundl
power += util * factor / 100;
return power;
-}
\ No newline at end of file
+}
+
diff --git a/devices/network.h b/devices/network.h
index 50bf61e..76e17ac 100644
--- a/devices/network.h
+++ b/devices/network.h
@@ -62,7 +62,7 @@ public:
uint64_t pkts;
double duration;
- network(char *_name, char *path);
+ network(const char *_name, const char *path);
virtual void start_measurement(void);
virtual void end_measurement(void);
@@ -79,7 +79,7 @@ public:
virtual int grouping_prio(void) { return 10; };
};
-extern void create_all_nics(void);
+extern void create_all_nics(callback fn = NULL);
+#endif
-#endif
\ No newline at end of file
diff --git a/lib.h b/lib.h
index f6f924f..3d195d4 100644
--- a/lib.h
+++ b/lib.h
@@ -71,6 +71,8 @@ extern char *fmt_prefix(double n, char *buf);
extern char *pretty_print(const char *str, char *buf, int len);
extern int equals(double a, double b);
+typedef void (*callback)(const char*);
extern int utf_ok;
+
#endif
diff --git a/tuning/ethernet.cpp b/tuning/ethernet.cpp
index f13f720..4666ac1 100644
--- a/tuning/ethernet.cpp
+++ b/tuning/ethernet.cpp
@@ -47,6 +47,8 @@
#include "../lib.h"
#include "ethernet.h"
+extern void create_all_nics(callback fn);
+
ethernet_tunable::ethernet_tunable(const char *iface) : tunable("", 0.3,
_("Good"), _("Bad"), _("Unknown"))
{
memset(interf, 0, sizeof(interf));
@@ -127,29 +129,15 @@ void ethernet_tunable::toggle(void)
}
-
+void ethtunable_callback(const char *d_name)
+{
+ class ethernet_tunable *eth = new(std::nothrow) class
ethernet_tunable(d_name);
+ if (eth)
+ all_tunables.push_back(eth);
+}
void add_ethernet_tunable(void)
{
- class ethernet_tunable *eth;
- struct dirent *entry;
- DIR *dir;
- dir = opendir("/sys/class/net/");
- if (!dir)
- return;
- while ((entry = readdir(dir))) {
- if (!entry)
- break;
- if (entry->d_name[0] == '.')
- continue;
- if (strcmp(entry->d_name, "lo") == 0)
- continue;
-
- eth = new(std::nothrow) class ethernet_tunable(entry->d_name);
- if (eth)
- all_tunables.push_back(eth);
- }
-
- closedir(dir);
+ create_all_nics(ðtunable_callback);
}
diff --git a/tuning/ethernet.h b/tuning/ethernet.h
index 8050aca..1c57f21 100644
--- a/tuning/ethernet.h
+++ b/tuning/ethernet.h
@@ -44,5 +44,5 @@ public:
extern void add_ethernet_tunable(void);
-
#endif
+
_______________________________________________
Discuss mailing list
[email protected]
http://lists.lesswatts.org/listinfo/discuss