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 Shen<yong.shen@linaro.org>

Signed-off-by: Yong Shen<yong.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.