[Gc] Fix for crash in GC_dyld_image_add and some more adjustments
ivmai at mail.ru
Thu Jul 23 08:43:54 PDT 2009
The suggested patch grows from the post by Jim Hourihan <jimhourihan at earthlink.net> reporting a crash in GC_dyld_image_add() when a section size is less than a ptr. Also, his question was about GC_has_static_roots feature on darwin.
In brief, I did the following:
- adjust upper boundary in GC_add_roots_inner/GC_exclude_static_roots() and return in case of an empty region (since, typically these funcs are used passing [base .. base+size) region without ensuring size % ptr_size == 0 && size > 0);
- add an assertion for the lowest bound in GC_add_roots_inner/GC_exclude_static_roots() (the comments in gc.h are updated accordingly);
- rename GC_exclude_static_roots() to GC_exclude_static_roots_inner() and
add exported GC_exclude_static_roots() that gain the lock and call its ..._inner();
- add typedef GC_has_static_roots_func to gc.h (for convenience);
- define GC_register_has_static_roots_callback() (and GC_has_static_roots_func) for all platforms;
- refine the comment for GC_has_static_roots callback.
Note: While GC_register_has_static_roots_callback() is now defined (and exported on every platform), the callback is really used by GC only on few platforms (where USE_PROC_FOR_LIBRARIES is undefined), but Jim Hourihan says he's going to implement the feature for darwin.
The patch is against the current CVS.
* include/gc.h (GC_has_static_roots_func): New typedef (user filter
* include/gc.h (GC_register_has_static_roots_callback): Use
* dyn_load.c (GC_has_static_roots,
* dyn_load.c (GC_has_static_roots,
GC_register_has_static_roots_callback): Define on all platforms.
* dyn_load.c (GC_register_dynlib_callback,
GC_register_dynamic_libraries, GC_init_dyld): Replace K&R-style
functions definition with the ANSI C one.
* dyn_load.c (GC_register_dynlib_callback): Use new local variable
"callback" (initialized from GC_has_static_roots) to minimize data
* dyn_load.c (GC_register_dynamic_libraries_dl_iterate_phdr,
GC_cond_add_roots): Define as STATIC.
* mark_rts.c (GC_remove_roots_inner): Ditto.
* dyn_load.c (GC_dyld_image_add): Don't call GC_add_roots() for
sections smaller than pointer size (just to avoid acquiring the
* dyn_load.c (GC_register_has_static_roots_callback): Put
"callback" value to GC_has_static_roots on all platforms.
* dyn_load.c (GC_has_static_roots): Update the comments.
* include/gc.h (GC_exclude_static_roots, GC_add_roots,
GC_remove_roots, GC_register_has_static_roots_callback): Ditto.
* include/private/gc_priv.h (struct roots): Ditto.
* include/private/gc_priv.h (GC_remove_roots_inner): Move prototype
to mark_rts.c and declare it as STATIC.
* include/private/gc_priv.h (GC_exclude_static_roots_inner): New
* dyn_load.c (GC_register_dynamic_libraries_dl_iterate_phdr): Use
GC_exclude_static_roots_inner() instead of GC_exclude_static_roots.
* misc.c (GC_init_inner): Ditto.
* mark_rts.c (GC_exclude_static_roots_inner): New function (move
all the code from GC_exclude_static_roots(); add the comment.
* mark_rts.c (GC_add_roots_inner, GC_exclude_static_roots_inner):
add alignment assertion for the lower bound; add assertion for the
lower bound to be less than the upper one.
* mark_rts.c (GC_add_roots_inner, GC_exclude_static_roots): Adjust
the upper bound (round down to be of a pointer-aligned value);
return in case of an empty range.
* mark_rts.c (GC_exclude_static_roots): Acquire the lock and call
* mark_rts.c (GC_remove_roots): Quickly check the bounds and return
in case of a do-nothing case (before acquiring the lock).
-------------- next part --------------
A non-text attachment was scrubbed...
Size: 11909 bytes
Desc: not available
Url : https://napali.hpl.hp.com/pipermail/gc/attachments/20090723/ca023f91/koi8-rQdiff1055Fcvs-0001.obj
More information about the Gc