diff options
author | Philip Van Hoof <philip@codeminded.be> | 2011-09-22 11:49:49 +0200 |
---|---|---|
committer | Philip Van Hoof <philip@codeminded.be> | 2011-09-23 12:54:46 +0200 |
commit | 3fa45aecfe4d770a7261f3a020a7773174b5108e (patch) | |
tree | d7cdea3398d7d32d0f2d77e680319d97fa1cae8c | |
parent | f546a584c015da20db663ba0df40c48736249b86 (diff) | |
download | tracker-3fa45aecfe4d770a7261f3a020a7773174b5108e.tar.gz |
tracker-extract, xmp: Use mmap with a fd with O_NOATIME for xmp files
Conflicts:
src/tracker-extract/tracker-extract-xmp.c
-rw-r--r-- | src/tracker-extract/tracker-extract-xmp.c | 62 |
1 files changed, 58 insertions, 4 deletions
diff --git a/src/tracker-extract/tracker-extract-xmp.c b/src/tracker-extract/tracker-extract-xmp.c index 21ac36bc6..f6f76eb1c 100644 --- a/src/tracker-extract/tracker-extract-xmp.c +++ b/src/tracker-extract/tracker-extract-xmp.c @@ -19,6 +19,21 @@ #include "config.h" +#ifndef _GNU_SOURCE +#define _GNU_SOURCE +#endif + +#include <errno.h> +#include <fcntl.h> +#include <string.h> +#include <sys/types.h> +#include <sys/stat.h> +#include <unistd.h> +#include <sys/mman.h> + +#include <glib.h> +#include <glib/gstdio.h> + #include <gio/gio.h> #include <libtracker-extract/tracker-extract.h> @@ -134,14 +149,51 @@ extract_xmp (const gchar *uri, TrackerSparqlBuilder *metadata) { TrackerXmpData *xd = NULL; - GError *error = NULL; gchar *filename; gchar *contents; - gsize length; + gsize length = 0; + int fd; + struct stat st; + filename = g_filename_from_uri (uri, NULL, NULL); - if (g_file_get_contents (filename, &contents, &length, &error)) { + fd = g_open (filename, O_RDONLY | O_NOATIME, 0); + + if (fd == -1) { + g_warning ("Could not open xmp file '%s': %s\n", + filename, + g_strerror (errno)); + g_free (filename); + return; + } + + if (fstat (fd, &st) == -1) { + g_warning ("Could not fstat xmp file '%s': %s\n", + filename, + g_strerror (errno)); + close (fd); + g_free (filename); + return; + } + + if (st.st_size == 0) { + contents = NULL; + length = 0; + } else { + contents = (gchar *) mmap (NULL, st.st_size, PROT_READ, MAP_PRIVATE, fd, 0); + if (contents == NULL) { + g_warning ("Could not mmap xmp file '%s': %s\n", + filename, + g_strerror (errno)); + close (fd); + g_free (filename); + return; + } + length = st.st_size; + } + + if (contents) { gchar *original_uri; original_uri = find_orig_uri (filename); @@ -159,9 +211,11 @@ extract_xmp (const gchar *uri, g_free (original_uri); tracker_xmp_free (xd); - g_free (contents); + + munmap (contents, length); } + close (fd); g_free (filename); } |