提交 f50c2169 编写于 作者: F Franck Bui-Huu 提交者: Arnaldo Carvalho de Melo

perf probe: Rewrite find_lazy_match_lines() by using getline(3)

Acked-by: NMasami Hiramatsu <masami.hiramatsu.pt@hitachi.com>
Cc: Masami Hiramatsu <masami.hiramatsu.pt@hitachi.com>
Cc: lkml <linux-kernel@vger.kernel.org>
LKML-Reference: <m3d3o185u1.fsf@gmail.com>
Signed-off-by: NFranck Bui-Huu <fbuihuu@gmail.com>
Signed-off-by: NArnaldo Carvalho de Melo <acme@redhat.com>
上级 ef4d001d
...@@ -1234,51 +1234,38 @@ static int find_probe_point_by_line(struct probe_finder *pf) ...@@ -1234,51 +1234,38 @@ static int find_probe_point_by_line(struct probe_finder *pf)
static int find_lazy_match_lines(struct list_head *head, static int find_lazy_match_lines(struct list_head *head,
const char *fname, const char *pat) const char *fname, const char *pat)
{ {
char *fbuf, *p1, *p2; FILE *fp;
int fd, line, nlines = -1; char *line = NULL;
struct stat st; size_t line_len;
ssize_t len;
fd = open(fname, O_RDONLY); int count = 0, linenum = 1;
if (fd < 0) {
pr_warning("Failed to open %s: %s\n", fname, strerror(-fd)); fp = fopen(fname, "r");
if (!fp) {
pr_warning("Failed to open %s: %s\n", fname, strerror(errno));
return -errno; return -errno;
} }
if (fstat(fd, &st) < 0) { while ((len = getline(&line, &line_len, fp)) > 0) {
pr_warning("Failed to get the size of %s: %s\n",
fname, strerror(errno));
nlines = -errno;
goto out_close;
}
nlines = -ENOMEM; if (line[len - 1] == '\n')
fbuf = malloc(st.st_size + 2); line[len - 1] = '\0';
if (fbuf == NULL)
goto out_close; if (strlazymatch(line, pat)) {
if (read(fd, fbuf, st.st_size) < 0) { line_list__add_line(head, linenum);
pr_warning("Failed to read %s: %s\n", fname, strerror(errno)); count++;
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++;
} }
line++; linenum++;
p1 = p2 + 1;
} }
out_free_fbuf:
free(fbuf); if (ferror(fp))
out_close: count = -errno;
close(fd); free(line);
return nlines; fclose(fp);
if (count == 0)
pr_debug("No matched lines found in %s.\n", fname);
return count;
} }
static int probe_point_lazy_walker(const char *fname, int lineno, static int probe_point_lazy_walker(const char *fname, int lineno,
...@@ -1312,10 +1299,7 @@ static int find_probe_point_lazy(Dwarf_Die *sp_die, struct probe_finder *pf) ...@@ -1312,10 +1299,7 @@ static int find_probe_point_lazy(Dwarf_Die *sp_die, struct probe_finder *pf)
/* Matching lazy line pattern */ /* Matching lazy line pattern */
ret = find_lazy_match_lines(&pf->lcache, pf->fname, ret = find_lazy_match_lines(&pf->lcache, pf->fname,
pf->pev->point.lazy_line); pf->pev->point.lazy_line);
if (ret == 0) { if (ret <= 0)
pr_debug("No matched lines found in %s.\n", pf->fname);
return 0;
} else if (ret < 0)
return ret; return ret;
} }
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册