/* This program is free software; you can redistribute it and/or modify it
* under the terms of the license (GNU LGPL) which comes with this package. */
-#include <stdlib.h>
+#include <cstdlib>
+#include <cstdio>
+#include <cstring>
#include <sys/types.h>
XBT_LOG_NEW_DEFAULT_SUBCATEGORY(mc_memory_map, mc,
"Logging specific to algorithms for memory_map");
-memory_map_t MC_get_memory_map(pid_t pid)
+}
+
+namespace simgrid {
+namespace mc {
+
+std::vector<VmMap> get_memory_map(pid_t pid)
{
/* Open the actual process's proc maps file and create the memory_map_t */
/* to be returned. */
char* path = bprintf("/proc/%i/maps", (int) pid);
- FILE *fp = fopen(path, "r");
- free(path);
+ FILE *fp = std::fopen(path, "r");
if(fp == NULL)
- perror("fopen failed");
+ std::perror("fopen failed");
xbt_assert(fp,
"Cannot open %s to investigate the memory map of the process.", path);
+ free(path);
setbuf(fp, NULL);
- memory_map_t ret = xbt_new0(s_memory_map_t, 1);
+ std::vector<VmMap> ret;
/* Read one line at the time, parse it and add it to the memory map to be returned */
ssize_t read; /* Number of bytes readed */
char* line = NULL;
- size_t n = 0; /* Amount of bytes to read by xbt_getline */
+ std::size_t n = 0; /* Amount of bytes to read by xbt_getline */
while ((read = xbt_getline(&line, &n, fp)) != -1) {
//fprintf(stderr,"%s", line);
int i;
for (i = 1; i < 6 && lfields[i - 1] != NULL; i++) {
- lfields[i] = strtok(NULL, " ");
+ lfields[i] = std::strtok(NULL, " ");
}
/* Check to see if we got the expected amount of columns */
/* Ok we are good enough to try to get the info we need */
/* First get the start and the end address of the map */
- char *tok = strtok(lfields[0], "-");
+ char *tok = std::strtok(lfields[0], "-");
if (tok == NULL)
xbt_abort();
- s_map_region_t memreg; /* temporal map region used for creating the map */
+ VmMap memreg;
char *endptr;
- memreg.start_addr = (void *) strtoul(tok, &endptr, 16);
+ memreg.start_addr = std::strtoull(tok, &endptr, 16);
/* Make sure that the entire string was an hex number */
if (*endptr != '\0')
xbt_abort();
- tok = strtok(NULL, "-");
+ tok = std::strtok(NULL, "-");
if (tok == NULL)
xbt_abort();
- memreg.end_addr = (void *) strtoul(tok, &endptr, 16);
+ memreg.end_addr = std::strtoull(tok, &endptr, 16);
/* Make sure that the entire string was an hex number */
if (*endptr != '\0')
xbt_abort();
/* Get the permissions flags */
- if (strlen(lfields[1]) < 4)
+ if (std::strlen(lfields[1]) < 4)
xbt_abort();
memreg.prot = 0;
memreg.flags |= MAP_SHARED;
/* Get the offset value */
- memreg.offset = (void *) strtoul(lfields[2], &endptr, 16);
+ memreg.offset = std::strtoull(lfields[2], &endptr, 16);
/* Make sure that the entire string was an hex number */
if (*endptr != '\0')
xbt_abort();
/* Get the device major:minor bytes */
- tok = strtok(lfields[3], ":");
+ tok = std::strtok(lfields[3], ":");
if (tok == NULL)
xbt_abort();
if (*endptr != '\0')
xbt_abort();
- tok = strtok(NULL, ":");
+ tok = std::strtok(NULL, ":");
if (tok == NULL)
xbt_abort();
- memreg.dev_minor = (char) strtoul(tok, &endptr, 16);
+ memreg.dev_minor = (char) std::strtoul(tok, &endptr, 16);
/* Make sure that the entire string was an hex number */
if (*endptr != '\0')
xbt_abort();
xbt_abort();
/* And finally get the pathname */
- memreg.pathname = xbt_strdup(lfields[5]);
+ if (lfields[5])
+ memreg.pathname = lfields[5];
/* Create space for a new map region in the region's array and copy the */
/* parsed stuff from the temporal memreg variable */
XBT_DEBUG("Found region for %s",
- memreg.pathname ? memreg.pathname : "(null)");
- ret->regions = (map_region_t)
- xbt_realloc(ret->regions, sizeof(memreg) * (ret->mapsize + 1));
- memcpy(ret->regions + ret->mapsize, &memreg, sizeof(memreg));
- ret->mapsize++;
+ !memreg.pathname.empty() ? memreg.pathname.c_str() : "(null)");
+ ret.push_back(std::move(memreg));
}
- free(line);
- fclose(fp);
- return ret;
+ std::free(line);
+ std::fclose(fp);
+ return std::move(ret);
}
-void MC_free_memory_map(memory_map_t map){
-
- int i;
- for(i=0; i< map->mapsize; i++){
- xbt_free(map->regions[i].pathname);
- }
- xbt_free(map->regions);
- xbt_free(map);
}
-
}