Skip to content

Commit

Permalink
perf probe: Rewrite find_lazy_match_lines() by using getline(3)
Browse files Browse the repository at this point in the history
Acked-by: Masami Hiramatsu <[email protected]>
Cc: Masami Hiramatsu <[email protected]>
Cc: lkml <[email protected]>
LKML-Reference: <[email protected]>
Signed-off-by: Franck Bui-Huu <[email protected]>
Signed-off-by: Arnaldo Carvalho de Melo <[email protected]>
  • Loading branch information
fbuihuu authored and acmel committed Feb 7, 2011
1 parent ef4d001 commit f50c216
Showing 1 changed file with 28 additions and 44 deletions.
72 changes: 28 additions & 44 deletions tools/perf/util/probe-finder.c
Original file line number Diff line number Diff line change
Expand Up @@ -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,
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;
linenum++;
}
out_free_fbuf:
free(fbuf);
out_close:
close(fd);
return nlines;

if (ferror(fp))
count = -errno;
free(line);
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,
Expand Down Expand Up @@ -1312,10 +1299,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;
}

Expand Down

0 comments on commit f50c216

Please sign in to comment.