summaryrefslogtreecommitdiff
path: root/src/thread.c
diff options
context:
space:
mode:
authorPip Cet <pipcet@gmail.com>2020-08-21 14:56:06 +0200
committerLars Ingebrigtsen <larsi@gnus.org>2020-08-21 14:56:06 +0200
commit9c62ffb08262c82b7e38e6eb5767f2087424aa47 (patch)
treeea2a18eabffded063b40af0623b2485b10ad44dc /src/thread.c
parent19ee08f1e8599ce0e0465f6ffbd4a76791d791b4 (diff)
downloademacs-9c62ffb08262c82b7e38e6eb5767f2087424aa47.tar.gz
Fix lock failures in xg_select
* src/xgselect.c (release_select_lock, acquire_select_lock): Introduce. (xg_select): Use `acquire_select_lock', `release_select_lock'. * src/thread.c (release_select_lock): Introduce for non-GLib builds. (really_call_select): Call `release_select_lock'. Simplify by ensuring acquisition of the lock always succeeds (bug#36609).
Diffstat (limited to 'src/thread.c')
-rw-r--r--src/thread.c8
1 files changed, 8 insertions, 0 deletions
diff --git a/src/thread.c b/src/thread.c
index b638dd77f8b..b4d8a53cf68 100644
--- a/src/thread.c
+++ b/src/thread.c
@@ -28,6 +28,12 @@ along with GNU Emacs. If not, see <https://www.gnu.org/licenses/>. */
#include "pdumper.h"
#include "keyboard.h"
+#ifdef HAVE_GLIB
+#include <xgselect.h>
+#else
+#define release_select_lock() do { } while (0)
+#endif
+
union aligned_thread_state
{
struct thread_state s;
@@ -586,6 +592,8 @@ really_call_select (void *arg)
sa->result = (sa->func) (sa->max_fds, sa->rfds, sa->wfds, sa->efds,
sa->timeout, sa->sigmask);
+ release_select_lock ();
+
block_interrupt_signal (&oldset);
/* If we were interrupted by C-g while inside sa->func above, the
signal handler could have called maybe_reacquire_global_lock, in