top += size;
}
+ /* Short-circuit the rest of the loop when all of the
+ * found objects aren't moving. This isn't strictly
+ * necessary as the rest of the loop is structured to
+ * work in this case, but GCC 7.2.0 with optimization
+ * greater than 2 generates incorrect code for this...
+ */
+ if (i == AO_SCHEME_NCHUNK) {
+ chunk_low = chunk_high;
+#if DBG_MEM_STATS
+ loops++;
+#endif
+ continue;
+ }
+
/*
* Limit amount of chunk array used in mapping moves
* to the active region
#endif
if (!AO_SCHEME_IS_POOL(addr))
- return 1;
+ return 0;
if (!ao_scheme_print_cleared) {
ao_scheme_print_cleared = 1;
return 0;
}
-int
-ao_scheme_print_mark_poly(ao_poly p)
+void
+ao_scheme_print_clear_addr(void *addr)
{
- uint8_t type = ao_scheme_poly_base_type(p);
+ int offset;
- if (type == AO_SCHEME_INT)
- return 1;
- return ao_scheme_print_mark_addr(ao_scheme_ref(p));
+#if DBG_MEM
+ if (ao_scheme_collecting)
+ ao_scheme_abort();
+#endif
+
+ if (!AO_SCHEME_IS_POOL(addr))
+ return;
+
+ if (!ao_scheme_print_cleared)
+ return;
+ offset = pool_offset(addr);
+ clear(ao_scheme_busy, offset);
}
/* Notes that printing has started */
ao_scheme_printing++;
}
-/* Notes that printing has ended */
-void
+/* Notes that printing has ended. Returns 1 if printing is still going on */
+int
ao_scheme_print_stop(void)
{
ao_scheme_printing--;
- if (ao_scheme_printing == 0)
- ao_scheme_print_cleared = 0;
+ if (ao_scheme_printing != 0)
+ return 1;
+ ao_scheme_print_cleared = 0;
+ return 0;
}