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))
|
||||
vec]
|
||||
[else
|
||||
(let ([weak? (locked-iterable-hash-weak? ht)]
|
||||
[new-vec (get-locked-iterable-hash-cells
|
||||
(let ([new-vec (get-locked-iterable-hash-cells
|
||||
ht
|
||||
(fxmax (if vec
|
||||
(fx* 2 (#%vector-length vec))
|
||||
0)
|
||||
32))])
|
||||
(let ([len (#%vector-length new-vec)])
|
||||
(when (fx= len (hash-count ht))
|
||||
(set-locked-iterable-hash-retry?! ht #f))
|
||||
(when weak?
|
||||
(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?)])
|
||||
(when (fx= len (hash-count ht))<
|
||||
(set-locked-iterable-hash-retry?! ht #f)))
|
||||
(let ([vec (cells-merge vec new-vec)])
|
||||
(set-locked-iterable-hash-cells! ht vec)
|
||||
(lock-release (locked-iterable-hash-lock ht))
|
||||
vec))])))
|
||||
|
@ -633,16 +626,11 @@
|
|||
[(mutable-hash? ht) (hashtable-cells (mutable-hash-ht 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
|
||||
;; cells in a different order, so we have to merge the
|
||||
;; tables. The resulting vector starts with the same
|
||||
;; elements as `vec`.
|
||||
(define (cells-merge vec new-vec weak?)
|
||||
(define (cells-merge vec new-vec)
|
||||
(cond
|
||||
[(not vec)
|
||||
;; Nothing to merge
|
||||
|
@ -652,16 +640,14 @@
|
|||
(and (fx= len (#%vector-length new-vec))
|
||||
(let loop ([i 0])
|
||||
(or (fx= i len)
|
||||
(and (if weak?
|
||||
(eq? (cdr (#%vector-ref vec i)) (cdr (#%vector-ref new-vec i)))
|
||||
(eq? (#%vector-ref vec i) (#%vector-ref new-vec i)))
|
||||
(and (eq? (#%vector-ref vec i) (#%vector-ref new-vec i))
|
||||
(loop (fx+ i 1)))))))
|
||||
new-vec]
|
||||
[else
|
||||
;; General case
|
||||
(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-delete! new-ht (if weak? (cdr p) p))) vec)
|
||||
(vector-for-each (lambda (p) (hashtable-set! new-ht p #t)) new-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 loop ([i (#%vector-length vec)])
|
||||
(unless (fx= i 0)
|
||||
|
@ -673,7 +659,7 @@
|
|||
(unless (fx= i new-len)
|
||||
(let ([p (#%vector-ref new-vec i)])
|
||||
(cond
|
||||
[(hashtable-contains? new-ht (if weak? (cdr p) p))
|
||||
[(hashtable-contains? new-ht p)
|
||||
(#%vector-set! merge-vec j p)
|
||||
(loop (fx+ i 1) (fx+ j 1))]
|
||||
[else
|
||||
|
@ -725,13 +711,7 @@
|
|||
[(= i len)
|
||||
#f]
|
||||
[else
|
||||
(let* ([p (let ([p (#%vector-ref vec i)])
|
||||
(if (locked-iterable-hash-weak? ht)
|
||||
(let ([p (cdr p)])
|
||||
(if (bwp-object? p)
|
||||
'(#!bwp . #!bwp)
|
||||
p))
|
||||
p))]
|
||||
(let* ([p (#%vector-ref vec i)]
|
||||
[key (car p)])
|
||||
(cond
|
||||
[(bwp-object? key)
|
||||
|
@ -760,13 +740,7 @@
|
|||
(let* ([vec (prepare-iterate! ht i)]
|
||||
[len (#%vector-length vec)]
|
||||
[p (if (fx< i len)
|
||||
(let ([p (#%vector-ref vec i)])
|
||||
(if (locked-iterable-hash-weak? ht)
|
||||
(let ([p (cdr p)])
|
||||
(if (bwp-object? p)
|
||||
'(#!bwp . #!bwp)
|
||||
p))
|
||||
p))
|
||||
(#%vector-ref vec i)
|
||||
'(#!bwp . #!bwp))]
|
||||
[key (car p)]
|
||||
[v (cdr p)])
|
||||
|
@ -1097,9 +1071,6 @@
|
|||
(define (weak/fl-cons key d)
|
||||
(weak-cons key d))
|
||||
|
||||
(define (ephemeron/fl-cons key d)
|
||||
(ephemeron-cons key d))
|
||||
|
||||
;; ----------------------------------------
|
||||
|
||||
(define (set-hash-hash!)
|
||||
|
|
Loading…
Reference in New Issue
Block a user