summaryrefslogtreecommitdiff
path: root/reclaim.c
diff options
context:
space:
mode:
Diffstat (limited to 'reclaim.c')
-rw-r--r--reclaim.c61
1 files changed, 34 insertions, 27 deletions
diff --git a/reclaim.c b/reclaim.c
index 0685f937..4f40cbb4 100644
--- a/reclaim.c
+++ b/reclaim.c
@@ -773,38 +773,45 @@ GC_INNER GC_bool GC_reclaim_all(GC_stop_func stop_func, GC_bool ignore_old)
}
#endif /* !EAGER_SWEEP && ENABLE_DISCLAIM */
-STATIC void GC_mercury_do_enumerate_reachable_objects(struct hblk *hbp,
- word dummy)
+struct enumerate_reachable_s {
+ GC_reachable_object_proc proc;
+ void *client_data;
+};
+
+STATIC void GC_do_enumerate_reachable_objects(struct hblk *hbp, word ped)
{
- struct hblkhdr * hhdr = HDR(hbp);
- size_t sz = hhdr -> hb_sz;
- size_t bit_no;
- char *p, *plim;
+ struct hblkhdr *hhdr = HDR(hbp);
+ size_t sz = hhdr -> hb_sz;
+ size_t bit_no;
+ char *p, *plim;
- if (GC_block_empty(hhdr)) {
- return;
- }
+ if (GC_block_empty(hhdr)) {
+ return;
+ }
- p = hbp->hb_body;
- bit_no = 0;
- if (sz > MAXOBJBYTES) { /* one big object */
- plim = p;
- } else {
- plim = hbp->hb_body + HBLKSIZE - sz;
- }
- /* Go through all words in block. */
- while (p <= plim) {
- if (mark_bit_from_hdr(hhdr, bit_no)) {
- GC_mercury_callback_reachable_object((GC_word *)p,
- BYTES_TO_WORDS(sz));
- }
- bit_no += MARK_BIT_OFFSET(sz);
- p += sz;
+ p = hbp->hb_body;
+ if (sz > MAXOBJBYTES) { /* one big object */
+ plim = p;
+ } else {
+ plim = hbp->hb_body + HBLKSIZE - sz;
+ }
+ /* Go through all words in block. */
+ for (bit_no = 0; p <= plim; bit_no += MARK_BIT_OFFSET(sz), p += sz) {
+ if (mark_bit_from_hdr(hhdr, bit_no)) {
+ ((struct enumerate_reachable_s *)ped)->proc(p, sz,
+ ((struct enumerate_reachable_s *)ped)->client_data);
}
+ }
}
-GC_INNER void GC_mercury_enumerate_reachable_objects(void)
+GC_API void GC_CALL GC_enumerate_reachable_objects_inner(
+ GC_reachable_object_proc proc,
+ void *client_data)
{
- GC_ASSERT(GC_mercury_callback_reachable_object);
- GC_apply_to_all_blocks(GC_mercury_do_enumerate_reachable_objects, (word)0);
+ struct enumerate_reachable_s ed;
+
+ GC_ASSERT(I_HOLD_LOCK());
+ ed.proc = proc;
+ ed.client_data = client_data;
+ GC_apply_to_all_blocks(GC_do_enumerate_reachable_objects, (word)&ed);
}