From 5cfe9640de432d43bcf40b910dba3c3f7a3599fc Mon Sep 17 00:00:00 2001 From: Gabriel Corona Date: Tue, 18 Feb 2014 11:40:32 +0100 Subject: [PATCH] [mc] Avoid parsing /proc/self/maps if possible (continued) --- src/mc/mc_checkpoint.c | 99 +----------------------------------------- 1 file changed, 2 insertions(+), 97 deletions(-) diff --git a/src/mc/mc_checkpoint.c b/src/mc/mc_checkpoint.c index 38fb33210d..260728c323 100644 --- a/src/mc/mc_checkpoint.c +++ b/src/mc/mc_checkpoint.c @@ -112,103 +112,8 @@ static void MC_get_memory_regions(mc_snapshot_t snapshot){ MC_snapshot_add_region(snapshot, 0, start_heap, (char*) end_heap - (char*) start_heap); snapshot->heap_bytes_used = mmalloc_get_bytes_used(std_heap); - - FILE *fp; - char *line = NULL; - ssize_t read; - size_t n = 0; - - char *lfields[6] = {0}, *tok; - void *start_addr, *start_addr1, *end_addr; - size_t size; - int i; - - fp = fopen("/proc/self/maps", "r"); - - xbt_assert(fp, - "Cannot open /proc/self/maps to investigate the memory map of the process. Please report this bug."); - - setbuf(fp, NULL); - - while((read = xbt_getline(&line, &n, fp)) != -1){ - - /* Wipeout the new line character */ - line[read - 1] = '\0'; - - /* Tokenize the line using spaces as delimiters and store each token */ - lfields[0] = strtok(line, " "); - - for (i = 1; i < 6 && lfields[i - 1] != NULL; i++) { - lfields[i] = strtok(NULL, " "); - } - - /* First get the permissions flags, need write permission */ - if(lfields[1][1] == 'w'){ - - /* Get the start address of the map */ - tok = strtok(lfields[0], "-"); - start_addr = (void *)strtoul(tok, NULL, 16); - - if(start_addr == std_heap){ /* Std_heap ? */ - - }else{ /* map name == libsimgrid || binary_name ? */ - if(lfields[5] != NULL){ - if(!memcmp(basename(lfields[5]), "libsimgrid", 10)){ - tok = strtok(NULL, "-"); - end_addr = (void *)strtoul(tok, NULL, 16); - size = (char*)end_addr - (char*)start_addr; - /* BSS and data segments may be separated according to the OS */ - if((read = xbt_getline(&line, &n, fp)) != -1){ - line[read - 1] = '\0'; - lfields[0] = strtok(line, " "); - for (i = 1; i < 6 && lfields[i - 1] != NULL; i++) { - lfields[i] = strtok(NULL, " "); - } - if(lfields[1][1] == 'w' && lfields[5] == NULL){ - tok = strtok(lfields[0], "-"); - start_addr1 = (void *)strtoul(tok, NULL, 16); - tok = strtok(NULL, "-"); - size += (char *)(void *)strtoul(tok, NULL, 16) - (char*)start_addr1; - } - } - MC_snapshot_add_region(snapshot, 1, start_addr, size); - }else if(!memcmp(basename(lfields[5]), basename(xbt_binary_name), strlen(basename(xbt_binary_name)))){ - tok = strtok(NULL, "-"); - end_addr = (void *)strtoul(tok, NULL, 16); - size = (char*)end_addr - (char*)start_addr; - /* BSS and data segments may be separated according to the OS */ - if((read = xbt_getline(&line, &n, fp)) != -1){ - line[read - 1] = '\0'; - lfields[0] = strtok(line, " "); - for (i = 1; i < 6 && lfields[i - 1] != NULL; i++) { - lfields[i] = strtok(NULL, " "); - } - tok = strtok(lfields[0], "-"); - start_addr1 = (void *)strtoul(tok, NULL, 16); - if(lfields[1][1] == 'w'){ - if(start_addr1 == std_heap){ /* Std_heap ? */ - - }else if(start_addr1 != raw_heap){ - tok = strtok(NULL, "-"); - size += (char *)(void *)strtoul(tok, NULL, 16) - (char *)start_addr1; - } - } - } - MC_snapshot_add_region(snapshot, 2, start_addr, size); - }else if (!memcmp(lfields[5], "[stack]", 7)){ - maestro_stack_start = start_addr; - tok = strtok(NULL, "-"); - maestro_stack_end = (void *)strtoul(tok, NULL, 16); - } - } - } - } - - } - - free(line); - fclose(fp); - + MC_snapshot_add_region(snapshot, 1, mc_libsimgrid_info->start_rw, mc_libsimgrid_info->end_rw - mc_libsimgrid_info->start_rw); + MC_snapshot_add_region(snapshot, 2, mc_binary_info->start_rw, mc_binary_info->end_rw - mc_binary_info->start_rw); } /** @brief Finds the range of the different memory segments and binary paths */ -- 2.20.1