| /* 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 <typename Key_t> 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 <typename Key_t> 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 */ |