diff options
author | ivmai <ivmai> | 2011-03-13 13:08:16 +0000 |
---|---|---|
committer | Ivan Maidanski <ivmai@mail.ru> | 2011-07-26 21:06:56 +0400 |
commit | 667fb0512a70f7756a2c64f0e71c03e1e49a8a4c (patch) | |
tree | 67a5fa56f2df6166f717bb634e2370db9091b73f /dbg_mlc.c | |
parent | 35260b7ff2dc15a5194758ab6f3c73fbfb40acb3 (diff) | |
download | bdwgc-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.c | 32 |
1 files changed, 19 insertions, 13 deletions
@@ -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); } |