[tracker/tracker-0.10-no-atime: 11/23] tracker-extract, xmp: Use mmap with a fd with O_NOATIME for xmp files



commit 3fa45aecfe4d770a7261f3a020a7773174b5108e
Author: Philip Van Hoof <philip codeminded be>
Date:   Thu Sep 22 11:49:49 2011 +0200

    tracker-extract, xmp: Use mmap with a fd with O_NOATIME for xmp files
    
    Conflicts:
    
    	src/tracker-extract/tracker-extract-xmp.c

 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 21ac36b..f6f76eb 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);
 }
 



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]