On Wed, Apr 6, 2011 at 11:36 AM, Yong Shen <yong.s...@linaro.org> wrote:
>
>
> On Tue, Apr 5, 2011 at 8:49 PM, Daniel Lezcano <daniel.lezc...@free.fr>
> wrote:
>>
>> On 04/05/2011 10:28 AM, yong.s...@linaro.org wrote:
>>>
>>> From: Yong Shen<yong.s...@linaro.org>
>>>
>>> Signed-off-by: Yong Shen<yong.s...@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

_______________________________________________
linaro-dev mailing list
linaro-dev@lists.linaro.org
http://lists.linaro.org/mailman/listinfo/linaro-dev

Reply via email to