Commit 420f7bbf04a9405dc5d418edb548b440406db800

local_var_alist_ is shared by threads.

- buffer local values per-thread cleanup.
- any binding-testsuite.el test is completed successfully.
  
858858#define BUF_MODE_LINE_FORMAT(BUF) *find_variable_location (&((BUF)->mode_line_format_))
859859#define BUF_MODE_NAME(BUF) *find_variable_location (&((BUF)->mode_name_))
860860#define BUF_MAJOR_MODE(BUF) *find_variable_location (&((BUF)->major_mode_))
861#define BUF_LOCAL_VAR_ALIST(BUF) *find_variable_location (&((BUF)->local_var_alist_))
861#define BUF_LOCAL_VAR_ALIST(BUF) (((BUF)->local_var_alist_))
862862#define BUF_MARK(BUF) *find_variable_location (&((BUF)->mark_))
863863#define BUF_READ_ONLY(BUF) *find_variable_location (&((BUF)->read_only_))
864864#define BUF_AUTO_SAVE_FILE_NAME(BUF) *find_variable_location (&((BUF)->auto_save_file_name_))
src/data.c
(28 / 60)
  
814814}
815815
816816Lisp_Object *
817blocal_get_thread_data (struct Lisp_Buffer_Local_Value *l)
817blocal_get_thread_data (struct Lisp_Buffer_Local_Value *l, Lisp_Object symbol)
818818{
819819 Lisp_Object ret = assq_no_quit (get_current_thread (), l->thread_data);
820820 if (NILP (ret))
821821 {
822 Lisp_Object tem, val = Qnil, len, it, parent = Qnil;
822 Lisp_Object tem, val, len;
823823
824 for (it = l->thread_data; !NILP (it); it = XCDR (it))
825 {
826 Lisp_Object thread_data = XCDR (XCAR (it));
827 if ((EQ (Fcurrent_buffer (), BLOCAL_BUFFER_VEC (thread_data)))
828 && (! l->check_frame
829 || EQ (selected_frame, BLOCAL_FRAME_VEC (thread_data))))
830 {
831 Lisp_Object cdr = BLOCAL_CDR_VEC (thread_data);
832 parent = thread_data;
833 VECTORP (thread_data) || (abort (), 1);
834 if (EQ (XCAR (cdr), XCAR (XCAR (cdr))))
835 val = XCDR (assq_no_quit (XCAR (XCAR (it)),
836 XTHREADLOCAL (l->realvalue)->thread_alist));
837 else
838 val = XCDR (BLOCAL_CDR_VEC (thread_data));
824 if (NILP (symbol))
825 abort ();
839826
840 break;
841 }
842 }
843
844 if (EQ (parent, Qnil))
845 val = XTHREADLOCAL (l->realvalue)->global;
846
847827 XSETFASTINT (len, 4);
848828 ret = Fmake_vector (len, Qnil);
849829
850 if (NILP (parent))
851 XSETFASTINT (AREF (ret, 0), 0);
830 BLOCAL_CLEAR_FLAGS_VEC (ret);
831 tem = Fcons (Qnil, Qnil);
832 val = assq_no_quit (symbol, BUF_LOCAL_VAR_ALIST (current_buffer));
833 if (NILP (val) || (l->check_frame && ! EQ (selected_frame, Qnil)))
834 {
835 val = assq_no_quit (symbol, XFRAME (selected_frame)->param_alist);
836 if (! NILP (val))
837 BLOCAL_SET_FOUND_FOR_FRAME_VEC (ret);
838 else
839 {
840 val = XTHREADLOCAL (l->realvalue)->global;
841 XSETCAR (tem, tem);
842 }
843 }
852844 else
853 XSETFASTINT (AREF (ret, 0), AREF (parent, 0));
845 {
846 XSETCAR (tem, val);
847 val = XCDR (val);
848 XSETCDR (tem, XTHREADLOCAL (l->realvalue)->global);
849 BLOCAL_SET_FOUND_FOR_BUFFER_VEC (ret);
850 }
854851
855852 BLOCAL_BUFFER_VEC (ret) = Fcurrent_buffer ();
856853 BLOCAL_FRAME_VEC (ret) = Qnil;
857
858 tem = Fcons (Qnil, val);
859 XSETCAR (tem, tem);
860854 BLOCAL_CDR_VEC (ret) = tem;
861855
862856 ret = Fcons (get_current_thread (), ret);
11781178 def:
11791179 valcontents = SYMBOL_VALUE (symbol);
11801180 if (BUFFER_LOCAL_VALUEP (valcontents))
1181 {
1182 Lisp_Object cdr = BLOCAL_CDR (XBUFFER_LOCAL_VALUE (valcontents));
1183 if (EQ (XCAR (cdr), XCAR (XCAR (cdr))))
1184 {
1185 Lisp_Object it;
1186 for (it = XBUFFER_LOCAL_VALUE (valcontents)->thread_data;
1187 !NILP (it); it = XCDR (it))
1188 {
1189 Lisp_Object head = XCDR (XCAR (it));
1190 if (EQ (BLOCAL_BUFFER (XBUFFER_LOCAL_VALUE (valcontents)),
1191 BLOCAL_BUFFER_VEC (head))
1192 && (! XBUFFER_LOCAL_VALUE (valcontents)->check_frame
1193 || EQ (selected_frame, BLOCAL_FRAME_VEC (head))))
1194 {
1195 Lisp_Object rv
1196 = XBUFFER_LOCAL_VALUE (valcontents)->realvalue;
1197
1198 if (EQ (XCAR (BLOCAL_CDR_VEC (head)),
1199 XCAR (XCAR (BLOCAL_CDR_VEC (head)))))
1200 Fsetcdr (assq_no_quit (XCAR (XCAR (it)),
1201 XTHREADLOCAL (rv)->thread_alist),
1202 newval);
1203
1204 XSETCDR (XCAR (BLOCAL_CDR_VEC (head)), newval);
1205 }
1206 }
1207 }
1208 BLOCAL_REALVALUE (XBUFFER_LOCAL_VALUE (valcontents)) = newval;
1209 }
1181 BLOCAL_REALVALUE (XBUFFER_LOCAL_VALUE (valcontents)) = newval;
12101182 else if (THREADLOCALP (valcontents))
12111183 {
12121184 Lisp_Object val = indirect_variable (XSYMBOL (symbol))->value;
12281228{
12291229 register Lisp_Object tem1;
12301230
1231 tem1 = BLOCAL_BUFFER (XBUFFER_LOCAL_VALUE (valcontents));
1231 struct Lisp_Buffer_Local_Value *local = XBUFFER_LOCAL_VALUE (valcontents);
1232 blocal_get_thread_data (local, symbol);
1233 tem1 = BLOCAL_BUFFER (local);
12321234
12331235 if (NILP (tem1)
12341236 || current_buffer != XBUFFER (tem1)
src/lisp.h
(3 / 2)
  
13661366 };
13671367
13681368void blocal_unbind_thread (Lisp_Object thread);
1369Lisp_Object *blocal_get_thread_data (struct Lisp_Buffer_Local_Value *l);
1369Lisp_Object *blocal_get_thread_data (struct Lisp_Buffer_Local_Value *l,
1370 Lisp_Object sym);
13701371void blocal_set_thread_data (struct Lisp_Buffer_Local_Value *l, Lisp_Object o);
13711372Lisp_Object *blocal_getrealvalue (struct Lisp_Buffer_Local_Value *l);
13721373
13791379#define BLOCAL_BUFFER_VEC(VEC) (AREF ((VEC), 1))
13801380#define BLOCAL_FRAME_VEC(VEC) (AREF ((VEC), 2))
13811381#define BLOCAL_CDR_VEC(VEC) (AREF ((VEC), 3))
1382#define BLOCAL_THREAD_DATA(A) (*blocal_get_thread_data (A))
1382#define BLOCAL_THREAD_DATA(A) (*blocal_get_thread_data (A, Qnil))
13831383#define BLOCAL_SET_THREAD_DATA(A, B) (blocal_set_thread_data (A, B))
13841384#define BLOCAL_CLEAR_FLAGS(A) (BLOCAL_CLEAR_FLAGS_VEC (BLOCAL_THREAD_DATA (A)))
13851385#define BLOCAL_FOUND_FOR_BUFFER(A) (BLOCAL_FOUND_FOR_BUFFER_VEC (BLOCAL_THREAD_DATA (A)))