summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--dyn_load.c14
-rw-r--r--include/private/gc_priv.h10
-rw-r--r--os_dep.c75
3 files changed, 47 insertions, 52 deletions
diff --git a/dyn_load.c b/dyn_load.c
index 0dc03be5..6e159799 100644
--- a/dyn_load.c
+++ b/dyn_load.c
@@ -305,10 +305,9 @@ static void sort_heap_sects(struct HeapSect *base, size_t number_of_elements)
}
}
-STATIC void GC_register_map_entries(char *maps)
+STATIC void GC_register_map_entries(const char *maps)
{
- char *prot;
- char *buf_ptr = maps;
+ const char *prot;
ptr_t start, end;
unsigned int maj_dev;
ptr_t least_ha, greatest_ha;
@@ -321,10 +320,9 @@ STATIC void GC_register_map_entries(char *maps)
+ GC_our_memory[GC_n_memory-1].hs_bytes;
for (;;) {
- buf_ptr = GC_parse_map_entry(buf_ptr, &start, &end, &prot,
- &maj_dev, 0);
- if (NULL == buf_ptr)
- break;
+ maps = GC_parse_map_entry(maps, &start, &end, &prot, &maj_dev, 0);
+ if (NULL == maps) break;
+
if (prot[1] == 'w') {
/* This is a writable mapping. Add it to */
/* the root set unless it is already otherwise */
@@ -399,7 +397,7 @@ STATIC void GC_register_map_entries(char *maps)
GC_INNER void GC_register_dynamic_libraries(void)
{
- char *maps = GC_get_maps();
+ const char *maps = GC_get_maps();
if (NULL == maps)
ABORT("Failed to read /proc for library registration");
diff --git a/include/private/gc_priv.h b/include/private/gc_priv.h
index 42a5b8e6..447841bf 100644
--- a/include/private/gc_priv.h
+++ b/include/private/gc_priv.h
@@ -2680,15 +2680,17 @@ GC_INNER void *GC_store_debug_info_inner(void *p, word sz, const char *str,
#ifdef NEED_PROC_MAPS
# if defined(DYNAMIC_LOADING) && defined(USE_PROC_FOR_LIBRARIES)
- GC_INNER char *GC_parse_map_entry(char *buf_ptr, ptr_t *start, ptr_t *end,
- char **prot, unsigned int *maj_dev,
- char **mapping_name);
+ GC_INNER const char *GC_parse_map_entry(const char *maps_ptr,
+ ptr_t *start, ptr_t *end,
+ const char **prot,
+ unsigned *maj_dev,
+ const char **mapping_name);
# endif
# if defined(IA64) || defined(INCLUDE_LINUX_THREAD_DESCR)
GC_INNER GC_bool GC_enclosing_mapping(ptr_t addr,
ptr_t *startp, ptr_t *endp);
# endif
- GC_INNER char *GC_get_maps(void); /* from os_dep.c */
+ GC_INNER const char *GC_get_maps(void);
#endif /* NEED_PROC_MAPS */
#ifdef GC_ASSERTIONS
diff --git a/os_dep.c b/os_dep.c
index efb3e757..c7a15bc8 100644
--- a/os_dep.c
+++ b/os_dep.c
@@ -158,7 +158,7 @@ STATIC ssize_t GC_repeat_read(int fd, char *buf, size_t count)
/* space. Return the address of the buffer, or zero on failure. */
/* This code could be simplified if we could determine its size ahead */
/* of time. */
-GC_INNER char * GC_get_maps(void)
+GC_INNER const char * GC_get_maps(void)
{
ssize_t result;
static char *maps_buf = NULL;
@@ -264,40 +264,41 @@ GC_INNER char * GC_get_maps(void)
* anywhere, which is safer anyway.
*/
-/* Assign various fields of the first line in buf_ptr to (*start), */
+/* Assign various fields of the first line in maps_ptr to (*start), */
/* (*end), (*prot), (*maj_dev) and (*mapping_name). mapping_name may */
/* be NULL. (*prot) and (*mapping_name) are assigned pointers into the */
/* original buffer. */
#if (defined(DYNAMIC_LOADING) && defined(USE_PROC_FOR_LIBRARIES)) \
|| defined(IA64) || defined(INCLUDE_LINUX_THREAD_DESCR) \
|| defined(REDIRECT_MALLOC)
- GC_INNER char *GC_parse_map_entry(char *buf_ptr, ptr_t *start, ptr_t *end,
- char **prot, unsigned int *maj_dev,
- char **mapping_name)
+ GC_INNER const char *GC_parse_map_entry(const char *maps_ptr,
+ ptr_t *start, ptr_t *end,
+ const char **prot, unsigned *maj_dev,
+ const char **mapping_name)
{
- unsigned char *start_start, *end_start, *maj_dev_start;
- unsigned char *p; /* unsigned for isspace, isxdigit */
+ const unsigned char *start_start, *end_start, *maj_dev_start;
+ const unsigned char *p; /* unsigned for isspace, isxdigit */
- if (buf_ptr == NULL || *buf_ptr == '\0') {
+ if (maps_ptr == NULL || *maps_ptr == '\0') {
return NULL;
}
- p = (unsigned char *)buf_ptr;
+ p = (const unsigned char *)maps_ptr;
while (isspace(*p)) ++p;
start_start = p;
GC_ASSERT(isxdigit(*start_start));
- *start = (ptr_t)strtoul((char *)start_start, (char **)&p, 16);
+ *start = (ptr_t)strtoul((const char *)start_start, (char **)&p, 16);
GC_ASSERT(*p=='-');
++p;
end_start = p;
GC_ASSERT(isxdigit(*end_start));
- *end = (ptr_t)strtoul((char *)end_start, (char **)&p, 16);
+ *end = (ptr_t)strtoul((const char *)end_start, (char **)&p, 16);
GC_ASSERT(isspace(*p));
while (isspace(*p)) ++p;
GC_ASSERT(*p == 'r' || *p == '-');
- *prot = (char *)p;
+ *prot = (const char *)p;
/* Skip past protection field to offset field */
while (!isspace(*p)) ++p;
while (isspace(*p)) p++;
@@ -307,16 +308,14 @@ GC_INNER char * GC_get_maps(void)
while (isspace(*p)) p++;
maj_dev_start = p;
GC_ASSERT(isxdigit(*maj_dev_start));
- *maj_dev = strtoul((char *)maj_dev_start, NULL, 16);
+ *maj_dev = strtoul((const char *)maj_dev_start, NULL, 16);
- if (mapping_name == 0) {
- while (*p && *p++ != '\n');
- } else {
+ if (mapping_name != NULL) {
while (*p && *p != '\n' && *p != '/' && *p != '[') p++;
- *mapping_name = (char *)p;
- while (*p && *p++ != '\n');
+ *mapping_name = (const char *)p;
}
- return (char *)p;
+ while (*p && *p++ != '\n');
+ return (const char *)p;
}
#endif /* REDIRECT_MALLOC || DYNAMIC_LOADING || IA64 || ... */
@@ -328,24 +327,22 @@ GC_INNER char * GC_get_maps(void)
GC_INNER GC_bool GC_enclosing_mapping(ptr_t addr, ptr_t *startp,
ptr_t *endp)
{
- char *prot;
+ const char *prot;
ptr_t my_start, my_end;
unsigned int maj_dev;
- char *maps = GC_get_maps();
- char *buf_ptr = maps;
+ const char *maps_ptr = GC_get_maps();
- if (0 == maps) return(FALSE);
+ if (NULL == maps_ptr) return FALSE;
for (;;) {
- buf_ptr = GC_parse_map_entry(buf_ptr, &my_start, &my_end,
- &prot, &maj_dev, 0);
+ maps_ptr = GC_parse_map_entry(maps_ptr, &my_start, &my_end,
+ &prot, &maj_dev, 0);
+ if (NULL == maps_ptr) break;
- if (buf_ptr == NULL) return FALSE;
- if (prot[1] == 'w' && maj_dev == 0) {
- if ((word)my_end > (word)addr && (word)my_start <= (word)addr) {
+ if (prot[1] == 'w' && maj_dev == 0
+ && (word)my_end > (word)addr && (word)my_start <= (word)addr) {
*startp = my_start;
*endp = my_end;
return TRUE;
- }
}
}
return FALSE;
@@ -358,21 +355,20 @@ GC_INNER char * GC_get_maps(void)
GC_INNER GC_bool GC_text_mapping(char *nm, ptr_t *startp, ptr_t *endp)
{
size_t nm_len = strlen(nm);
- char *prot;
- char *map_path;
+ const char *prot, *map_path;
ptr_t my_start, my_end;
unsigned int maj_dev;
- char *maps = GC_get_maps();
- char *buf_ptr = maps;
+ const char *maps_ptr = GC_get_maps();
- if (0 == maps) return(FALSE);
+ if (NULL == maps_ptr) return FALSE;
for (;;) {
- buf_ptr = GC_parse_map_entry(buf_ptr, &my_start, &my_end,
- &prot, &maj_dev, &map_path);
+ maps_ptr = GC_parse_map_entry(maps_ptr, &my_start, &my_end,
+ &prot, &maj_dev, &map_path);
+ if (NULL == maps_ptr) break;
- if (buf_ptr == NULL) return FALSE;
if (prot[0] == 'r' && prot[1] == '-' && prot[2] == 'x') {
- char *p = map_path;
+ const char *p = map_path;
+
/* Set p to point just past last slash, if any. */
while (*p != '\0' && *p != '\n' && *p != ' ' && *p != '\t') ++p;
while (*p != '/' && (word)p >= (word)map_path) --p;
@@ -4906,10 +4902,9 @@ GC_INNER void GC_print_callers(struct callinfo info[NFRAMES])
/* addresses in FIND_LEAK output. */
void GC_print_address_map(void)
{
- char *maps;
+ const char *maps = GC_get_maps();
GC_err_printf("---------- Begin address map ----------\n");
- maps = GC_get_maps();
GC_err_puts(maps != NULL ? maps : "Failed to get map!\n");
GC_err_printf("---------- End address map ----------\n");
}