+2010-02-22 Zoltan Varga <vargaz@gmail.com>
+
+ * obj_map.c (GC_add_map_entry): Speed this up for the common case where
+ GC_register_displacement () was never called.
+
2010-01-29 Geoff Norton <gnorton@novell.com>
* include/private/gcconfig.h: Don't define NO_PTHREAD_TRYLOCK on darwin-x86
# define MAP_SIZE MAP_ENTRIES
# define CPP_MAX_OFFSET (OFFSET_TOO_BIG - 1)
# define MAX_OFFSET ((word)CPP_MAX_OFFSET)
+# define INIT_MAP(map) memset((map), OBJ_INVALID, MAP_SIZE)
/* The following are used only if GC_all_interior_ptrs != 0 */
# define VALID_OFFSET_SZ \
(CPP_MAX_OFFSET > WORDS_TO_BYTES(CPP_MAXOBJSZ)? \
# include "private/gc_priv.h"
map_entry_type * GC_invalid_map = 0;
+static max_valid_offset = 0;
/* Invalidate the object map associated with a block. Free blocks */
/* are identified by invalid maps. */
if (!GC_valid_offsets[offset]) {
GC_valid_offsets[offset] = TRUE;
GC_modws_valid_offsets[offset % sizeof(word)] = TRUE;
+ if (offset > max_valid_offset)
+ max_valid_offset = offset;
if (!GC_all_interior_pointers) {
for (i = 0; i <= MAXOBJSZ; i++) {
if (GC_obj_map[i] != 0) {
# ifdef PRINTSTATS
GC_printf1("Adding block map for size %lu\n", (unsigned long)sz);
# endif
- for (displ = 0; displ < HBLKSIZE; displ++) {
- MAP_ENTRY(new_map,displ) = OBJ_INVALID;
- }
+ INIT_MAP(new_map);
if (sz == 0) {
- for(displ = 0; displ <= HBLKSIZE; displ++) {
+ for(displ = 0; displ <= max_valid_offset; displ++) {
if (OFFSET_VALID(displ)) {
map_entry = BYTES_TO_WORDS(displ);
if (map_entry > MAX_OFFSET) map_entry = OFFSET_TOO_BIG;
for (obj_start = 0;
obj_start + WORDS_TO_BYTES(sz) <= HBLKSIZE;
obj_start += WORDS_TO_BYTES(sz)) {
- for (displ = 0; displ < WORDS_TO_BYTES(sz); displ++) {
+ for (displ = 0; displ <= max_valid_offset; displ++) {
if (OFFSET_VALID(displ)) {
map_entry = BYTES_TO_WORDS(displ);
if (map_entry > MAX_OFFSET) map_entry = OFFSET_TOO_BIG;