From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.org!.POSTED.blaine.gmane.org!not-for-mail From: Eli Zaretskii Newsgroups: gmane.emacs.bugs Subject: bug#36609: 27.0.50; Possible race-condition in threading implementation Date: Fri, 12 Jul 2019 18:02:52 +0300 Message-ID: <83blxz2t43.fsf@gnu.org> References: <87muhks3b5.fsf@hochschule-trier.de> <83k1cn2z0l.fsf@gnu.org> <83ftnb2wf9.fsf@gnu.org> Injection-Info: blaine.gmane.org; posting-host="blaine.gmane.org:195.159.176.226"; logging-data="204287"; mail-complaints-to="usenet@blaine.gmane.org" Cc: 36609@debbugs.gnu.org, politza@hochschule-trier.de To: Pip Cet Original-X-From: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane.org@gnu.org Fri Jul 12 17:19:41 2019 Return-path: Envelope-to: geb-bug-gnu-emacs@m.gmane.org Original-Received: from lists.gnu.org ([209.51.188.17]) by blaine.gmane.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.89) (envelope-from ) id 1hlxKm-000qqZ-En for geb-bug-gnu-emacs@m.gmane.org; Fri, 12 Jul 2019 17:19:40 +0200 Original-Received: from localhost ([::1]:50348 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.86_2) (envelope-from ) id 1hlx5i-0004Qc-Vp for geb-bug-gnu-emacs@m.gmane.org; Fri, 12 Jul 2019 11:04:06 -0400 Original-Received: from eggs.gnu.org ([2001:470:142:3::10]:54220) by lists.gnu.org with esmtp (Exim 4.86_2) (envelope-from ) id 1hlx5f-0004QS-Ct for bug-gnu-emacs@gnu.org; Fri, 12 Jul 2019 11:04:04 -0400 Original-Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1hlx5e-00036O-BQ for bug-gnu-emacs@gnu.org; Fri, 12 Jul 2019 11:04:03 -0400 Original-Received: from debbugs.gnu.org ([209.51.188.43]:59951) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1hlx5e-00036H-7o for bug-gnu-emacs@gnu.org; Fri, 12 Jul 2019 11:04:02 -0400 Original-Received: from Debian-debbugs by debbugs.gnu.org with local (Exim 4.84_2) (envelope-from ) id 1hlx5e-0002Se-0W for bug-gnu-emacs@gnu.org; Fri, 12 Jul 2019 11:04:02 -0400 X-Loop: help-debbugs@gnu.org Resent-From: Eli Zaretskii Original-Sender: "Debbugs-submit" Resent-CC: bug-gnu-emacs@gnu.org Resent-Date: Fri, 12 Jul 2019 15:04:01 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: followup 36609 X-GNU-PR-Package: emacs Original-Received: via spool by 36609-submit@debbugs.gnu.org id=B36609.15629437979406 (code B ref 36609); Fri, 12 Jul 2019 15:04:01 +0000 Original-Received: (at 36609) by debbugs.gnu.org; 12 Jul 2019 15:03:17 +0000 Original-Received: from localhost ([127.0.0.1]:40539 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1hlx4v-0002Re-3I for submit@debbugs.gnu.org; Fri, 12 Jul 2019 11:03:17 -0400 Original-Received: from eggs.gnu.org ([209.51.188.92]:41566) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1hlx4t-0002RR-3I for 36609@debbugs.gnu.org; Fri, 12 Jul 2019 11:03:15 -0400 Original-Received: from fencepost.gnu.org ([2001:470:142:3::e]:41860) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1hlx4m-00028U-9z; Fri, 12 Jul 2019 11:03:09 -0400 Original-Received: from [176.228.60.248] (port=2185 helo=home-c4e4a596f7) by fencepost.gnu.org with esmtpsa (TLS1.2:RSA_AES_256_CBC_SHA1:256) (Exim 4.82) (envelope-from ) id 1hlx4k-00051e-1v; Fri, 12 Jul 2019 11:03:07 -0400 In-reply-to: (message from Pip Cet on Fri, 12 Jul 2019 14:34:44 +0000) X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] 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: 209.51.188.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:162784 Archived-At: > From: Pip Cet > Date: Fri, 12 Jul 2019 14:34:44 +0000 > Cc: politza@hochschule-trier.de, 36609@debbugs.gnu.org > > > > When a thread is signalled (by thread-signal, which sets another > > > thread's error_symbol) while the signalled thread is inside a > > > select(), thread_select() will return non-locally for that thread, and > > > we fail to release an internal GLib lock through > > > g_main_context_release(). That's the first bug. > > > > We should either release the global lock before the thread exits, or > > defer the acting upon the signal until later. We cannot disable the > > signal handling altogether because it is entirely legitimate to signal > > another thread, and when we do, that other thread will _always_ be > > inside thread_select. > > Really? What about thread-yield? What about it? You are asking whether, when thread-signal is executed, the thread which we are signaling is necessarily parked inside thread_select? If so, I don't understand your surprise: only one thread can ever be running, and that is by definition the thread which calls thread-signal. All the other threads cannot be running, which means they are parked either in thread_select or in sys_mutex_lock called from acquire_global_lock. Right? As for thread-yield, I'm not sure I understand how is it related to the issue we are discussing. > > For the main thread, handling the signal in that situation shouldn't > > be a problem, because it is not going to exit. Right? > > I think the main thread can still fail to release the lock... Since the main thread doesn't exit, but just longjmp's to top-level, and then continues to run, why does it need to release the lock? Any thread should hold the lock for as long as it runs. > > > When xg_select() fails to acquire the internal GLib lock, it simply > > > does a select() on the remaining file descriptors: > > > > Why does it fail to acquire that lock? > > Because another thread holds it, either an Emacs or a non-Emacs > thread. OK, and why is it a problem that we continue calling thread_select regardless of the failure to acquire the Glib lock? is the problem this one: > In both cases, I think we might miss events unless we return > with errno == EINTR. ? Or is there something else? If the problem with missing events, then which events are those, and what bad things will happen if we miss them?