summaryrefslogtreecommitdiff
path: root/dbg_mlc.c
diff options
context:
space:
mode:
authorivmai <ivmai>2011-03-13 13:08:16 +0000
committerIvan Maidanski <ivmai@mail.ru>2011-07-26 21:06:56 +0400
commit667fb0512a70f7756a2c64f0e71c03e1e49a8a4c (patch)
tree67a5fa56f2df6166f717bb634e2370db9091b73f /dbg_mlc.c
parent35260b7ff2dc15a5194758ab6f3c73fbfb40acb3 (diff)
downloadbdwgc-667fb0512a70f7756a2c64f0e71c03e1e49a8a4c.tar.gz
2011-03-13 Ivan Maidanski <ivmai@mail.ru>
* dbg_mlc.c (GC_make_closure): Fix SEGV in case GC_malloc returns NULL. * dbg_mlc.c (GC_debug_register_finalizer, GC_debug_register_finalizer_no_order, GC_debug_register_finalizer_unreachable, GC_debug_register_finalizer_ignore_self): Handle out of memory case properly (similar to GC_register_finalizer_inner). * headers.c (GC_install_header): Handle the case when alloc_hdr() returns NULL. * os_dep.c (GC_get_maps_len): Defend against missing "maps" file. * pthread_support.c (GC_mark_thread): Place a dummy return statement (which uses "id" argument) before the actual use of "id" as an array index (to suppress a warning produced by some static code analysis tools). * win32_threads.c (GC_mark_thread): Ditto. * pthread_support.c (GC_thr_init): Abort (with the appropriate message) if out of memory.
Diffstat (limited to 'dbg_mlc.c')
-rw-r--r--dbg_mlc.c32
1 files changed, 19 insertions, 13 deletions
diff --git a/dbg_mlc.c b/dbg_mlc.c
index 1de97ff8..29e9a898 100644
--- a/dbg_mlc.c
+++ b/dbg_mlc.c
@@ -96,7 +96,7 @@ GC_API void GC_CALL GC_register_finalizer_no_order(void * obj,
/* Returns 1 on success, 0 if source couldn't be determined. */
/* Dest can be any address within a heap object. */
GC_API GC_ref_kind GC_CALL GC_get_back_ptr_info(void *dest, void **base_p,
- size_t *offset_p)
+ size_t *offset_p)
{
oh * hdr = (oh *)GC_base(dest);
ptr_t bp;
@@ -774,8 +774,8 @@ GC_API void GC_CALL GC_debug_free(void * p)
ptr_t base = GC_base(p);
GC_ASSERT((ptr_t)p - (ptr_t)base == sizeof(oh));
# ifndef SHORT_DBG_HDRS
- /* Invalidate size */
- ((oh *)base) -> oh_sz = GC_size(base);
+ /* Invalidate size */
+ ((oh *)base) -> oh_sz = GC_size(base);
# endif
GC_free_inner(base);
}
@@ -939,9 +939,10 @@ STATIC void * GC_make_closure(GC_finalization_proc fn, void * data)
# else
(struct closure *) GC_malloc(sizeof (struct closure));
# endif
-
- result -> cl_fn = fn;
- result -> cl_data = data;
+ if (result != 0) {
+ result -> cl_fn = fn;
+ result -> cl_data = data;
+ }
return((void *)result);
}
@@ -1002,8 +1003,10 @@ GC_API void GC_CALL GC_debug_register_finalizer(void * obj,
if (0 == fn) {
GC_register_finalizer(base, 0, 0, &my_old_fn, &my_old_cd);
} else {
+ cd = GC_make_closure(fn, cd);
+ if (cd == 0) return; /* out of memory */
GC_register_finalizer(base, GC_debug_invoke_finalizer,
- GC_make_closure(fn,cd), &my_old_fn, &my_old_cd);
+ cd, &my_old_fn, &my_old_cd);
}
store_old(obj, my_old_fn, (struct closure *)my_old_cd, ofn, ocd);
}
@@ -1031,9 +1034,10 @@ GC_API void GC_CALL GC_debug_register_finalizer_no_order
if (0 == fn) {
GC_register_finalizer_no_order(base, 0, 0, &my_old_fn, &my_old_cd);
} else {
+ cd = GC_make_closure(fn, cd);
+ if (cd == 0) return; /* out of memory */
GC_register_finalizer_no_order(base, GC_debug_invoke_finalizer,
- GC_make_closure(fn,cd), &my_old_fn,
- &my_old_cd);
+ cd, &my_old_fn, &my_old_cd);
}
store_old(obj, my_old_fn, (struct closure *)my_old_cd, ofn, ocd);
}
@@ -1061,9 +1065,10 @@ GC_API void GC_CALL GC_debug_register_finalizer_unreachable
if (0 == fn) {
GC_register_finalizer_unreachable(base, 0, 0, &my_old_fn, &my_old_cd);
} else {
+ cd = GC_make_closure(fn, cd);
+ if (cd == 0) return; /* out of memory */
GC_register_finalizer_unreachable(base, GC_debug_invoke_finalizer,
- GC_make_closure(fn,cd), &my_old_fn,
- &my_old_cd);
+ cd, &my_old_fn, &my_old_cd);
}
store_old(obj, my_old_fn, (struct closure *)my_old_cd, ofn, ocd);
}
@@ -1090,9 +1095,10 @@ GC_API void GC_CALL GC_debug_register_finalizer_ignore_self
if (0 == fn) {
GC_register_finalizer_ignore_self(base, 0, 0, &my_old_fn, &my_old_cd);
} else {
+ cd = GC_make_closure(fn, cd);
+ if (cd == 0) return; /* out of memory */
GC_register_finalizer_ignore_self(base, GC_debug_invoke_finalizer,
- GC_make_closure(fn,cd), &my_old_fn,
- &my_old_cd);
+ cd, &my_old_fn, &my_old_cd);
}
store_old(obj, my_old_fn, (struct closure *)my_old_cd, ofn, ocd);
}