~ chicken-core (chicken-5) 596332d69e47a5d04fe5e4f5f609c3e4ab8fcdba
commit 596332d69e47a5d04fe5e4f5f609c3e4ab8fcdba Author: Peter Bex <peter@more-magic.net> AuthorDate: Tue Oct 10 17:29:44 2017 +0200 Commit: Kooda <kooda@upyum.com> CommitDate: Sun Oct 22 13:38:48 2017 +0200 Threads are tricky business. We must sacrifice a goat in the name of the dark gods to make them work properly! When scheduling a new thread, we need to invoke it with a continuation that goes nowhere. We know the thread call won't return, so the continuation must be swapped out because the scheduler continuation still has a reference to the old thread before invocation. This continuation itself still may holds a reference to the previous thread, and so on, resulting in infinite memory buildup. This fixes #1367 Signed-off-by: Kooda <kooda@upyum.com> diff --git a/NEWS b/NEWS index acce52f6..c14fea47 100644 --- a/NEWS +++ b/NEWS @@ -136,6 +136,9 @@ - Runtime system: - The profiler no longer uses malloc from a signal handler which may cause deadlocks (#1414, thanks to Lemonboy). + - The scheduler no longer indirectly hangs on to the old thread + when switching to a new one, which caused excessive memory + consumption (#1367, thanks to "megane"). - Syntax expander - Renaming an identifier twice no longer results in an undo of the diff --git a/scheduler.scm b/scheduler.scm index 72b8ad06..a6440001 100644 --- a/scheduler.scm +++ b/scheduler.scm @@ -170,7 +170,9 @@ EOF (##sys#restore-thread-state-buffer thread) ;;XXX WRONG! this sets the t/i-period ("quantum") for the _next_ thread (##core#inline "C_set_initial_timer_interrupt_period" (##sys#slot thread 9)) - ((##sys#slot thread 1)) ) + ;; Call upon ye ancient gods to forget about the current + ;; continuation; it still refers to the old thread (#1367). + (##sys#call-with-cthulhu (##sys#slot thread 1)) ) (let* ([ct ##sys#current-thread] [eintr #f] [cts (##sys#slot ct 3)] )Trap