/* Copyright (C) 2021-2023 Free Software Foundation, Inc. Contributed by Oracle. This file is part of GNU Binutils. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. */ #ifndef _DATA_WINDOW_H #define _DATA_WINDOW_H // The Data_window class hiearchy is used to access raw data in the // experiment record. // // The Data_window base class implements a set of windows into a raw data file. // It is responsible for mapping and unmapping regions of the file as // requested by other levels inside of the DBE. #include "util.h" class Data_window { public: // Span in data file typedef struct { int64_t offset; // file offset int64_t length; // span length } Span; Data_window (char *filename); ~Data_window (); // Return address of "offset" byte of window for "length" bytes. // Return 0 on error or locked. void *bind (Span *span, int64_t minSize); void *bind (int64_t file_offset, int64_t minSize); void *get_data (int64_t offset, int64_t size, void *datap); int64_t get_buf_size (); int64_t copy_to_file (int f, int64_t offset, int64_t size); bool not_opened () { return !opened; } off64_t get_fsize () { return fsize; } template inline Key_t get_align_val (Key_t *vp) { if (sizeof (Key_t) <= sizeof (int)) return *vp; // 64-bit value can have a wrong alignment Key_t val = (Key_t) 0; uint32_t *p1 = (uint32_t *) vp; uint32_t *p2 = (uint32_t*) (&val); p2[0] = p1[0]; p2[1] = p1[1]; return val; } template inline Key_t decode (Key_t &v) { Key_t val = get_align_val (&v); if (need_swap_endian) swapByteOrder (&val, sizeof (val)); return val; } bool need_swap_endian; char *fname; // file name protected: int fd; // file descriptor bool mmap_on_file; private: long page_size; // used in mmap() bool use_mmap; bool opened; int64_t fsize; // file size void *base; // current window int64_t woffset; // offset of current window int64_t wsize; // size of current window int64_t basesize; // size of allocated window }; #endif /* _DATA_WINDOW_H */