void print_section(Elf_data* data, int i) { unsigned int j; while (++i < E_SHNUM(data)) if (SH_SIZE(data, i) > 0) { printf("Contents of section %s:\n", &data->strtab[SH_NAME(data, i)]); j = 0; while (j < SH_SIZE(data, i) && SH_OFFSET(data, i) + j < data->fsize) { if (j == 0) printf(" %04x\t", (unsigned int)SH_ADDR(data, i) + j); printf("%02x", *(UCHAR(data->data) + SH_OFFSET(data, i) + j)); ++j; if (j != 0 && j % 16 == 0) { print_char(UCHAR(data->data) + SH_OFFSET(data, i), j - 16, j); printf("\n %04x\t", (unsigned int)SH_ADDR(data, i) + j); } else if (j != 0 && j % 4 == 0) printf(" "); } print_char(UCHAR(data->data) + SH_OFFSET(data, i), j - (j % 16), j); printf("\n"); } }
SharedMemory::SharedMemory(const char *name, Mode mode) : mode(mode), err(0) { strcpy(this->name, name); size = sizeof(SegmentHeader); fd = shm_open(name, mode==Master ? (O_CREAT | O_RDWR | O_EXCL) : O_RDWR, S_IRUSR | S_IWUSR); if(fd<0) { err = errno; std::cerr << "Failed to open shared memory" << std::endl; return; } std::cout << "init sharedmemory " << sizeof(SegmentHeader) << std::endl; int r=0; if(mode==Master)r = ftruncate(fd, size); if(r) { std::cerr << "Can't resize file" << std::endl; return; } rptr = mmap(NULL, size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0); if(mode==Master) { SH_SIZE(rptr) = 0; SH_MUTEX(rptr) = 0; } }
void SharedMemory::resize(size_t _size) { if(rptr)munmap(rptr, size); size = _size+sizeof(SegmentHeader); if(mode==Master) { if(ftruncate(fd, size)) { std::cerr << "Can't resize memory" << std::endl; } } rptr = mmap(NULL, size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0); if(rptr==MAP_FAILED)std::cerr << "Failed to map memory" << std::endl; if(mode==Master)SH_SIZE(rptr) = size; }
size_t SharedMemory::getSize() { return SH_SIZE(rptr); }
void SharedMemory::autoResize() { resize(SH_SIZE(rptr)); }