On Wed, Apr 6, 2011 at 11:36 AM, Yong Shen yong.shen@linaro.org wrote:
On Tue, Apr 5, 2011 at 8:49 PM, Daniel Lezcano daniel.lezcano@free.fr wrote:
On 04/05/2011 10:28 AM, yong.shen@linaro.org wrote:
From: Yong Shenyong.shen@linaro.org
Signed-off-by: Yong Shenyong.shen@linaro.org
clocks.c | 54 +++++++++++++++++++++++++++++++++++++++++++++++++++++- powerdebug.c | 3 +++ powerdebug.h | 3 +++ 3 files changed, 59 insertions(+), 1 deletions(-)
diff --git a/clocks.c b/clocks.c index 47881c5..a4c54b0 100644 --- a/clocks.c +++ b/clocks.c @@ -16,12 +16,18 @@ #include<stdio.h> #include<mntent.h> #include<sys/stat.h> +#include<sys/inotify.h> +#include<poll.h>
#include "powerdebug.h" #include "clocks.h"
#define MAX_LINES 120
+int inotify_fd; +int inotify_wd; +static struct pollfd fds;
static char clk_dir_path[PATH_MAX]; static int bold[MAX_LINES]; static char clock_lines[MAX_LINES][128]; @@ -58,11 +64,56 @@ int clock_init(void) if (locate_debugfs(clk_dir_path)) return -1;
- inotify_fd = inotify_init();
- if ( inotify_fd< 0 ) {
- fprintf(stderr, "inotify_init error.\n" );
- return -1;
- }
- inotify_wd = inotify_add_watch(inotify_fd, clk_dir_path,
- IN_ALL_EVENTS );
- fds.fd = inotify_fd;
- fds.events = POLLIN;
sprintf(clk_dir_path, "%s/clock", clk_dir_path);
return access(clk_dir_path, F_OK); }
+#define EVENT_SIZE ( sizeof (struct inotify_event) ) +#define BUF_LEN ( 10 * ( EVENT_SIZE + 16 ) )
+int debugfs_changed(void) +{
- int length, i = 0;
- char buffer[BUF_LEN];
- if (inotify_fd<= 0) {
- return 1;
- }
- poll(&fds, 1, 1);
- if (fds.revents != POLLIN) {
- return 0;
- }
- length = read(inotify_fd, buffer, BUF_LEN);
- if (length< 0)
- return 0;
- while (i< length) {
- struct inotify_event *event = (struct inotify_event
*)&buffer[i];
- if (event->mask& IN_ALL_EVENTS)
- return 1;
- i += EVENT_SIZE + event->len;
- }
- return 0;
+}
static int file_read_from_format(char *file, int *value, const char *format) { FILE *f; @@ -379,7 +430,8 @@ static int clk_number_recursive(char *clk_path)
static int get_clk_number(char *clk_path) {
- if ((max_clk_num != 0)) /* no nodes have been added */
- /* no nodes have been added */
- if ((max_clk_num != 0)&& (!debugfs_changed()))
return max_clk_num;
Thats wrong, you have to add the inotify_wd to the mainloop code.
Index: dlezcano/work/src/powerdebug/powerdebug.c
--- dlezcano.orig/work/src/powerdebug/powerdebug.c 2011-04-05 14:38:40.437379003 +0200 +++ dlezcano/work/src/powerdebug/powerdebug.c 2011-04-05 14:42:48.397379003 +0200 @@ -291,16 +291,21 @@ int mainloop(struct powerdebug_options *
FD_ZERO(&readfds); FD_SET(0, &readfds);
- FD_SET(inotify_fd, &readfds);
tval.tv_sec = options->ticktime; tval.tv_usec = (options->ticktime - tval.tv_sec) * 1000000;
- key = select(1, &readfds, NULL, NULL, &tval);
- key = select(inotify_fd + 1, &readfds, NULL, NULL, &tval);
if (!key) continue;
- if (keystroke_callback(&enter_hit, &findparent_ncurses,
- clkname_str, &refreshwin, options))
- break;
- if (FD_ISSET(0, &readfds))
- if (keystroke_callback(&enter_hit, &findparent_ncurses,
- clkname_str, &refreshwin, options))
- break;
- if (FD_ISSET(inotify_fd, &readfds))
- thecallback();
}
else { max_clk_num = 0; diff --git a/powerdebug.c b/powerdebug.c index a26d16f..621052f 100644 --- a/powerdebug.c +++ b/powerdebug.c @@ -14,6 +14,7 @@
*******************************************************************************/
#include<getopt.h> +#include<sys/inotify.h> #include<stdbool.h> #include "regulator.h" #include "display.h" @@ -390,6 +391,8 @@ int main(int argc, char **argv) powerdebug_display(options, regulators_info, numregulators);
release_all_clk_info_mem();
- inotify_rm_watch(inotify_fd, inotify_wd);
- close(inotify_fd);
return ret< 0; } diff --git a/powerdebug.h b/powerdebug.h index f97e3b9..4071eaa 100644 --- a/powerdebug.h +++ b/powerdebug.h @@ -54,3 +54,6 @@ extern void create_selectedwindow(int selectedwindow); struct regulator_info; extern void show_regulator_info(struct regulator_info *reg_info, int nr_reg, int verbose); +extern int inotify_fd; +extern int inotify_wd; +extern int need_refresh(void);
I would suggest you create a clock_info structure where you store the inotify_fd and inotify_wd and you use a clock_fini function.
struct clock_info *clock_info;
...
clock_info = clock_init();
...
clock_fini(clock_info);
...
That will prevent to add more global variables and extern definitions.
I agree to some degree. The situation is that we are trying to finish some certain working items in this cycle, so time is tight. About those polishing tasks, I suggest we could do it after the major functions have been implemented, like what you did, a serial patches dedicated for such purpose.
Yong,
Let's do it the right way, now that we have pretty looking code :)
Regards, Amit