Re: master: Stop finalizer in S-L-A-D only if no other threads exist

Stas Boukarev <[email protected]> Wed, 18 Feb 2026 06:14:28 +0300
Newsgroups gmane.lisp.steel-bank.cvs,gmane.lisp.steel-bank.devel
Message-ID <CAF63=13j8LxGu61EpcU=RFm_N4pfNF+6GuysQwkz+o-+nNn0Jw@mail.gmail.com>
I'm also getting this on linux-arm64-sb-safepoint:

debugger invoked on a SB-IMPL::SAVE-WITH-MULTIPLE-THREADS-ERROR in thread
#<THREAD tid=818888 "main thread" RUNNING {1002660343}>:
  Cannot save core with multiple threads running.

  Interactive thread (of current session):
    #<THREAD tid=818888 "main thread" RUNNING {1002660343}>

  Other thread:
    #<THREAD tid=818889 "sigwait" RUNNING {1002660283}>

On Tue, Feb 17, 2026 at 7:14 PM Stas Boukarev <[email protected]> wrote:
>
> And it's not limited to windows, the same error can be observed anywhere.
>
> On Tue, Feb 17, 2026 at 7:12 PM Stas Boukarev <[email protected]> wrote:
> >
> > On windows save7 fails with:
> > (and after adding
> >  (format t "~a ~a ~a~%" threads starting joinable))
> >
> > (#<THREAD tid=4240 "main thread" RUNNING {10020B0003}>) (#<THREAD
> > tid=0 "finalizer" RUNNING {1002060363}>) NIL
> > Unhandled SB-IMPL::SAVE-WITH-MULTIPLE-THREADS-ERROR in thread
> > #<SB-THREAD:THREAD tid=4240 "main thread" RUNNING
> >                                                                  {10020B0003}>:
> >   Cannot save core with multiple threads running.
> >
> >   Interactive thread (of current session):
> >     #<THREAD tid=4240 "main thread" RUNNING {10020B0003}>
> >
> >   Other thread:
> >     0
> >
> > On Tue, Feb 17, 2026 at 6:11 PM snuglas via Sbcl-commits
> > <[email protected]> wrote:
> > >
> > > The branch "master" has been updated in SBCL:
> > >        via  55c0f2e12ab0bc9d1b11a50f4c9d20162740ba83 (commit)
> > >       from  49044888b298a1ace613a918cdbd4b6ad5bfd586 (commit)
> > >
> > > - Log -----------------------------------------------------------------
> > > commit 55c0f2e12ab0bc9d1b11a50f4c9d20162740ba83
> > > Author: Douglas Katzman <[email protected]>
> > > Date:   Tue Feb 17 10:10:56 2026 -0500
> > >
> > >     Stop finalizer in S-L-A-D only if no other threads exist
> > > ---
> > >  src/code/save.lisp     | 16 ++++++++--------
> > >  tests/save.impure.lisp | 11 +++++++++++
> > >  2 files changed, 19 insertions(+), 8 deletions(-)
> > >
> > > diff --git a/src/code/save.lisp b/src/code/save.lisp
> > > index 8db5f7e4a..977a3da5f 100644
> > > --- a/src/code/save.lisp
> > > +++ b/src/code/save.lisp
> > > @@ -324,20 +324,20 @@ sufficiently motivated to do lengthy fixes."
> > >    #+sb-thread
> > >    (let (error)
> > >      (with-system-mutex (sb-thread::*make-thread-lock*)
> > > -      (finalizer-thread-stop)
> > >        (sb-thread::%dispose-thread-structs)
> > >        (let ((threads (sb-thread:list-all-threads))
> > >              (starting
> > >               (setq sb-thread::*starting-threads* ; ordinarily pruned in MAKE-THREAD
> > >                     (delete 0 sb-thread::*starting-threads*)))
> > >              (joinable sb-thread::*joinable-threads*))
> > > -        (when (or (cdr threads) starting joinable)
> > > -          (let* ((interactive (sb-thread::interactive-threads))
> > > -                 (other (union (set-difference threads interactive)
> > > -                               (union starting joinable))))
> > > -            (setf error (make-condition 'save-with-multiple-threads-error
> > > -                                        :interactive-threads interactive
> > > -                                        :other-threads other))))))
> > > +        (if (or (cdr threads) starting joinable)
> > > +            (let* ((interactive (sb-thread::interactive-threads))
> > > +                   (other (union (set-difference threads interactive)
> > > +                                 (union starting joinable))))
> > > +              (setf error (make-condition 'save-with-multiple-threads-error
> > > +                                          :interactive-threads interactive
> > > +                                          :other-threads other)))
> > > +            (finalizer-thread-stop))))
> > >      (when error (error error))
> > >      #+allocator-metrics (setq sb-thread::*allocator-metrics* nil)
> > >      (setq sb-thread::*sprof-data* nil))
> > > diff --git a/tests/save.impure.lisp b/tests/save.impure.lisp
> > > index 364451ce6..1635e31be 100644
> > > --- a/tests/save.impure.lisp
> > > +++ b/tests/save.impure.lisp
> > > @@ -27,3 +27,14 @@
> > >        (setf donep t)
> > >        (sb-thread:condition-notify cvar))
> > >      (sb-thread:join-thread thread)))
> > > +
> > > +(with-test (:name (sb-ext:save-lisp-and-die error :multiple-threads-2))
> > > +  (let* ((sem (sb-thread:make-semaphore))
> > > +         (thread (sb-thread:make-thread
> > > +                  (lambda () (sb-thread:wait-on-semaphore sem)))))
> > > +    (assert (eq (handler-case (save-lisp-and-die "expect_failure")
> > > +                  (sb-impl::save-with-multiple-threads-error () 'ok))
> > > +                'ok))
> > > +    (assert (sb-thread::thread-p sb-impl::*finalizer-thread*))
> > > +    (sb-thread:signal-semaphore sem)
> > > +    (sb-thread:join-thread thread)))
> > >
> > > -----------------------------------------------------------------------
> > >
> > >
> > > hooks/post-receive
> > > --
> > > SBCL
> > >
> > >
> > > _______________________________________________
> > > Sbcl-commits mailing list
> > > [email protected]
> > > https://lists.sourceforge.net/lists/listinfo/sbcl-commits


_______________________________________________
Sbcl-commits mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/sbcl-commits