| 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 | ) |
|---|