void hh_collect(value aggressive_val) { #ifdef _WIN32 // TODO GRGR return; #else int aggressive = Bool_val(aggressive_val); int flags = MAP_PRIVATE | MAP_ANON | MAP_NORESERVE; int prot = PROT_READ | PROT_WRITE; char* dest; size_t mem_size = 0; char* tmp_heap; float space_overhead = aggressive ? 1.2 : 2.0; if(used_heap_size() < (size_t)(space_overhead * heap_init_size)) { // We have not grown past twice the size of the initial size return; } tmp_heap = (char*)mmap(NULL, heap_size, prot, flags, 0, 0); dest = tmp_heap; if(tmp_heap == MAP_FAILED) { printf("Error while collecting: %s\n", strerror(errno)); exit(2); } assert(my_pid == master_pid); // Comes from the master // Walking the table size_t i; for(i = 0; i < HASHTBL_SIZE; i++) { if(hashtbl[i].addr != NULL) { // Found a non empty slot size_t bl_size = Get_buf_size(hashtbl[i].addr); size_t aligned_size = ALIGNED(bl_size); char* addr = Get_buf(hashtbl[i].addr); memcpy(dest, addr, bl_size); // This is where the data ends up after the copy hashtbl[i].addr = heap_init + mem_size + sizeof(size_t); dest += aligned_size; mem_size += aligned_size; } } // Copying the result back into shared memory memcpy(heap_init, tmp_heap, mem_size); *heap = heap_init + mem_size; if(munmap(tmp_heap, heap_size) == -1) { printf("Error while collecting: %s\n", strerror(errno)); exit(2); } #endif }
void hh_collect() { int flags = MAP_PRIVATE | MAP_ANONYMOUS | MAP_NORESERVE; int prot = PROT_READ | PROT_WRITE; char* dest; size_t mem_size = 0; char* tmp_heap; assert(heap_init_size >= 0); if(*heap < heap_init + 2 * heap_init_size) { // We have not grown passed twice the size of the initial size return; } tmp_heap = (char*)mmap(NULL, HEAP_SIZE, prot, flags, 0, 0); dest = tmp_heap; if(tmp_heap == MAP_FAILED) { printf("Error while collecting: %s\n", strerror(errno)); exit(2); } assert(my_pid == master_pid); // Comes from the master // Walking the table int i; for(i = 0; i < HASHTBL_SIZE; i++) { if(hashtbl[i].addr != NULL) { // Found a non empty slot size_t bl_size = Get_buf_size(hashtbl[i].addr); size_t aligned_size = ALIGNED(bl_size); char* addr = Get_buf(hashtbl[i].addr); memcpy(dest, addr, bl_size); // This is where the data ends up after the copy hashtbl[i].addr = heap_init + mem_size + sizeof(size_t); dest += aligned_size; mem_size += aligned_size; } } // Copying the result back into shared memory memcpy(heap_init, tmp_heap, mem_size); *heap = heap_init + mem_size; if(munmap(tmp_heap, HEAP_SIZE) == -1) { printf("Error while collecting: %s\n", strerror(errno)); exit(2); } }