Re: [PATCH] perf-probe: rewrite find_lazy_match_lines() by usinggetline(3)

From: Masami Hiramatsu
Date: Thu Jan 13 2011 - 05:25:50 EST


(2011/01/13 19:18), Franck Bui-Huu wrote:
> From: Franck Bui-Huu <fbuihuu@xxxxxxxxx>
>
> Signed-off-by: Franck Bui-Huu <fbuihuu@xxxxxxxxx>

Looks very nice! :)

Acked-by: Masami Hiramatsu <masami.hiramatsu.pt@xxxxxxxxxxx>

Thanks!

> ---
> tools/perf/util/probe-finder.c | 70 +++++++++++++++------------------------
> 1 files changed, 27 insertions(+), 43 deletions(-)
>
> diff --git a/tools/perf/util/probe-finder.c b/tools/perf/util/probe-finder.c
> index ddf4d45..4221738 100644
> --- a/tools/perf/util/probe-finder.c
> +++ b/tools/perf/util/probe-finder.c
> @@ -1092,51 +1092,38 @@ static int find_probe_point_by_line(struct probe_finder *pf)
> static int find_lazy_match_lines(struct list_head *head,
> const char *fname, const char *pat)
> {
> - char *fbuf, *p1, *p2;
> - int fd, line, nlines = -1;
> - struct stat st;
> -
> - fd = open(fname, O_RDONLY);
> - if (fd < 0) {
> - pr_warning("Failed to open %s: %s\n", fname, strerror(-fd));
> + FILE *fp;
> + char *line = NULL;
> + size_t line_len;
> + ssize_t len;
> + int count = 0, linenum = 1;
> +
> + fp = fopen(fname, "r");
> + if (!fp) {
> + pr_warning("Failed to open %s: %s\n", fname, strerror(errno));
> return -errno;
> }
>
> - if (fstat(fd, &st) < 0) {
> - pr_warning("Failed to get the size of %s: %s\n",
> - fname, strerror(errno));
> - nlines = -errno;
> - goto out_close;
> - }
> -
> - nlines = -ENOMEM;
> - fbuf = malloc(st.st_size + 2);
> - if (fbuf == NULL)
> - goto out_close;
> - if (read(fd, fbuf, st.st_size) < 0) {
> - pr_warning("Failed to read %s: %s\n", fname, strerror(errno));
> - nlines = -errno;
> - goto out_free_fbuf;
> - }
> - fbuf[st.st_size] = '\n'; /* Dummy line */
> - fbuf[st.st_size + 1] = '\0';
> - p1 = fbuf;
> - line = 1;
> - nlines = 0;
> - while ((p2 = strchr(p1, '\n')) != NULL) {
> - *p2 = '\0';
> - if (strlazymatch(p1, pat)) {
> - line_list__add_line(head, line);
> - nlines++;
> + while ((len = getline(&line, &line_len, fp)) > 0) {
> +
> + if (line[len - 1] == '\n')
> + line[len - 1] = '\0';
> +
> + if (strlazymatch(line, pat)) {
> + line_list__add_line(head, linenum);
> + count++;
> }
> - line++;
> - p1 = p2 + 1;
> - }
> -out_free_fbuf:
> - free(fbuf);
> -out_close:
> - close(fd);
> - return nlines;
> + linenum++;
> + }
> +
> + if (ferror(fp))
> + count = -errno;
> + free(line);
> + fclose(fp);
> +
> + if (count == 0)
> + pr_debug("No matched lines found in %s.\n", fname);
> + return count;
> }
>
> /* Find probe points from lazy pattern */
> @@ -1154,10 +1141,7 @@ static int find_probe_point_lazy(Dwarf_Die *sp_die, struct probe_finder *pf)
> /* Matching lazy line pattern */
> ret = find_lazy_match_lines(&pf->lcache, pf->fname,
> pf->pev->point.lazy_line);
> - if (ret == 0) {
> - pr_debug("No matched lines found in %s.\n", pf->fname);
> - return 0;
> - } else if (ret < 0)
> + if (ret <= 0)
> return ret;
> }
>


--
Masami HIRAMATSU
2nd Dept. Linux Technology Center
Hitachi, Ltd., Systems Development Laboratory
E-mail: masami.hiramatsu.pt@xxxxxxxxxxx
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/