Commit c491e9ec719347110e51325f05b2ced92960668e
- Diff rendering mode:
- inline
- side by side
src/data.c
(43 / 2)
|   | |||
| 837 | 837 | ||
| 838 | 838 | XSETFASTINT (len, 4); | |
| 839 | 839 | ret = Fmake_vector (len, Qnil); | |
| 840 | |||
| 840 | |||
| 841 | 841 | if (NILP (parent)) | |
| 842 | 842 | XSETFASTINT (AREF (ret, 0), 0); | |
| 843 | 843 | else | |
| … | … | ||
| 860 | 860 | return &XCDR_AS_LVALUE (ret); | |
| 861 | 861 | } | |
| 862 | 862 | ||
| 863 | /* Remove any thread-local data. */ | ||
| 863 | 864 | void | |
| 865 | blocal_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 | |||
| 904 | void | ||
| 864 | 905 | blocal_set_thread_data (struct Lisp_Buffer_Local_Value *l, Lisp_Object obj) | |
| 865 | 906 | { | |
| 866 | 907 | if (! NILP (l->thread_data)) | |
| … | … | ||
| 1196 | 1196 | Fsetcdr (assq_no_quit (XCAR (XCAR (it)), | |
| 1197 | 1197 | XTHREADLOCAL (rv)->thread_alist), | |
| 1198 | 1198 | newval); | |
| 1199 | XSETCDR (XCAR (BLOCAL_CDR_VEC (head), newval); | ||
| 1199 | XSETCDR (XCAR (BLOCAL_CDR_VEC (head)), newval); | ||
| 1200 | 1200 | } | |
| 1201 | 1201 | } | |
| 1202 | 1202 | } |
src/lisp.h
(1 / 0)
|   | |||
| 1365 | 1365 | Lisp_Object thread_data; | |
| 1366 | 1366 | }; | |
| 1367 | 1367 | ||
| 1368 | void blocal_unbind_thread (Lisp_Object thread); | ||
| 1368 | 1369 | Lisp_Object *blocal_get_thread_data (struct Lisp_Buffer_Local_Value *l); | |
| 1369 | 1370 | void blocal_set_thread_data (struct Lisp_Buffer_Local_Value *l, Lisp_Object o); | |
| 1370 | 1371 | Lisp_Object *blocal_getrealvalue (struct Lisp_Buffer_Local_Value *l); |
src/thread.c
(2 / 0)
|   | |||
| 240 | 240 | /* It might be nice to do something with errors here. */ | |
| 241 | 241 | internal_condition_case (invoke_thread_function, Qt, do_nothing); | |
| 242 | 242 | ||
| 243 | blocal_unbind_thread (current_thread); | ||
| 244 | |||
| 243 | 245 | /* Unlink this thread from the list of all threads. */ | |
| 244 | 246 | for (iter = &all_threads; *iter != self; iter = &(*iter)->next_thread) | |
| 245 | 247 | ; |

