~ chicken-core (chicken-5) 00d8dcd2425a9eaa31f768fc5eac08555952e89c
commit 00d8dcd2425a9eaa31f768fc5eac08555952e89c
Author: felix <felix@call-with-current-continuation.org>
AuthorDate: Sat Oct 28 20:54:56 2017 +0200
Commit: Peter Bex <peter@more-magic.net>
CommitDate: Fri Nov 3 20:07:47 2017 +0100
Add identity slot to thread and use this for distinguishing threads when extracting call-chain.
Otherwise we hold on to threads too long, see also #1356
Signed-off-by: Peter Bex <peter@more-magic.net>
diff --git a/NEWS b/NEWS
index e8cc5dc4..c849aede 100644
--- a/NEWS
+++ b/NEWS
@@ -16,6 +16,8 @@
also accept multiple values via direct invocation after being
captured through `call/cc`, not just via `values` (#1390)
- Removed the deprecated C_locative_ref and C_mutate2 C functions.
+ - The trace buffer no longer holds on to thread objects, allowing them to
+ be garbage collected sooner (#1356, thanks to Kristian Lein-Mathisen)
- Compiler
- Fixed an off by one allocation problem in generated C code for (list ...).
diff --git a/eval.scm b/eval.scm
index 0426e644..718ea80d 100644
--- a/eval.scm
+++ b/eval.scm
@@ -83,6 +83,9 @@
(define compile-to-closure
(let ((reverse reverse))
(lambda (exp env se #!optional cntr evalenv static tl?)
+ (define-syntax thread-id
+ (syntax-rules ()
+ ((_ t) (##sys#slot t 14))))
(define (find-id id se) ; ignores macro bindings
(cond ((null? se) #f)
@@ -114,7 +117,7 @@
"C_emit_eval_trace_info"
info
(##sys#make-structure 'frameinfo cntr e v)
- ##sys#current-thread) ) )
+ (thread-id ##sys#current-thread) ) ) )
(define (emit-syntax-trace-info tf info cntr)
(when tf
@@ -122,7 +125,7 @@
"C_emit_syntax_trace_info"
info
cntr
- ##sys#current-thread) ) )
+ (thread-id ##sys#current-thread) ) ) )
(define (decorate p ll h cntr)
(eval-decorator p ll h cntr))
diff --git a/library.scm b/library.scm
index c17236a6..bedd7d23 100644
--- a/library.scm
+++ b/library.scm
@@ -4702,12 +4702,13 @@ EOF
(c +trace-buffer-entry-slot-count+)
(vec (##sys#make-vector (fx* c tbl) #f))
(r (##core#inline "C_fetch_trace" start vec))
- (n (if (fixnum? r) r (fx* c tbl))))
+ (n (if (fixnum? r) r (fx* c tbl)))
+ (t-id (and thread (##sys#slot thread 14))))
(let loop ((i 0))
(if (fx>= i n)
'()
- (let ((t (##sys#slot vec (fx+ i 3)))) ; thread
- (if (or (not t) (not thread) (eq? thread t))
+ (let ((t (##sys#slot vec (fx+ i 3)))) ; thread id
+ (if (or (not t) (not thread) (eq? t-id t))
(cons (vector
(extract (##sys#slot vec i)) ; raw
(##sys#slot vec (fx+ i 1)) ; cooked1
@@ -5449,7 +5450,8 @@ EOF
(##core#undefined) ; #10 specific
#f ; #11 block object (type depends on blocking type)
'() ; #12 recipients
- #f) ) ; #13 unblocked by timeout?
+ #f ; #13 unblocked by timeout?
+ (cons #f #f))) ; #14 ID (just needs to be unique)
(define ##sys#primordial-thread
(##sys#make-thread #f 'running 'primordial ##sys#default-thread-quantum))
diff --git a/runtime.c b/runtime.c
index 9423993a..499fc922 100644
--- a/runtime.c
+++ b/runtime.c
@@ -259,6 +259,8 @@ static C_TLS int timezone;
# define SIGBUS 0
#endif
+#define C_thread_id(x) C_block_item((x), 14)
+
/* Type definitions: */
@@ -4408,6 +4410,8 @@ done:
C_regparm void C_fcall C_trace(C_char *name)
{
+ C_word thread;
+
if(show_trace) {
C_fputs(name, C_stderr);
C_fputc('\n', C_stderr);
@@ -4432,7 +4436,8 @@ C_regparm void C_fcall C_trace(C_char *name)
trace_buffer_top->raw = name;
trace_buffer_top->cooked1 = C_SCHEME_FALSE;
trace_buffer_top->cooked2 = C_SCHEME_FALSE;
- trace_buffer_top->thread = C_block_item(current_thread_symbol, 0);
+ thread = C_block_item(current_thread_symbol, 0);
+ trace_buffer_top->thread = C_thread_id(thread);
++trace_buffer_top;
}
diff --git a/support.scm b/support.scm
index 517a1e57..905f7ae8 100644
--- a/support.scm
+++ b/support.scm
@@ -194,7 +194,9 @@
;; Move to C-platform?
(define (emit-syntax-trace-info info cntr)
- (##core#inline "C_emit_syntax_trace_info" info cntr ##sys#current-thread) )
+ (define (thread-id t) (##sys#slot t 14))
+ (##core#inline "C_emit_syntax_trace_info" info cntr
+ (thread-id ##sys#current-thread)))
(define (map-llist proc llist)
(let loop ([llist llist])
Trap