Ticket #1586: finalizer-fuzz.scm

File finalizer-fuzz.scm, 2.6 KB (added by megane, 7 years ago)
Line 
1;; (declare (disable-interrupts))
2(module
3 srfi18tests
4 ()
5 (import scheme)
6 (cond-expand
7 (chicken-5 (import (chicken base)
8 (chicken gc)
9 (chicken pretty-print)
10 (rename (chicken random) (pseudo-random-integer random)))
11 (import (prefix srfi-18 srfi-18:))
12 (import (only matchable match))
13 (import (only srfi-1 iota)))
14 (else (import chicken)
15 (use (only extras random pp))
16 (use (prefix srfi-18 srfi-18:))
17 (use (only matchable match))
18 (use (only srfi-1 iota))))
19
20 (define (spin count) (let lp2 ([i 0]) (when (< i count) (lp2 (add1 i)))))
21
22 (define (run-events evts)
23 (define name (symbol->string (srfi-18:thread-name (srfi-18:current-thread))))
24
25 (let lp ([evs evts] [event-num 0])
26 (unless (null? evs)
27 ;; (print name " " (car evs))
28 (match (car evs)
29 [('yield) (srfi-18:thread-yield!)]
30 [('spin count) (spin count)]
31 [('sleep t) (srfi-18:thread-sleep! t)]
32 [('add-finalized count) (set-finalizer! (list 'foo) (lambda (o) (spin count)))]
33 [('gc-) (gc)]
34 [('gc #t) (gc #t)]
35 [f (error "unknown event" f)])
36 (lp (cdr evs) (add1 event-num)))))
37
38 (define (run-threads evts-lists)
39 (let* ([threads (map (lambda [thread-no evts]
40 (srfi-18:make-thread
41 (lambda () (run-events evts))
42 (string->symbol (string-append "thread-" (number->string thread-no)))))
43 (iota (length evts-lists))
44 evts-lists)])
45
46 (pp (cons 'list (map (lambda (l) `(make-thread (lambda () ,@l))) evts-lists)))
47 (gc #t)
48 (for-each srfi-18:thread-start! threads)
49 (for-each srfi-18:thread-join! threads)))
50
51 (define (gen-events count)
52 (let lp ([c count] [evs '()])
53 (if (= c 0)
54 evs
55 (lp (sub1 c)
56 (cons (let ([r (random 7)])
57 (cond [(= 0 r) '(yield)]
58 [(= 1 r) '(spin 1000)]
59 [(= 2 r) '(add-finalized 100)]
60 [(= 3 r) '(add-finalized 1000)]
61 [(= 5 r) '(gc #t)]
62 ;; [(= 7 r) 'gc-]
63 [else '(spin 10)]))
64 evs)))))
65
66 (let lp ([i 0])
67 (when (< i 1000000)
68 (print "######################################## " i)
69 (let ([max-evts 7]
70 [max-threads 2])
71 (run-threads (map (lambda (_) (gen-events (add1 (random max-evts))))
72 (iota (add1 (random max-threads))))))
73 (lp (add1 i))))
74
75 )