- }
- else {
- MYFREAD(rrd->live_head, live_head_t, 1)
- }
- MYFREAD(rrd->pdp_prep, pdp_prep_t, rrd->stat_head->ds_cnt)
- MYFREAD(rrd->cdp_prep, cdp_prep_t, (rrd->stat_head->rra_cnt
- * rrd->stat_head->ds_cnt))
- MYFREAD(rrd->rra_ptr, rra_ptr_t, rrd->stat_head->rra_cnt)
-#undef MYFREAD
+ } else {
+#ifdef USE_MADVISE
+ /* the live_head will be needed soonish, so hint accordingly */
+ madvise(data+offset, sizeof(live_head_t), MADV_WILLNEED);
+#endif
+ rrd->live_head = (live_head_t*)(data + offset);
+ offset += sizeof(live_head_t);
+ }
+// This doesn't look like it needs madvise
+ rrd->pdp_prep = (pdp_prep_t*)(data + offset);
+ offset += sizeof(pdp_prep_t) * rrd->stat_head->ds_cnt;
+
+// This could benefit from madvise()ing
+ rrd->cdp_prep = (cdp_prep_t*)(data + offset);
+ offset += sizeof(cdp_prep_t) *
+ (rrd->stat_head->rra_cnt * rrd->stat_head->ds_cnt);
+
+// This could benefit from madvise()ing
+ rrd->rra_ptr = (rra_ptr_t*)(data + offset);
+ offset += sizeof(rra_ptr_t) * rrd->stat_head->rra_cnt;
+#ifdef USE_MADVISE
+out_done:
+#endif
+ rrd_file->header_len = offset;
+ rrd_file->pos = offset;
+/* we could close(rrd_file->fd); here, the mapping is still valid anyway */
+ return (rrd_file);
+out_nullify_head:
+ rrd->stat_head = NULL;
+out_close:
+ close(rrd_file->fd);
+ return NULL;
+}
+
+/* Close a reference to an rrd_file. */
+int rrd_close(rrd_file_t* rrd_file) {
+ int ret = 0;
+#ifdef HAVE_MMAP
+ ret = munmap(rrd_file->file_start, rrd_file->file_len);
+// if (ret != 0)
+// rrd_set_error("munmap rrd_file");
+#endif
+ free(rrd_file);
+ rrd_file = NULL;
+ return ret;
+}
+
+/* Set position of rrd_file. */
+off_t rrd_seek(rrd_file_t* rrd_file, off_t off, int whence) {
+ off_t ret = 0;
+#ifdef HAVE_MMAP
+ if (whence == SEEK_SET)
+ rrd_file->pos = off;
+ else if (whence == SEEK_CUR)
+ rrd_file->pos += off;
+ else if (whence == SEEK_END)
+ rrd_file->pos = rrd_file->file_len + off;
+#else
+ ret = lseek(rrd_file->fd, off, whence);
+ if (ret < 0)
+ rrd_set_error("lseek: %s", rrd_strerror(errno));
+ rrd_file->pos = ret;
+#endif
+//XXX: mimic fseek, which returns 0 upon success
+ return ret == -1; //XXX: or just ret to mimic lseek
+}
+
+/* Get current position in rrd_file. */
+off_t rrd_tell(rrd_file_t* rrd_file) {
+ return rrd_file->pos;
+}