Ticket #1586: finalizer-fuzz.scm

File finalizer-fuzz.scm, 2.6 KB (added by megane, 5 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 )