summaryrefslogtreecommitdiff
path: root/libguile/weak-table.c
diff options
context:
space:
mode:
authorAndy Wingo <wingo@pobox.com>2017-10-31 09:10:55 +0100
committerAndy Wingo <wingo@pobox.com>2017-11-01 09:46:03 +0100
commitd01addeb1feba830ddd703e27f89576864a063ff (patch)
tree7b3d59043c610ef2591fc41411e340df761cc56f /libguile/weak-table.c
parenta053c0510c4a644f9453166b7b385cf30f6d3a21 (diff)
downloadguile-d01addeb1feba830ddd703e27f89576864a063ff.tar.gz
Refactor weak table to use bitmaps for weak entries
Diffstat (limited to 'libguile/weak-table.c')
-rw-r--r--libguile/weak-table.c107
1 files changed, 25 insertions, 82 deletions
diff --git a/libguile/weak-table.c b/libguile/weak-table.c
index ff8a01fb0..fab98149f 100644
--- a/libguile/weak-table.c
+++ b/libguile/weak-table.c
@@ -25,7 +25,7 @@
#include <assert.h>
#include "libguile/bdw-gc.h"
-#include <gc/gc_mark.h>
+#include <gc/gc_typed.h>
#include "libguile/_scm.h"
#include "libguile/hash.h"
@@ -152,70 +152,10 @@ typedef struct {
-/* The GC "kinds" for singly-weak tables. */
-static int weak_key_gc_kind;
-static int weak_value_gc_kind;
-static int doubly_weak_gc_kind;
-
-static struct GC_ms_entry *
-mark_weak_key_entry (GC_word *addr, struct GC_ms_entry *mark_stack_ptr,
- struct GC_ms_entry *mark_stack_limit, GC_word env)
-{
- scm_t_weak_entry *entry = (scm_t_weak_entry*) addr;
-
- if (entry->next)
- mark_stack_ptr = GC_MARK_AND_PUSH ((GC_word*) entry->next,
- mark_stack_ptr, mark_stack_limit,
- NULL);
-
- if (entry->hash && entry->key)
- {
- SCM value = SCM_PACK (entry->value);
- if (SCM_HEAP_OBJECT_P (value))
- mark_stack_ptr = GC_MARK_AND_PUSH ((GC_word*) SCM2PTR (value),
- mark_stack_ptr, mark_stack_limit,
- NULL);
- }
-
- return mark_stack_ptr;
-}
-
-static struct GC_ms_entry *
-mark_weak_value_entry (GC_word *addr, struct GC_ms_entry *mark_stack_ptr,
- struct GC_ms_entry *mark_stack_limit, GC_word env)
-{
- scm_t_weak_entry *entry = (scm_t_weak_entry*) addr;
-
- if (entry->next)
- mark_stack_ptr = GC_MARK_AND_PUSH ((GC_word*) entry->next,
- mark_stack_ptr, mark_stack_limit,
- NULL);
-
- if (entry->hash && entry->value)
- {
- SCM key = SCM_PACK (entry->key);
- if (SCM_HEAP_OBJECT_P (key))
- mark_stack_ptr = GC_MARK_AND_PUSH ((GC_word*) SCM2PTR (key),
- mark_stack_ptr, mark_stack_limit,
- NULL);
- }
-
- return mark_stack_ptr;
-}
-
-static struct GC_ms_entry *
-mark_doubly_weak_entry (GC_word *addr, struct GC_ms_entry *mark_stack_ptr,
- struct GC_ms_entry *mark_stack_limit, GC_word env)
-{
- scm_t_weak_entry *entry = (scm_t_weak_entry*) addr;
-
- if (entry->next)
- mark_stack_ptr = GC_MARK_AND_PUSH ((GC_word*) entry->next,
- mark_stack_ptr, mark_stack_limit,
- NULL);
-
- return mark_stack_ptr;
-}
+/* GC descriptors for the various kinds of scm_t_weak_entry. */
+static GC_descr weak_key_descr;
+static GC_descr weak_value_descr;
+static GC_descr doubly_weak_descr;
static scm_t_weak_entry *
allocate_entry (scm_t_weak_table_kind kind)
@@ -225,20 +165,18 @@ allocate_entry (scm_t_weak_table_kind kind)
switch (kind)
{
case SCM_WEAK_TABLE_KIND_KEY:
- ret = GC_generic_malloc (sizeof (*ret), weak_key_gc_kind);
+ ret = GC_malloc_explicitly_typed (sizeof (*ret), weak_key_descr);
break;
case SCM_WEAK_TABLE_KIND_VALUE:
- ret = GC_generic_malloc (sizeof (*ret), weak_value_gc_kind);
+ ret = GC_malloc_explicitly_typed (sizeof (*ret), weak_value_descr);
break;
case SCM_WEAK_TABLE_KIND_BOTH:
- ret = GC_generic_malloc (sizeof (*ret), doubly_weak_gc_kind);
+ ret = GC_malloc_explicitly_typed (sizeof (*ret), doubly_weak_descr);
break;
default:
abort ();
}
- memset (ret, 0, sizeof (*ret));
-
return ret;
}
@@ -852,18 +790,23 @@ SCM_DEFINE (scm_doubly_weak_hash_table_p, "doubly-weak-hash-table?", 1, 0, 0,
void
scm_weak_table_prehistory (void)
{
- weak_key_gc_kind =
- GC_new_kind (GC_new_free_list (),
- GC_MAKE_PROC (GC_new_proc (mark_weak_key_entry), 0),
- 0, 0);
- weak_value_gc_kind =
- GC_new_kind (GC_new_free_list (),
- GC_MAKE_PROC (GC_new_proc (mark_weak_value_entry), 0),
- 0, 0);
- doubly_weak_gc_kind =
- GC_new_kind (GC_new_free_list (),
- GC_MAKE_PROC (GC_new_proc (mark_doubly_weak_entry), 0),
- 0, 0);
+ GC_word weak_key_bitmap[GC_BITMAP_SIZE (scm_t_weak_entry)] = { 0 };
+ GC_word weak_value_bitmap[GC_BITMAP_SIZE (scm_t_weak_entry)] = { 0 };
+ GC_word doubly_weak_bitmap[GC_BITMAP_SIZE (scm_t_weak_entry)] = { 0 };
+
+ GC_set_bit (weak_key_bitmap, GC_WORD_OFFSET (scm_t_weak_entry, next));
+ GC_set_bit (weak_value_bitmap, GC_WORD_OFFSET (scm_t_weak_entry, next));
+ GC_set_bit (doubly_weak_bitmap, GC_WORD_OFFSET (scm_t_weak_entry, next));
+
+ GC_set_bit (weak_key_bitmap, GC_WORD_OFFSET (scm_t_weak_entry, value));
+ GC_set_bit (weak_value_bitmap, GC_WORD_OFFSET (scm_t_weak_entry, key));
+
+ weak_key_descr = GC_make_descriptor (weak_key_bitmap,
+ GC_WORD_LEN (scm_t_weak_entry));
+ weak_value_descr = GC_make_descriptor (weak_value_bitmap,
+ GC_WORD_LEN (scm_t_weak_entry));
+ doubly_weak_descr = GC_make_descriptor (doubly_weak_bitmap,
+ GC_WORD_LEN (scm_t_weak_entry));
}
void