From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.org!.POSTED!not-for-mail From: Alan Third Newsgroups: gmane.emacs.bugs Subject: bug#25265: make-thread crashes in OS X 10.6 Date: Fri, 16 Jun 2017 21:51:39 +0100 Message-ID: <20170616205139.GA27574@breton.holly.idiocy.org> References: <20170502204935.GA79100@breton.holly.idiocy.org> <20170613204643.GA98084@breton.holly.idiocy.org> <20170615190432.GA12317@breton.holly.idiocy.org> <20170616194531.GA27453@breton.holly.idiocy.org> NNTP-Posting-Host: blaine.gmane.org Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="BOKacYhQ+x31HxR3" Content-Transfer-Encoding: 8bit X-Trace: blaine.gmane.org 1497646334 2783 195.159.176.226 (16 Jun 2017 20:52:14 GMT) X-Complaints-To: usenet@blaine.gmane.org NNTP-Posting-Date: Fri, 16 Jun 2017 20:52:14 +0000 (UTC) User-Agent: Mutt/1.7.2 (2016-11-26) Cc: "Charles A. Roelli" , 25265@debbugs.gnu.org To: Noam Postavsky Original-X-From: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane.org@gnu.org Fri Jun 16 22:52:08 2017 Return-path: Envelope-to: geb-bug-gnu-emacs@m.gmane.org Original-Received: from lists.gnu.org ([208.118.235.17]) by blaine.gmane.org with esmtp (Exim 4.84_2) (envelope-from ) id 1dLyDw-0000Mn-2u for geb-bug-gnu-emacs@m.gmane.org; Fri, 16 Jun 2017 22:52:08 +0200 Original-Received: from localhost ([::1]:60691 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dLyE1-00082Y-Ab for geb-bug-gnu-emacs@m.gmane.org; Fri, 16 Jun 2017 16:52:13 -0400 Original-Received: from eggs.gnu.org ([2001:4830:134:3::10]:44693) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dLyDu-00082F-N1 for bug-gnu-emacs@gnu.org; Fri, 16 Jun 2017 16:52:08 -0400 Original-Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1dLyDq-0003Qh-Py for bug-gnu-emacs@gnu.org; Fri, 16 Jun 2017 16:52:06 -0400 Original-Received: from debbugs.gnu.org ([208.118.235.43]:49067) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1dLyDq-0003QV-K2 for bug-gnu-emacs@gnu.org; Fri, 16 Jun 2017 16:52:02 -0400 Original-Received: from Debian-debbugs by debbugs.gnu.org with local (Exim 4.84_2) (envelope-from ) id 1dLyDp-00053L-Rh for bug-gnu-emacs@gnu.org; Fri, 16 Jun 2017 16:52:02 -0400 X-Loop: help-debbugs@gnu.org Resent-From: Alan Third Original-Sender: "Debbugs-submit" Resent-CC: bug-gnu-emacs@gnu.org Resent-Date: Fri, 16 Jun 2017 20:52:01 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: followup 25265 X-GNU-PR-Package: emacs X-GNU-PR-Keywords: Original-Received: via spool by 25265-submit@debbugs.gnu.org id=B25265.149764630519396 (code B ref 25265); Fri, 16 Jun 2017 20:52:01 +0000 Original-Received: (at 25265) by debbugs.gnu.org; 16 Jun 2017 20:51:45 +0000 Original-Received: from localhost ([127.0.0.1]:51744 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1dLyDZ-00052m-8w for submit@debbugs.gnu.org; Fri, 16 Jun 2017 16:51:45 -0400 Original-Received: from mail-wr0-f181.google.com ([209.85.128.181]:36251) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1dLyDY-00052X-3r for 25265@debbugs.gnu.org; Fri, 16 Jun 2017 16:51:44 -0400 Original-Received: by mail-wr0-f181.google.com with SMTP id 36so43952293wry.3 for <25265@debbugs.gnu.org>; Fri, 16 Jun 2017 13:51:43 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=googlemail.com; s=20161025; h=sender:date:from:to:cc:subject:message-id:references:mime-version :content-disposition:content-transfer-encoding:in-reply-to :user-agent; bh=ThpzhxqUyZHJyPYKv2zd7h4T/21j5H8JAg57u8+Yhbw=; b=iOk5WpQDVUa6ZNIJL3WDGLzDUDbWTKskO6qToN0bwti+RsqfC1rZ+OYHv/Z2n78gmA fVaMNU7P/pVU6LmR8vzufd7mGYRahbOs1LY1UED0DWHDtfctcFRUWk1DCORZguB1/5D/ kufLi1XIS9z+ewr8A0080c+BauIYSw0klVlwbZzMruAU0OSDHyZiL/euRY03pHvWQowK NQqmmuKDE6ReTVVKgSwim6A+jXJuhu9HTiSIsHzn9u/l1giu3lpkrecqGw65dutH8CSm +2TWnmgGo101A+IXQAeMsH3nhRH4M7cyNHYIXuuKLcg/2+8nDEeUAzMq6F0hRraT50Jp RbVA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:sender:date:from:to:cc:subject:message-id :references:mime-version:content-disposition :content-transfer-encoding:in-reply-to:user-agent; bh=ThpzhxqUyZHJyPYKv2zd7h4T/21j5H8JAg57u8+Yhbw=; b=MCo/kLbqX6Jeb6HyiTUuG2IzZN4hl8PKqF0Z6OgZ+CQkcJlD7G0tNJEzIul886e7+d jqyzS2XX4txynWH+WS9LSt91kUFYcBiYgd/44DdAV2UfrpGZCbgw0MkzQeCliQUQs5pe Ukm/U7UYb6OGechuD8h7Yg4Cq0eveUkG181Cu/S+jyizQL3yW0V90z3r48oxIiydkPAa 0QHHOt+YTPiDgcZSFiVE3k67kp9IDBKqe7/k6MKt9hb7hZIphGltCvF7KLx9BOSSbXpc 2VvVr8fl5zrNrwjYzdFQ++03UcWRzHaNPMt3HjJEjziXQUeu8URzInSxiau3ZWwIy2Zq FlRQ== X-Gm-Message-State: AKS2vOwW8Tv2qP2b2zHfRYeblXuOOBZRgg1uxKzA1OlmkYx7umO4ie1T IE05AUcp+alFYA== X-Received: by 10.223.167.15 with SMTP id c15mr9563137wrd.79.1497646298223; Fri, 16 Jun 2017 13:51:38 -0700 (PDT) Original-Received: from breton.holly.idiocy.org (ip6-2001-08b0-03f8-8129-ac7d-b00e-c9b8-6bdc.holly.idiocy.org. [2001:8b0:3f8:8129:ac7d:b00e:c9b8:6bdc]) by smtp.gmail.com with ESMTPSA id j10sm2715773wre.67.2017.06.16.13.51.36 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Fri, 16 Jun 2017 13:51:37 -0700 (PDT) Content-Disposition: inline In-Reply-To: X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 208.118.235.43 X-BeenThere: bug-gnu-emacs@gnu.org List-Id: "Bug reports for GNU Emacs, the Swiss army knife of text editors" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane.org@gnu.org Original-Sender: "bug-gnu-emacs" Xref: news.gmane.org gmane.emacs.bugs:133668 Archived-At: --BOKacYhQ+x31HxR3 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: 8bit On Fri, Jun 16, 2017 at 04:05:58PM -0400, Noam Postavsky wrote: > On Fri, Jun 16, 2017 at 3:45 PM, Alan Third wrote: > > The first one looks like the thread’s starting too quick? > > I think it's rather failing to be killed by the `thread-signal' call. Ah, yes. I completely misread the test. > > The second looks like the thread’s not dying quick enough? > > Same for that one. I don't know much about the thread internals, and > even less macOS internals though... Well, I’ve discovered that if I keep the mouse moving over the Emacs frame while the tests are running then none of them fail, so I think it’s something to do with ns_select jamming everything up for the duration of its timeout. I could probably get round that by getting the thread to fire off an NS app defined event when it dies. That would break ns_select out of its event loop, presumably letting the dying thread actually die... Amazingly that seems to have worked! Updated patch attached. -- Alan Third --BOKacYhQ+x31HxR3 Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename="0001-Fix-threads-on-NS-bug-25265.patch" >From ab35f15d5091c29011f6a538009612f1b5c5137d Mon Sep 17 00:00:00 2001 From: Alan Third Date: Tue, 13 Jun 2017 21:40:25 +0100 Subject: [PATCH] Fix threads on NS (bug#25265) src/nsterm.h (ns_select): Compiler doesn't like sigmask being const. (ns_select_break) [HAVE_PTHREAD]: New function. src/nsterm.m (ns_select): Call thread_select from within ns_select. (ns_select_break) [HAVE_PTHREAD]: New function. (ns_send_appdefined): Don't wait for main thread when sending app defined event. src/process.c (wait_reading_process_output): Call thread_select from within ns_select. src/systhread.c (sys_cond_broadcast) [HAVE_NS]: Break ns_select out of its event loop. --- src/nsterm.h | 7 +++++-- src/nsterm.m | 21 +++++++++++++++++---- src/process.c | 13 ++++++------- src/systhread.c | 7 +++++++ 4 files changed, 35 insertions(+), 13 deletions(-) diff --git a/src/nsterm.h b/src/nsterm.h index bed0b92c79..eac54e1bcf 100644 --- a/src/nsterm.h +++ b/src/nsterm.h @@ -1225,8 +1225,11 @@ extern void x_set_no_accept_focus (struct frame *f, Lisp_Object new_value, extern void x_set_z_group (struct frame *f, Lisp_Object new_value, Lisp_Object old_value); extern int ns_select (int nfds, fd_set *readfds, fd_set *writefds, - fd_set *exceptfds, struct timespec const *timeout, - sigset_t const *sigmask); + fd_set *exceptfds, struct timespec *timeout, + sigset_t *sigmask); +#ifdef HAVE_PTHREAD +extern void ns_select_break (void); +#endif extern unsigned long ns_get_rgb_color (struct frame *f, float r, float g, float b, float a); diff --git a/src/nsterm.m b/src/nsterm.m index e05dbf45fb..29a45ed851 100644 --- a/src/nsterm.m +++ b/src/nsterm.m @@ -4068,7 +4068,7 @@ overwriting cursor (usually when cursor on a tab) */ app->nextappdefined = value; [app performSelectorOnMainThread:@selector (sendFromMainThread:) withObject:nil - waitUntilDone:YES]; + waitUntilDone:NO]; return; } @@ -4293,8 +4293,8 @@ in certain situations (rapid incoming events). int ns_select (int nfds, fd_set *readfds, fd_set *writefds, - fd_set *exceptfds, struct timespec const *timeout, - sigset_t const *sigmask) + fd_set *exceptfds, struct timespec *timeout, + sigset_t *sigmask) /* -------------------------------------------------------------------------- Replacement for select, checking for events -------------------------------------------------------------------------- */ @@ -4327,7 +4327,13 @@ in certain situations (rapid incoming events). if (NSApp == nil || ![NSThread isMainThread] || (timeout && timeout->tv_sec == 0 && timeout->tv_nsec == 0)) - return pselect (nfds, readfds, writefds, exceptfds, timeout, sigmask); + return thread_select(pselect, nfds, readfds, writefds, + exceptfds, timeout, sigmask); + else + { + struct timespec t = {0, 0}; + thread_select(pselect, 0, NULL, NULL, NULL, &t, sigmask); + } [outerpool release]; outerpool = [[NSAutoreleasePool alloc] init]; @@ -4430,6 +4436,13 @@ in certain situations (rapid incoming events). return result; } +#ifdef HAVE_PTHREAD +void +ns_select_break () +{ + ns_send_appdefined(-1); +} +#endif /* ========================================================================== diff --git a/src/process.c b/src/process.c index 2a1c2eecde..abd017bb90 100644 --- a/src/process.c +++ b/src/process.c @@ -5371,14 +5371,13 @@ wait_reading_process_output (intmax_t time_limit, int nsecs, int read_kbd, nfds = xg_select (max_desc + 1, &Available, (check_write ? &Writeok : 0), NULL, &timeout, NULL); +#elif defined HAVE_NS + /* And NS builds call thread_select in ns_select. */ + nfds = ns_select (max_desc + 1, + &Available, (check_write ? &Writeok : 0), + NULL, &timeout, NULL); #else /* !HAVE_GLIB */ - nfds = thread_select ( -# ifdef HAVE_NS - ns_select -# else - pselect -# endif - , max_desc + 1, + nfds = thread_select (pselect, max_desc + 1, &Available, (check_write ? &Writeok : 0), NULL, &timeout, NULL); diff --git a/src/systhread.c b/src/systhread.c index a84060c18f..53dfe7a9c4 100644 --- a/src/systhread.c +++ b/src/systhread.c @@ -20,6 +20,10 @@ along with GNU Emacs. If not, see . */ #include #include "lisp.h" +#ifdef HAVE_NS +#include "nsterm.h" +#endif + #ifndef THREADS_ENABLED void @@ -130,6 +134,9 @@ void sys_cond_broadcast (sys_cond_t *cond) { pthread_cond_broadcast (cond); +#ifdef HAVE_NS + ns_select_break (); +#endif } void -- 2.12.0 --BOKacYhQ+x31HxR3--