]> git.eshelyaron.com Git - emacs.git/commitdiff
Fix thread memory management under NS
authorAlan Third <alan@idiocy.org>
Tue, 22 Jun 2021 20:46:02 +0000 (21:46 +0100)
committerAlan Third <alan@idiocy.org>
Sun, 4 Jul 2021 10:36:17 +0000 (11:36 +0100)
* src/thread.c (run_thread): Allocate an autorelease pool so that any
autoreleased Objective C objects are correctly released.

src/thread.c

index f74f611148647b2036ea835667b8e5f340378f08..714b1cd903acaa60cfa0e95e1864f2b9a846685e 100644 (file)
@@ -28,6 +28,10 @@ along with GNU Emacs.  If not, see <https://www.gnu.org/licenses/>.  */
 #include "pdumper.h"
 #include "keyboard.h"
 
+#ifdef HAVE_NS
+#include "nsterm.h"
+#endif
+
 #if defined HAVE_GLIB && ! defined (HAVE_NS)
 #include <xgselect.h>
 #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,