perf: Use stat instead of seeks for xfsize
authorBarret Rhoden <brho@cs.berkeley.edu>
Wed, 15 Jun 2016 18:22:39 +0000 (14:22 -0400)
committerBarret Rhoden <brho@cs.berkeley.edu>
Fri, 17 Jun 2016 16:17:54 +0000 (12:17 -0400)
It's faster and doesn't rely on a file being seekable.  I don't know how
well seeks work with qio queues...

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
tools/profile/perf/perf_core.c
tools/profile/perf/xlib.c

index 47274ff..79b15b7 100644 (file)
@@ -766,7 +766,6 @@ void perf_convert_trace_data(struct perfconv_context *cctx, const char *input,
 {
        FILE *infile;
        size_t ksize;
-       char kpath[1024];
 
        infile = xfopen(input, "rb");
        if (xfsize(infile) > 0) {
index 8171d2c..897b68e 100644 (file)
@@ -94,13 +94,18 @@ FILE *xfdopen(int fd, const char *mode)
 
 off_t xfsize(FILE *file)
 {
-       off_t pos = ftello(file), size;
+       struct stat stat_buf;
+       int fd = fileno(file);
 
-       xfseek(file, 0, SEEK_END);
-       size = ftello(file);
-       xfseek(file, pos, SEEK_SET);
-
-       return size;
+       if (fd < 0) {
+               perror("xfsize fileno");
+               exit(1);
+       }
+       if (fstat(fd, &stat_buf)) {
+               perror("xfsize fstat");
+               exit(1);
+       }
+       return stat_buf.st_size;
 }
 
 void xfwrite(const void *data, size_t size, FILE *file)