cs: simplify mutable hash table iteration
Remove some complexity that originally handled `eq?` unreliability on flonums, which is no longer needed.
This commit is contained in:
parent
2fcdd7c292
commit
8b3fd15803
|
@ -607,23 +607,16 @@
|
||||||
(lock-release (locked-iterable-hash-lock ht))
|
(lock-release (locked-iterable-hash-lock ht))
|
||||||
vec]
|
vec]
|
||||||
[else
|
[else
|
||||||
(let ([weak? (locked-iterable-hash-weak? ht)]
|
(let ([new-vec (get-locked-iterable-hash-cells
|
||||||
[new-vec (get-locked-iterable-hash-cells
|
|
||||||
ht
|
ht
|
||||||
(fxmax (if vec
|
(fxmax (if vec
|
||||||
(fx* 2 (#%vector-length vec))
|
(fx* 2 (#%vector-length vec))
|
||||||
0)
|
0)
|
||||||
32))])
|
32))])
|
||||||
(let ([len (#%vector-length new-vec)])
|
(let ([len (#%vector-length new-vec)])
|
||||||
(when (fx= len (hash-count ht))
|
(when (fx= len (hash-count ht))<
|
||||||
(set-locked-iterable-hash-retry?! ht #f))
|
(set-locked-iterable-hash-retry?! ht #f)))
|
||||||
(when weak?
|
(let ([vec (cells-merge vec new-vec)])
|
||||||
(let loop ([i 0])
|
|
||||||
(unless (fx= i len)
|
|
||||||
(let ([p (#%vector-ref new-vec i)])
|
|
||||||
(#%vector-set! new-vec i (ephemeron/fl-cons (car p) p)))
|
|
||||||
(loop (fx+ i 1))))))
|
|
||||||
(let ([vec (cells-merge vec new-vec weak?)])
|
|
||||||
(set-locked-iterable-hash-cells! ht vec)
|
(set-locked-iterable-hash-cells! ht vec)
|
||||||
(lock-release (locked-iterable-hash-lock ht))
|
(lock-release (locked-iterable-hash-lock ht))
|
||||||
vec))])))
|
vec))])))
|
||||||
|
@ -633,16 +626,11 @@
|
||||||
[(mutable-hash? ht) (hashtable-cells (mutable-hash-ht ht) n)]
|
[(mutable-hash? ht) (hashtable-cells (mutable-hash-ht ht) n)]
|
||||||
[else (weak-equal-hash-cells ht n)]))
|
[else (weak-equal-hash-cells ht n)]))
|
||||||
|
|
||||||
(define (locked-iterable-hash-weak? ht)
|
|
||||||
(cond
|
|
||||||
[(mutable-hash? ht) (hashtable-weak? (mutable-hash-ht ht))]
|
|
||||||
[else #t]))
|
|
||||||
|
|
||||||
;; Separate calls to `hashtable-cells` may return the
|
;; Separate calls to `hashtable-cells` may return the
|
||||||
;; cells in a different order, so we have to merge the
|
;; cells in a different order, so we have to merge the
|
||||||
;; tables. The resulting vector starts with the same
|
;; tables. The resulting vector starts with the same
|
||||||
;; elements as `vec`.
|
;; elements as `vec`.
|
||||||
(define (cells-merge vec new-vec weak?)
|
(define (cells-merge vec new-vec)
|
||||||
(cond
|
(cond
|
||||||
[(not vec)
|
[(not vec)
|
||||||
;; Nothing to merge
|
;; Nothing to merge
|
||||||
|
@ -652,16 +640,14 @@
|
||||||
(and (fx= len (#%vector-length new-vec))
|
(and (fx= len (#%vector-length new-vec))
|
||||||
(let loop ([i 0])
|
(let loop ([i 0])
|
||||||
(or (fx= i len)
|
(or (fx= i len)
|
||||||
(and (if weak?
|
(and (eq? (#%vector-ref vec i) (#%vector-ref new-vec i))
|
||||||
(eq? (cdr (#%vector-ref vec i)) (cdr (#%vector-ref new-vec i)))
|
|
||||||
(eq? (#%vector-ref vec i) (#%vector-ref new-vec i)))
|
|
||||||
(loop (fx+ i 1)))))))
|
(loop (fx+ i 1)))))))
|
||||||
new-vec]
|
new-vec]
|
||||||
[else
|
[else
|
||||||
;; General case
|
;; General case
|
||||||
(let ([new-ht (make-eq-hashtable)])
|
(let ([new-ht (make-eq-hashtable)])
|
||||||
(vector-for-each (lambda (p) (hashtable-set! new-ht (if weak? (cdr p) p) #t)) new-vec)
|
(vector-for-each (lambda (p) (hashtable-set! new-ht p #t)) new-vec)
|
||||||
(vector-for-each (lambda (p) (hashtable-delete! new-ht (if weak? (cdr p) p))) vec)
|
(vector-for-each (lambda (p) (hashtable-delete! new-ht p)) vec)
|
||||||
(let ([merge-vec (#%make-vector (fx+ (#%vector-length vec) (hashtable-size new-ht)))])
|
(let ([merge-vec (#%make-vector (fx+ (#%vector-length vec) (hashtable-size new-ht)))])
|
||||||
(let loop ([i (#%vector-length vec)])
|
(let loop ([i (#%vector-length vec)])
|
||||||
(unless (fx= i 0)
|
(unless (fx= i 0)
|
||||||
|
@ -673,7 +659,7 @@
|
||||||
(unless (fx= i new-len)
|
(unless (fx= i new-len)
|
||||||
(let ([p (#%vector-ref new-vec i)])
|
(let ([p (#%vector-ref new-vec i)])
|
||||||
(cond
|
(cond
|
||||||
[(hashtable-contains? new-ht (if weak? (cdr p) p))
|
[(hashtable-contains? new-ht p)
|
||||||
(#%vector-set! merge-vec j p)
|
(#%vector-set! merge-vec j p)
|
||||||
(loop (fx+ i 1) (fx+ j 1))]
|
(loop (fx+ i 1) (fx+ j 1))]
|
||||||
[else
|
[else
|
||||||
|
@ -725,13 +711,7 @@
|
||||||
[(= i len)
|
[(= i len)
|
||||||
#f]
|
#f]
|
||||||
[else
|
[else
|
||||||
(let* ([p (let ([p (#%vector-ref vec i)])
|
(let* ([p (#%vector-ref vec i)]
|
||||||
(if (locked-iterable-hash-weak? ht)
|
|
||||||
(let ([p (cdr p)])
|
|
||||||
(if (bwp-object? p)
|
|
||||||
'(#!bwp . #!bwp)
|
|
||||||
p))
|
|
||||||
p))]
|
|
||||||
[key (car p)])
|
[key (car p)])
|
||||||
(cond
|
(cond
|
||||||
[(bwp-object? key)
|
[(bwp-object? key)
|
||||||
|
@ -760,13 +740,7 @@
|
||||||
(let* ([vec (prepare-iterate! ht i)]
|
(let* ([vec (prepare-iterate! ht i)]
|
||||||
[len (#%vector-length vec)]
|
[len (#%vector-length vec)]
|
||||||
[p (if (fx< i len)
|
[p (if (fx< i len)
|
||||||
(let ([p (#%vector-ref vec i)])
|
(#%vector-ref vec i)
|
||||||
(if (locked-iterable-hash-weak? ht)
|
|
||||||
(let ([p (cdr p)])
|
|
||||||
(if (bwp-object? p)
|
|
||||||
'(#!bwp . #!bwp)
|
|
||||||
p))
|
|
||||||
p))
|
|
||||||
'(#!bwp . #!bwp))]
|
'(#!bwp . #!bwp))]
|
||||||
[key (car p)]
|
[key (car p)]
|
||||||
[v (cdr p)])
|
[v (cdr p)])
|
||||||
|
@ -1097,9 +1071,6 @@
|
||||||
(define (weak/fl-cons key d)
|
(define (weak/fl-cons key d)
|
||||||
(weak-cons key d))
|
(weak-cons key d))
|
||||||
|
|
||||||
(define (ephemeron/fl-cons key d)
|
|
||||||
(ephemeron-cons key d))
|
|
||||||
|
|
||||||
;; ----------------------------------------
|
;; ----------------------------------------
|
||||||
|
|
||||||
(define (set-hash-hash!)
|
(define (set-hash-hash!)
|
||||||
|
|
Loading…
Reference in New Issue
Block a user