Commit c491e9ec719347110e51325f05b2ced92960668e

Unbind thread-bound variables when the thread is terminated.
src/data.c
(43 / 2)
  
837837
838838 XSETFASTINT (len, 4);
839839 ret = Fmake_vector (len, Qnil);
840
840
841841 if (NILP (parent))
842842 XSETFASTINT (AREF (ret, 0), 0);
843843 else
860860 return &XCDR_AS_LVALUE (ret);
861861}
862862
863/* Remove any thread-local data. */
863864void
865blocal_unbind_thread (Lisp_Object thread)
866{
867 struct buffer *b;
868 EMACS_UINT i;
869 struct Lisp_Vector *obarray = XVECTOR (Vobarray);
870 for (i = 0; i < obarray->size; i++)
871 {
872 struct Lisp_Symbol *sym;
873
874 if (!SYMBOLP (obarray->contents[i]))
875 continue;
876
877 sym = XSYMBOL (obarray->contents[i]);
878
879#define UNBIND_LOCAL_VALUE(X) do { \
880 Lisp_Object tem = assq_no_quit (thread, (X)); \
881 if (!NILP (tem)) \
882 (X) = Fdelq (tem, (X)); \
883 } while (0)
884
885 if (BUFFER_LOCAL_VALUEP (SYMBOL_VALUE (obarray->contents[i])))
886 {
887 struct Lisp_Buffer_Local_Value *loc
888 = XBUFFER_LOCAL_VALUE (SYMBOL_VALUE (obarray->contents[i]));
889
890 UNBIND_LOCAL_VALUE (loc->realvalue);
891 UNBIND_LOCAL_VALUE (loc->thread_data);
892 }
893
894 if (THREADLOCALP (SYMBOL_VALUE (obarray->contents[i])))
895 {
896 struct Lisp_ThreadLocal *val
897 = XTHREADLOCAL (SYMBOL_VALUE (obarray->contents[i]));
898 UNBIND_LOCAL_VALUE (val->thread_alist);
899 }
900 }
901#undef UNBIND_LOCAL_VALUE
902}
903
904void
864905blocal_set_thread_data (struct Lisp_Buffer_Local_Value *l, Lisp_Object obj)
865906{
866907 if (! NILP (l->thread_data))
11961196 Fsetcdr (assq_no_quit (XCAR (XCAR (it)),
11971197 XTHREADLOCAL (rv)->thread_alist),
11981198 newval);
1199 XSETCDR (XCAR (BLOCAL_CDR_VEC (head), newval);
1199 XSETCDR (XCAR (BLOCAL_CDR_VEC (head)), newval);
12001200 }
12011201 }
12021202 }
src/lisp.h
(1 / 0)
  
13651365 Lisp_Object thread_data;
13661366 };
13671367
1368void blocal_unbind_thread (Lisp_Object thread);
13681369Lisp_Object *blocal_get_thread_data (struct Lisp_Buffer_Local_Value *l);
13691370void blocal_set_thread_data (struct Lisp_Buffer_Local_Value *l, Lisp_Object o);
13701371Lisp_Object *blocal_getrealvalue (struct Lisp_Buffer_Local_Value *l);
  
240240 /* It might be nice to do something with errors here. */
241241 internal_condition_case (invoke_thread_function, Qt, do_nothing);
242242
243 blocal_unbind_thread (current_thread);
244
243245 /* Unlink this thread from the list of all threads. */
244246 for (iter = &all_threads; *iter != self; iter = &(*iter)->next_thread)
245247 ;