mirror of
git://git.code.sf.net/p/sbcl/sbcl
synced 2026-09-10 07:26:40 -04:00
40 lines
1.8 KiB
Common Lisp
40 lines
1.8 KiB
Common Lisp
|
|
#-mark-region-gc (invoke-restart 'run-tests::skip-file)
|
|
|
|
(setf (extern-alien "check_hash_tables" int) 1)
|
|
;; This test is much LESS LIKELY to fail when the hash-table is pinned.
|
|
;; Allowing table movement during the COMPILE-FILE operation by reading
|
|
;; through an extra seemingly pointless indirection makes it fail faster.
|
|
(defun get-table (holder) (car holder))
|
|
(compile 'get-table)
|
|
|
|
(defun run-biggybiggy ()
|
|
(let ((holder (list (make-hash-table :test 'eq)))
|
|
(n-iter 0))
|
|
(loop
|
|
(format t "~&Trial ~D: so far have ~D keys~%" (incf n-iter)
|
|
(hash-table-count (get-table holder)))
|
|
(dotimes (random-iterations (random 10000))
|
|
(let* ((tbl (get-table holder))
|
|
(random-thing (cons (hash-table-count tbl) 'foo)))
|
|
(setf (gethash random-thing tbl) (hash-table-count tbl))))
|
|
;; This COMPILE-FILE conses about 46 megabytes which seems to do the trick.
|
|
;; Indeed it very consistently fails for me by trial 60,
|
|
;; but might fail sooner.
|
|
(compile-file "../src/pcl/walk")
|
|
;; Expect to fail before this count is reached
|
|
(if (> (hash-table-count (get-table holder)) 2000000) (return)))))
|
|
;(compile 'run-biggybiggy) ; use the interpreter. It conses more, which helps actually
|
|
|
|
;;; Prior to the fix we would see (approximately):
|
|
;;; Trial 28: so far have 144677 keys
|
|
;;; ; compiling file "../src/pcl/walk.lisp" (written 28 JAN 2024 02:35:17 PM):
|
|
;;; Verifying hashtables
|
|
;;; failed to find key 1002799327 value 3d784 fuzzed_hash=3520c45 ivmask=3ffff bucket=20c45 index=78880
|
|
;;; index=78880 key=10044b47d7 next=0
|
|
;;; index=0 key=4714a next=0
|
|
;;; fatal error encountered in SBCL pid 3350552 tid 3350552:
|
|
;;; ht should be marked for rehash
|
|
(test-util:with-test (:name :fail-to-rehash :skipped-on (not :slow))
|
|
(run-biggybiggy))
|