{
lispobj *end = start + n_words;
lispobj *object_ptr;
- sword_t n_words_scavenged;
-
- for (object_ptr = start;
- object_ptr < end;
- object_ptr += n_words_scavenged) {
+ for (object_ptr = start; object_ptr < end;) {
lispobj object = *object_ptr;
#ifdef LISP_FEATURE_GENCGC
if (forwarding_pointer_p(object_ptr))
if (forwarding_pointer_p(ptr)) {
/* Yes, there's a forwarding pointer. */
*object_ptr = LOW_WORD(forwarding_pointer_value(ptr));
- n_words_scavenged = 1;
+ object_ptr++;
} else {
/* Scavenge that pointer. */
- n_words_scavenged =
+ object_ptr +=
(scavtab[widetag_of(object)])(object_ptr, object);
}
} else {
/* It points somewhere other than oldspace. Leave it
* alone. */
- n_words_scavenged = 1;
+ object_ptr++;
}
}
#if !defined(LISP_FEATURE_X86) && !defined(LISP_FEATURE_X86_64)
checking a single word and it's anything other than a
pointer, just hush it up */
int widetag = widetag_of(object);
- n_words_scavenged = 1;
if ((scavtab[widetag] == scav_lose) ||
(((sizetab[widetag])(object_ptr)) > 1)) {
(see manual page for details).\n",
object, object_ptr);
}
+ object_ptr++;
}
#endif
else if (fixnump(object)) {
/* It's a fixnum: really easy.. */
- n_words_scavenged = 1;
+ object_ptr++;
} else {
/* It's some sort of header object or another. */
- n_words_scavenged =
- (scavtab[widetag_of(object)])(object_ptr, object);
+ object_ptr += (scavtab[widetag_of(object)])(object_ptr, object);
}
}
gc_assert_verbose(object_ptr == end, "Final object pointer %p, start %p, end %p\n",
scav_vector (lispobj *where, lispobj object)
{
uword_t kv_length;
- lispobj *kv_vector;
struct hash_table *hash_table;
/* SB-VM:VECTOR-VALID-HASHING-SUBTYPE is set for EQ-based and weak
return 1;
kv_length = fixnum_value(where[1]);
- kv_vector = where + 2; /* Skip the header and length. */
/*FSHOW((stderr,"/kv_length = %d\n", kv_length));*/
/* Scavenge element 0, which may be a hash-table structure. */
* we may even be in a WITHOUT-INTERRUPTS. */
gc_happened = funcall0(StaticSymbolFunction(SUB_GC));
FSHOW((stderr, "/maybe_gc: gc_happened=%s\n",
- (gc_happened == NIL) ? "NIL" : "T"));
- if ((gc_happened != NIL) &&
+ (gc_happened == NIL)
+ ? "NIL"
+ : ((gc_happened == T)
+ ? "T"
+ : "0")));
+ /* gc_happened can take three values: T, NIL, 0.
+ *
+ * T means that the thread managed to trigger a GC, and post-gc
+ * must be called.
+ *
+ * NIL means that the thread is within without-gcing, and no GC
+ * has occurred.
+ *
+ * Finally, 0 means that *a* GC has occurred, but it wasn't
+ * triggered by this thread; success, but post-gc doesn't have
+ * to be called.
+ */
+ if ((gc_happened == T) &&
/* See if interrupts are enabled or it's possible to enable
* them. POST-GC has a similar check, but we don't want to
* unlock deferrables in that case and get a pending interrupt