(define gg #f)
(let ((g (make-guardian)))
(g (let ((m (make-mutex)))
(lock-mutex m)
(if (mutex? m) #t (display "0: not mutex\n"))
m))
(set! gg g)
(simple-format #t "1: g=~S\n" g)
;; Avoid false references to M on the stack.
(clear-stale-stack-references)
(gc) (gc)
(simple-format #t "2: g=~S\n" g)
(let ((m (g)))
(simple-format #t "3: g=~S\n" g)
(and (mutex? m)
(eq? (mutex-owner m) (current-thread)))))
(gc)(gc)
(simple-format #t "9:gg=~S\n" gg)
The above generates
1: g=#<guardian 10228dba0 (reachable: 1 unreachable: 0)>
2: g=#<guardian 10228dba0 (reachable: 1 unreachable: 0)>
3: g=#<guardian 10228dba0 (reachable: 1 unreachable: 0)>
9:gg=#<guardian 10228dba0 (reachable: 0 unreachable: 1)>
I believe both 2 and 3 would ordinarily indicate the mutex unreachable.
Any ideas on how to chase this down?
Matt