diff --git a/src/rrd_open.c b/src/rrd_open.c
index 5598546d11ae471cad5c4fa332e565829cfc53ed..5a908daafc49a01eb285f0d205e246c4af8829ef 100644 (file)
--- a/src/rrd_open.c
+++ b/src/rrd_open.c
#include <stdlib.h>
#include <fcntl.h>
#include <sys/stat.h>
+#include <utime.h>
#include "rrd_tool.h"
#include "unused.h"
} 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);
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)) {
if (data != MAP_FAILED)
munmap(data, rrd_file->file_len);
#endif
+
close(rrd_simple_file->fd);
out_free:
free(rrd_file->pvt);