diff options
author | Eli Zaretskii <eliz@gnu.org> | 2016-12-12 18:03:40 +0200 |
---|---|---|
committer | Eli Zaretskii <eliz@gnu.org> | 2016-12-12 18:03:40 +0200 |
commit | a416e1d6c111527205f3583c8d201bf95af6fa20 (patch) | |
tree | 60e58859632f072952f84dee959eb0a88f3c097a /src/thread.c | |
parent | 00d4ba2794243763b818c013669e36c1d2c7de62 (diff) | |
download | emacs-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.c | 11 |
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)) { |