make MAP_PRIVATE conditional on AIX not being defined ... should fix part of #216
[rrdtool.git] / src / rrd_open.c
index d2ec549..5f3723f 100644 (file)
@@ -1,25 +1,29 @@
 /*****************************************************************************
- * RRDtool 1.3.2  Copyright by Tobi Oetiker, 1997-2008
+ * RRDtool 1.4.3  Copyright by Tobi Oetiker, 1997-2010
  *****************************************************************************
  * rrd_open.c  Open an RRD File
  *****************************************************************************
  * $Id$
  *****************************************************************************/
 
+#include "rrd_tool.h"
+#include "unused.h"
+
+#ifdef WIN32
 #include <stdlib.h>
 #include <fcntl.h>
 #include <sys/stat.h>
+#endif
+
+
+#ifdef HAVE_BROKEN_MS_ASYNC
+#include <sys/types.h>
 #include <utime.h>
+#endif
 
-#include "rrd_tool.h"
-#include "unused.h"
 #define MEMBLK 8192
 
 #ifdef WIN32
-#      define random() rand()
-#      define srandom(x) srand(x)
-#      define getpid() 0
-
 #define        _LK_UNLCK       0       /* Unlock */
 #define        _LK_LOCK        1       /* Lock */
 #define        _LK_NBLCK       2       /* Non-blocking lock */
 #endif
 #endif
 
-long int  rra_random_row(
-    rra_def_t *);
-
-
 /* Open a database file, return its header and an open filehandle,
  * positioned to the first cdp in the first rra.
  * In the error path of rrd_open, only rrd_free(&rrd) has to be called
@@ -115,15 +115,7 @@ rrd_file_t *rrd_open(
     /* Are we creating a new file? */
     if((rdwr & RRD_CREAT) && (rrd->stat_head != NULL))
     {
-        header_len = \
-          sizeof(stat_head_t) + \
-          sizeof(ds_def_t) * rrd->stat_head->ds_cnt + \
-          sizeof(rra_def_t) * rrd->stat_head->rra_cnt + \
-          sizeof(time_t) + \
-          sizeof(live_head_t) + \
-          sizeof(pdp_prep_t) * rrd->stat_head->ds_cnt + \
-          sizeof(cdp_prep_t) * rrd->stat_head->ds_cnt * rrd->stat_head->rra_cnt + \
-          sizeof(rra_ptr_t) * rrd->stat_head->rra_cnt;
+        header_len = rrd_get_header_size(rrd);
 
         value_cnt = 0;
         for (ui = 0; ui < rrd->stat_head->rra_cnt; ui++)
@@ -166,7 +158,9 @@ rrd_file_t *rrd_open(
     if (rdwr & RRD_READONLY) {
         flags |= O_RDONLY;
 #ifdef HAVE_MMAP
+# if !defined(AIX)
         rrd_simple_file->mm_flags = MAP_PRIVATE;
+# endif
 # ifdef MAP_NORESERVE
         rrd_simple_file->mm_flags |= MAP_NORESERVE;  /* readonly, so no swap backing needed */
 # endif
@@ -182,6 +176,9 @@ rrd_file_t *rrd_open(
         if (rdwr & RRD_CREAT) {
             flags |= (O_CREAT | O_TRUNC);
         }
+        if (rdwr & RRD_EXCL) {
+            flags |= O_EXCL;
+        }
     }
     if (rdwr & RRD_READAHEAD) {
 #ifdef MAP_POPULATE
@@ -226,7 +223,10 @@ rrd_file_t *rrd_open(
     } else {
         rrd_file->file_len = newfile_size;
         lseek(rrd_simple_file->fd, newfile_size - 1, SEEK_SET);
-        write(rrd_simple_file->fd, "\0", 1);   /* poke */
+        if ( write(rrd_simple_file->fd, "\0", 1) == -1){    /* poke */
+            rrd_set_error("write '%s': %s", file_name, rrd_strerror(errno));
+            goto out_close;
+        }
         lseek(rrd_simple_file->fd, 0, SEEK_SET);
     }
 #ifdef HAVE_POSIX_FADVISE
@@ -269,12 +269,14 @@ rrd_file_t *rrd_open(
 #ifdef USE_MADVISE
     if (rdwr & RRD_COPY) {
         /* We will read everything in a moment (copying) */
-        madvise(data, rrd_file->file_len, MADV_WILLNEED | MADV_SEQUENTIAL);
+        madvise(data, rrd_file->file_len, MADV_WILLNEED );
+        madvise(data, rrd_file->file_len, MADV_SEQUENTIAL );
     } else {
         /* We do not need to read anything in for the moment */
         madvise(data, rrd_file->file_len, MADV_RANDOM);
         /* the stat_head will be needed soonish, so hint accordingly */
-        madvise(data, sizeof(stat_head_t), MADV_WILLNEED | MADV_RANDOM);
+        madvise(data, sizeof(stat_head_t), MADV_WILLNEED);
+        madvise(data, sizeof(stat_head_t), MADV_RANDOM);
     }
 #endif
 
@@ -480,7 +482,7 @@ void rrd_dontneed(
     size_t dontneed_start;
     size_t rra_start;
     size_t active_block;
-    unsigned long i;
+    size_t i;
     ssize_t   _page_size = sysconf(_SC_PAGESIZE);
 
     if (rrd_file == NULL) {
@@ -542,7 +544,7 @@ void rrd_dontneed(
 #if defined DEBUG && DEBUG > 1
     mincore_print(rrd_file, "after");
 #endif
-#endif                          /* without madvise and posix_fadvise ist does not make much sense todo anything */
+#endif                          /* without madvise and posix_fadvise it does not make much sense todo anything */
 }
 
 
@@ -685,22 +687,13 @@ ssize_t rrd_write(
 }
 
 
-/* flush all data pending to be written to FD.  */
-
+/* this is a leftover from the old days, it serves no purpose
+   and is therefore turned into a no-op */
 void rrd_flush(
-    rrd_file_t *rrd_file)
+    rrd_file_t UNUSED(*rrd_file))
 {
-#ifndef WIN32
-    rrd_simple_file_t *rrd_simple_file;
-    rrd_simple_file = (rrd_simple_file_t *)rrd_file->pvt;
-    if (fdatasync(rrd_simple_file->fd) != 0) {
-        rrd_set_error("flushing fd %d: %s", rrd_simple_file->fd,
-                      rrd_strerror(errno));
-    }
-#endif
 }
 
-
 /* Initialize RRD header.  */
 
 void rrd_init(
@@ -759,10 +752,10 @@ void rrd_freemem(
  * aligning RRAs within stripes, or other performance enhancements
  */
 void rrd_notify_row(
-    rrd_file_t *rrd_file  __attribute__((unused)),
-    int rra_idx  __attribute__((unused)),
-    unsigned long rra_row  __attribute__((unused)),
-    time_t rra_time  __attribute__((unused)))
+    rrd_file_t UNUSED(*rrd_file),
+    int UNUSED(rra_idx),
+    unsigned long UNUSED(rra_row),
+    time_t UNUSED(rra_time))
 {
 }
 
@@ -774,24 +767,10 @@ void rrd_notify_row(
  * don't change to a new disk block at the same time
  */
 unsigned long rrd_select_initial_row(
-    rrd_file_t *rrd_file  __attribute__((unused)),
-    int rra_idx  __attribute__((unused)),
+    rrd_file_t UNUSED(*rrd_file),
+    int UNUSED(rra_idx),
     rra_def_t *rra
     )
 {
-    return rra_random_row(rra);
-}
-
-static int rand_init = 0;
-
-long int rra_random_row(
-    rra_def_t *rra)
-{
-    if (!rand_init) {
-        srandom((unsigned int) time(NULL) + (unsigned int) getpid());
-        rand_init++;
-    }
-
-    return random() % rra->row_cnt;
+    return rrd_random() % rra->row_cnt;
 }
-