﻿id	summary	reporter	owner	description	type	status	priority	milestone	component	version	resolution	keywords	cc	difficulty
1356	trace buffer unnecessarily holds on to thread objects	kristianlm	felix winkelmann	"
version:

{{{
;; 2015 klm@kth /s/p/a/a/s/ais-sse ➤ csi -version
;; 
;; CHICKEN
;; (c) 2008-2017, The CHICKEN Team
;; (c) 2000-2007, Felix L. Winkelmann
;; Version 4.12.0 (rev 6ea24b6)
;; linux-unix-gnu-x86-64 [ 64bit manyargs dload ptables ]
;; compiled 2017-02-19 on yves.more-magic.net (Linux)
}}}

running the program below '''should''' output this:

{{{
;; 2017 klm@kth /s/p/a/a/s/ais-sse ➤ cat weak-test.scm  | csi -p '(read)'
;; (use srfi-18 lolevel)
;; 2017 klm@kth /s/p/a/a/s/ais-sse ➤ csi -s weak-test.scm
;; locking mutex
;; unlocking mutex ...
;; weak locative: #(123)
;; weak locative: #(123)
;; weak locative: #(123)
;; weak locative: #(123)
;; ^C
;; *** user interrupt ***
;;
}}}

Where the locative to REFERENCE is kept alive forever. However, it looses track of this REFERENCE:

{{{

;; 
;; 2016 klm@kth /s/p/a/a/s/ais-sse ➤ csi -s weak-test.scm
;; locking mutex
;; unlocking mutex ...
;; weak locative: #(123)
;; weak locative: #f
;; weak locative: #f
;; weak locative: #f
;; ^C
;; *** user interrupt ***
}}}

There are several ways you can make this program work:

- compile it and run it
- remove the srfi-13 import (it's not used)
- assign the first thread to a top variable

Here's the program in question that doesn't work:

{{{
(use srfi-13 ;; <-- killer import (any import will breaks things, try srfi-4 too for example)
     srfi-18 lolevel)

(define wl #f)

(thread-start!
 (lambda ()
   (define mutex (make-mutex))
   (define cv (make-condition-variable))
   (print ""locking mutex"")
   (mutex-lock! mutex)
   (let ((REFERENCE (vector 123)))
     (set! wl (make-weak-locative REFERENCE))
     (print ""unlocking mutex ..."")
     (mutex-unlock! mutex cv)
     (print ""unlocked!"")
     (print ""DONE (REFERENCE may now be out of scope) "" REFERENCE))))

(thread-start!
 (lambda ()
   (let loop ()
     (print ""weak locative: "" (locative->object wl))
     (thread-sleep! 1)
     (gc #t)
     (loop))))

(thread-sleep! 10)
}}}
"	defect	closed	minor	5.0	unknown	4.12.0	fixed			medium
