From 604133ee62b7475f5aa88bd0b2ad9f81145f4ec5 Mon Sep 17 00:00:00 2001 From: Alan Third Date: Tue, 22 Jun 2021 21:46:02 +0100 Subject: [PATCH] Fix thread memory management under NS * src/thread.c (run_thread): Allocate an autorelease pool so that any autoreleased Objective C objects are correctly released. --- src/thread.c | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/src/thread.c b/src/thread.c index f74f6111486..714b1cd903a 100644 --- a/src/thread.c +++ b/src/thread.c @@ -28,6 +28,10 @@ along with GNU Emacs. If not, see . */ #include "pdumper.h" #include "keyboard.h" +#ifdef HAVE_NS +#include "nsterm.h" +#endif + #if defined HAVE_GLIB && ! defined (HAVE_NS) #include #else @@ -735,6 +739,15 @@ run_thread (void *state) struct thread_state *self = state; struct thread_state **iter; +#ifdef HAVE_NS + /* Allocate an autorelease pool in case this thread calls any + Objective C code. + + FIXME: In long running threads we may want to drain the pool + regularly instead of just at the end. */ + void *pool = ns_alloc_autorelease_pool (); +#endif + self->m_stack_bottom = self->stack_top = &stack_pos.c; self->thread_id = sys_thread_self (); @@ -777,6 +790,10 @@ run_thread (void *state) current_thread = NULL; sys_cond_broadcast (&self->thread_condvar); +#ifdef HAVE_NS + ns_release_autorelease_pool (pool); +#endif + /* Unlink this thread from the list of all threads. Note that we have to do this very late, after broadcasting our death. Otherwise the GC may decide to reap the thread_state object, -- 2.39.2