g_file_set_contents(): use posix_fallocate()
authorRyan Lortie <desrt@desrt.ca>
Mon, 3 Jun 2013 19:43:01 +0000 (15:43 -0400)
committerRyan Lortie <desrt@desrt.ca>
Mon, 3 Jun 2013 20:12:04 +0000 (16:12 -0400)
Extents-based filesystems like knowing in advance how much data will be
written to a file in order to prevent fragmentation.  If we have it, use
posix_fallocate() before writing data in g_file_set_contents().

https://bugzilla.gnome.org/show_bug.cgi?id=701560

configure.ac
glib/gfileutils.c

index eb37a4d..53b38bc 100644 (file)
@@ -1056,7 +1056,7 @@ AC_MSG_RESULT($glib_ssize_type)
 # Check for some functions
 AC_CHECK_FUNCS(lstat strerror strsignal memmove vsnprintf stpcpy strcasecmp strncasecmp poll getcwd vasprintf setenv unsetenv getc_unlocked readlink symlink fdwalk memmem)
 AC_CHECK_FUNCS(chown lchmod lchown fchmod fchown link utimes getgrgid getpwuid getresuid)
-AC_CHECK_FUNCS(getmntent_r setmntent endmntent hasmntopt getfsstat getvfsstat)
+AC_CHECK_FUNCS(getmntent_r setmntent endmntent hasmntopt getfsstat getvfsstat posix_fallocate)
 # Check for high-resolution sleep functions
 AC_CHECK_FUNCS(splice)
 AC_CHECK_FUNCS(prlimit)
index 5ef87a9..d0c1fc9 100644 (file)
@@ -1059,6 +1059,13 @@ write_to_temp_file (const gchar  *contents,
   if (length > 0)
     {
       gsize n_written;
+
+#ifdef HAVE_POSIX_FALLOCATE
+      /* We do this on a 'best effort' basis... It may not be supported
+       * on the underlying filesystem.
+       */
+      (void) posix_fallocate (fd, 0, length);
+#endif
       
       errno = 0;