diff options
author | Andy Wingo <wingo@pobox.com> | 2017-02-16 10:38:15 +0100 |
---|---|---|
committer | Andy Wingo <wingo@pobox.com> | 2017-02-16 10:38:15 +0100 |
commit | cd3ff33a31c51612f2247bdb15ecbe92d7da1310 (patch) | |
tree | 92f595464a9faabf2d2a4d075c359e7905ca8f3b /libguile/cache-internal.h | |
parent | 4706d6982457498c60e575a026229e03820381d3 (diff) | |
download | guile-cd3ff33a31c51612f2247bdb15ecbe92d7da1310.tar.gz |
Cheaper fluid-ref cache
* libguile/cache-internal.h (struct scm_cache_entry): Add needs_flush
member.
(scm_cache_evict_1): Clear needs_flush on newly evicted entry.
(scm_cache_insert): Propagate needs_flush to new entry.
* libguile/fluids.c (restore_dynamic_state): Mark all restored entries
as needing a flush.
(save_dynamic_state): Only cons on "needs_flush" entries to the
resulting dynamic state. The result is the same as before but
avoiding the refq on the weak table.
(fluid_set_x): Propagate needs_flush down to the cache.
(fluid_ref): When adding entry to cache, use needs_flush==0.
(scm_fluid_set_x, scm_fluid_unset_x, scm_swap_fluid, swap_fluid): Use
needs_flush==1.
Diffstat (limited to 'libguile/cache-internal.h')
-rw-r--r-- | libguile/cache-internal.h | 6 |
1 files changed, 5 insertions, 1 deletions
diff --git a/libguile/cache-internal.h b/libguile/cache-internal.h index fc1e3c139..88bb24af0 100644 --- a/libguile/cache-internal.h +++ b/libguile/cache-internal.h @@ -37,6 +37,7 @@ struct scm_cache_entry { scm_t_bits key; scm_t_bits value; + int needs_flush; }; #define SCM_CACHE_SIZE 8 @@ -73,6 +74,7 @@ scm_cache_evict_1 (struct scm_cache *cache, struct scm_cache_entry *evicted) sizeof (cache->entries[0]) * idx); cache->entries[0].key = 0; cache->entries[0].value = 0; + cache->entries[0].needs_flush = 0; } static inline struct scm_cache_entry* @@ -89,7 +91,7 @@ scm_cache_lookup (struct scm_cache *cache, SCM k) static inline void scm_cache_insert (struct scm_cache *cache, SCM k, SCM v, - struct scm_cache_entry *evicted) + struct scm_cache_entry *evicted, int needs_flush) { struct scm_cache_entry *entry; @@ -99,6 +101,7 @@ scm_cache_insert (struct scm_cache *cache, SCM k, SCM v, if (entry->key == SCM_UNPACK (k)) { entry->value = SCM_UNPACK (v); + entry->needs_flush = needs_flush; return; } memmove (cache->entries, @@ -106,6 +109,7 @@ scm_cache_insert (struct scm_cache *cache, SCM k, SCM v, (entry - cache->entries) * sizeof (*entry)); entry->key = SCM_UNPACK (k); entry->value = SCM_UNPACK (v); + entry->needs_flush = needs_flush; } #endif /* SCM_CACHE_INTERNAL_H */ |