X-Git-Url: https://git.octo.it/?a=blobdiff_plain;f=src%2Frrd_open.c;h=86d608cc556a0838419882f55dafb36341d97523;hb=837a4b7874724d57e7721e23f65ef57c998d9dff;hp=27965062ae811df26367e41371579f5604951818;hpb=080a38ee54e591efe5502395bea152c75e205779;p=rrdtool.git diff --git a/src/rrd_open.c b/src/rrd_open.c index 2796506..86d608c 100644 --- a/src/rrd_open.c +++ b/src/rrd_open.c @@ -79,13 +79,14 @@ rrd_file_t *rrd_open( rrd_file_t *rrd_file = NULL; off_t newfile_size = 0; - if (rdwr & RRD_CREAT) { + if ((rdwr & RRD_CREAT) && (rdwr & RRD_CREAT_SETSIZE)) { /* yes bad inline signaling alert, we are using the floatcookie to pass the size in ... only used in resize */ newfile_size = (off_t) rrd->stat_head->float_cookie; free(rrd->stat_head); } - rrd_init(rrd); + if(!(rdwr & RRD_CREAT)) + rrd_init(rrd); rrd_file = malloc(sizeof(rrd_file_t)); if (rrd_file == NULL) { rrd_set_error("allocating rrd_file descriptor for '%s'", file_name); @@ -170,7 +171,13 @@ rrd_file_t *rrd_open( } } */ + #ifdef HAVE_MMAP + if(rrd_file->file_len == 0 && (rdwr & RRD_CREAT)) + { + rrd_file->file_start = NULL; + goto out_done; + } data = mmap(0, rrd_file->file_len, mm_prot, mm_flags, rrd_file->fd, offset); @@ -364,6 +371,13 @@ void rrd_dontneed( unsigned long i; ssize_t _page_size = sysconf(_SC_PAGESIZE); + if (rrd_file == NULL) { +#if defined DEBUG && DEBUG + fprintf (stderr, "rrd_dontneed: Argument 'rrd_file' is NULL.\n"); +#endif + return; + } + #if defined DEBUG && DEBUG > 1 mincore_print(rrd_file, "before"); #endif @@ -528,10 +542,36 @@ ssize_t rrd_write( size_t count) { #ifdef HAVE_MMAP + /* These flags are used if creating a new RRD */ + int mm_prot = PROT_READ | PROT_WRITE, mm_flags = MAP_SHARED; + int old_size = rrd_file->file_len; + int new_size = rrd_file->file_len; if (count == 0) return 0; if (buf == NULL) return -1; /* EINVAL */ + + if((rrd_file->pos + count) > old_size) + { + new_size = rrd_file->pos + count; + rrd_file->file_len = new_size; + lseek(rrd_file->fd, new_size - 1, SEEK_SET); + write(rrd_file->fd, "\0", 1); /* poke */ + lseek(rrd_file->fd, 0, SEEK_SET); + if(rrd_file->file_start == NULL) + { + rrd_file->file_start = mmap(0, new_size, mm_prot, mm_flags, + rrd_file->fd, 0); + } + else + rrd_file->file_start = mremap(rrd_file->file_start, old_size, new_size, MREMAP_MAYMOVE); + + if (rrd_file->file_start == MAP_FAILED) { + rrd_set_error("m(re)maping file : %s", + rrd_strerror(errno)); + return -1; + } + } memcpy(rrd_file->file_start + rrd_file->pos, buf, count); rrd_file->pos += count; return count; /* mimmic write() semantics */