summaryrefslogtreecommitdiff
path: root/src/thread.c
diff options
context:
space:
mode:
authorEli Zaretskii <eliz@gnu.org>2016-12-12 18:03:40 +0200
committerEli Zaretskii <eliz@gnu.org>2016-12-12 18:03:40 +0200
commita416e1d6c111527205f3583c8d201bf95af6fa20 (patch)
tree60e58859632f072952f84dee959eb0a88f3c097a /src/thread.c
parent00d4ba2794243763b818c013669e36c1d2c7de62 (diff)
downloademacs-a416e1d6c111527205f3583c8d201bf95af6fa20.tar.gz
emacs-a416e1d6c111527205f3583c8d201bf95af6fa20.tar.bz2
emacs-a416e1d6c111527205f3583c8d201bf95af6fa20.zip
Fix point motion in cloned buffers
* src/thread.c (post_acquire_global_lock): Call set_buffer_internal_2 instead of tricking set_buffer_internal_1 into resetting the current buffer even if it didn't change. This avoids bug#25165, caused by failing to record the modified values of point and mark, because current_buffer was set to NULL. Also, don't bother re-setting the buffer if there was no thread switch, as that just wastes cycles. * src/buffer.c (set_buffer_internal_2): New function, with most of the body of set_buffer_internal_1, but without the test for B being identical to the current buffer. (set_buffer_internal_1): Call set_buffer_internal_2 if B is not identical to the current buffer. * src/buffer.h (set_buffer_internal_2): Add prototype. * test/src/thread-tests.el (thread-sticky-point): New test.
Diffstat (limited to 'src/thread.c')
-rw-r--r--src/thread.c11
1 files changed, 5 insertions, 6 deletions
diff --git a/src/thread.c b/src/thread.c
index 3e61723f0ab..6e9ca2e256b 100644
--- a/src/thread.c
+++ b/src/thread.c
@@ -55,7 +55,6 @@ release_global_lock (void)
static void
post_acquire_global_lock (struct thread_state *self)
{
- Lisp_Object buffer;
struct thread_state *prev_thread = current_thread;
/* Do this early on, so that code below could signal errors (e.g.,
@@ -71,12 +70,12 @@ post_acquire_global_lock (struct thread_state *self)
if (prev_thread != NULL)
unbind_for_thread_switch (prev_thread);
rebind_for_thread_switch ();
- }
- /* We need special handling to re-set the buffer. */
- XSETBUFFER (buffer, self->m_current_buffer);
- self->m_current_buffer = 0;
- set_buffer_internal (XBUFFER (buffer));
+ /* Set the new thread's current buffer. This needs to be done
+ even if it is the same buffer as that of the previous thread,
+ because of thread-local bindings. */
+ set_buffer_internal_2 (current_buffer);
+ }
if (!NILP (current_thread->error_symbol))
{