[prev in list] [next in list] [prev in thread] [next in thread]
List: kde-commits
Subject: KDE/kdelibs
From: Oswald Buddenhagen <ossi () kde ! org>
Date: 2009-04-04 12:51:44
Message-ID: 1238849504.651794.13868.nullmailer () svn ! kde ! org
[Download RAW message or body]
SVN commit 949059 by ossi:
re-introduce KDE_EXTRA_FSYNC for the poor XFS/Ext4/... users
setting this env variable to anything (before kde starts!) will avoid
getting those pesky 0-byte sized files after system crashes - at a
potentially non-trivial performance cost.
kinda fixes bug 187172
M +1 -0 ConfigureChecks.cmake
M +1 -0 config.h.cmake
M +31 -0 kdecore/io/ksavefile.cpp
--- trunk/KDE/kdelibs/ConfigureChecks.cmake #949058:949059
@@ -102,6 +102,7 @@
check_function_exists(backtrace HAVE_BACKTRACE) # kdecore, kio
check_function_exists(getpagesize HAVE_GETPAGESIZE) # khtml
check_function_exists(getpeereid HAVE_GETPEEREID) # kdesu
+check_function_exists(fdatasync HAVE_FDATASYNC) # kdecore
check_function_exists(madvise HAVE_MADVISE) # kdecore
check_function_exists(mmap HAVE_MMAP) # kdecore, khtml
if(NOT WIN32)
--- trunk/KDE/kdelibs/config.h.cmake #949058:949059
@@ -88,6 +88,7 @@
#cmakedefine HAVE_GETMNTINFO 1
#cmakedefine HAVE_GETPAGESIZE 1
#cmakedefine HAVE_INITGROUPS 1
+#cmakedefine HAVE_FDATASYNC 1
#cmakedefine HAVE_MADVISE 1
#cmakedefine HAVE_MMAP 1
#cmakedefine HAVE_MKSTEMPS 1
--- trunk/KDE/kdelibs/kdecore/io/ksavefile.cpp #949058:949059
@@ -36,6 +36,9 @@
#include <kconfiggroup.h>
#include <kcomponentdata.h>
+#include <stdlib.h>
+#include <errno.h>
+
class KSaveFile::Private
{
public:
@@ -182,11 +185,37 @@
d->wasFinalized = true;
}
+#ifdef HAVE_FDATASYNC
+# define FDATASYNC fdatasync
+#else
+# define FDATASYNC fsync
+#endif
+
bool KSaveFile::finalize()
{
bool success = false;
if ( !d->wasFinalized ) {
+
+#ifdef Q_OS_UNIX
+ static int extraSync = -1;
+ if (extraSync < 0)
+ extraSync = getenv("KDE_EXTRA_FSYNC") != 0 ? 1 : 0;
+ if (extraSync) {
+ if (flush()) {
+ forever {
+ if (!FDATASYNC(handle()))
+ break;
+ if (errno != EINTR) {
+ d->error = QFile::WriteError;
+ d->errorString = i18n("Synchronization to disk failed");
+ break;
+ }
+ }
+ }
+ }
+#endif
+
close();
if( error() != NoError ) {
@@ -213,6 +242,8 @@
return success;
}
+#undef FDATASYNC
+
bool KSaveFile::backupFile( const QString& qFilename, const QString& backupDir )
{
// get backup type from config, by default use "simple"
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic