| 244 | } |
| 245 | |
| 246 | void Read(char* val, const size_t val_len, |
| 247 | const size_t offset) override { |
| 248 | size_t page_size = getpagesize(); |
| 249 | int pages_to_read = val_len / page_size; |
| 250 | if (val_len % page_size != 0) { |
| 251 | pages_to_read += 1; |
| 252 | } |
| 253 | if (offset + val_len >= page_size * pages_to_read) { |
| 254 | pages_to_read += 1; |
| 255 | } |
| 256 | int aligned_offset = offset - (offset % page_size); |
| 257 | char* read_buffer = (char*)memalign(page_size, page_size * pages_to_read); |
| 258 | |
| 259 | int status = pread(EmbFile::fd_, |
| 260 | (void*)read_buffer, |
| 261 | page_size * pages_to_read, |
| 262 | aligned_offset); |
| 263 | if (status < 0) { |
| 264 | LOG(FATAL)<<"Failed to pread, read size: " |
| 265 | <<page_size * pages_to_read |
| 266 | <<", offset: "<<aligned_offset; |
| 267 | } |
| 268 | memcpy(val, read_buffer + (offset % page_size), val_len); |
| 269 | free(read_buffer); |
| 270 | } |
| 271 | }; |
| 272 | |
| 273 | } // embedding |