check for broken implementations of msync / MS_ASYNC where
[rrdtool.git] / src / rrd_open.c
index 5598546..5a908da 100644 (file)
@@ -9,6 +9,7 @@
 #include <stdlib.h>
 #include <fcntl.h>
 #include <sys/stat.h>
+#include <utime.h>
 
 #include "rrd_tool.h"
 #include "unused.h"
@@ -173,10 +174,6 @@ rrd_file_t *rrd_open(
     } else {
         if (rdwr & RRD_READWRITE) {
             flags |= O_RDWR;
-#ifdef HAVE_MMAP
-            rrd_simple_file->mm_flags = MAP_SHARED;
-            rrd_simple_file->mm_prot |= PROT_WRITE;
-#endif
         }
         if (rdwr & RRD_CREAT) {
             flags |= (O_CREAT | O_TRUNC);
@@ -199,6 +196,21 @@ rrd_file_t *rrd_open(
         goto out_free;
     }
 
+#ifdef HAVE_MMAP
+#ifdef HAVE_BROKEN_MS_ASYNC
+    if (rdwr & RRD_READWRITE) {    
+        /* some unices, the files mtime does not get update    
+           on msync MS_ASYNC, in order to help them,     
+           we update the the timestamp at this point.      
+           The thing happens pretty 'close' to the open    
+           call so the chances of a race should be minimal.    
+                
+           Maybe ask your vendor to fix your OS ... */    
+           utime(file_name,NULL);  
+    }
+#endif    
+#endif
+
     /* Better try to avoid seeks as much as possible. stat may be heavy but
      * many concurrent seeks are even worse.  */
     if (newfile_size == 0 && ((fstat(rrd_simple_file->fd, &statb)) < 0)) {
@@ -360,6 +372,7 @@ rrd_file_t *rrd_open(
     if (data != MAP_FAILED)
       munmap(data, rrd_file->file_len);
 #endif
+
     close(rrd_simple_file->fd);
   out_free:
     free(rrd_file->pvt);