diff options
| author | Eli Zaretskii | 2016-12-22 18:13:16 +0200 |
|---|---|---|
| committer | Eli Zaretskii | 2016-12-22 18:13:16 +0200 |
| commit | 5fcc777ff36c3102ddddd2fb932cb8d0b7cc2741 (patch) | |
| tree | 17c618f6fa1b60537f0eef627432b7bc9ebefa5e | |
| parent | 3ec1503374d3115651c130eaeee31181266d0863 (diff) | |
| download | emacs-5fcc777ff36c3102ddddd2fb932cb8d0b7cc2741.tar.gz emacs-5fcc777ff36c3102ddddd2fb932cb8d0b7cc2741.zip | |
Fix last change with thread marking under GC_CHECK_MARKED_OBJECTS
* src/thread.c (primary_thread_p): New function.
* src/alloc.c (mark_object): Use 'primary_thread_p' to bypass tests
meant for thread objects allocated dynamically.
* src/thread.h (primary_thread_p): Add prototype.
| -rw-r--r-- | src/alloc.c | 4 | ||||
| -rw-r--r-- | src/thread.c | 6 | ||||
| -rw-r--r-- | src/thread.h | 1 |
3 files changed, 9 insertions, 2 deletions
diff --git a/src/alloc.c b/src/alloc.c index e979f3631ee..93ea286cfb8 100644 --- a/src/alloc.c +++ b/src/alloc.c | |||
| @@ -6406,7 +6406,7 @@ mark_object (Lisp_Object arg) | |||
| 6406 | 6406 | ||
| 6407 | #ifdef GC_CHECK_MARKED_OBJECTS | 6407 | #ifdef GC_CHECK_MARKED_OBJECTS |
| 6408 | m = mem_find (po); | 6408 | m = mem_find (po); |
| 6409 | if (m == MEM_NIL && !SUBRP (obj) && !THREADP (obj)) | 6409 | if (m == MEM_NIL && !SUBRP (obj) && !primary_thread_p (po)) |
| 6410 | emacs_abort (); | 6410 | emacs_abort (); |
| 6411 | #endif /* GC_CHECK_MARKED_OBJECTS */ | 6411 | #endif /* GC_CHECK_MARKED_OBJECTS */ |
| 6412 | 6412 | ||
| @@ -6418,7 +6418,7 @@ mark_object (Lisp_Object arg) | |||
| 6418 | 6418 | ||
| 6419 | if (pvectype != PVEC_SUBR | 6419 | if (pvectype != PVEC_SUBR |
| 6420 | && pvectype != PVEC_BUFFER | 6420 | && pvectype != PVEC_BUFFER |
| 6421 | && pvectype != PVEC_THREAD) | 6421 | && !primary_thread_p (po)) |
| 6422 | CHECK_LIVE (live_vector_p); | 6422 | CHECK_LIVE (live_vector_p); |
| 6423 | 6423 | ||
| 6424 | switch (pvectype) | 6424 | switch (pvectype) |
diff --git a/src/thread.c b/src/thread.c index bf2cf1b06c8..6966df31d37 100644 --- a/src/thread.c +++ b/src/thread.c | |||
| @@ -950,6 +950,12 @@ init_primary_thread (void) | |||
| 950 | primary_thread.event_object = Qnil; | 950 | primary_thread.event_object = Qnil; |
| 951 | } | 951 | } |
| 952 | 952 | ||
| 953 | bool | ||
| 954 | primary_thread_p (void *ptr) | ||
| 955 | { | ||
| 956 | return (ptr == &primary_thread) ? true : false; | ||
| 957 | } | ||
| 958 | |||
| 953 | void | 959 | void |
| 954 | init_threads_once (void) | 960 | init_threads_once (void) |
| 955 | { | 961 | { |
diff --git a/src/thread.h b/src/thread.h index 7dee67d6595..0090652b358 100644 --- a/src/thread.h +++ b/src/thread.h | |||
| @@ -236,6 +236,7 @@ extern void maybe_reacquire_global_lock (void); | |||
| 236 | extern void init_threads_once (void); | 236 | extern void init_threads_once (void); |
| 237 | extern void init_threads (void); | 237 | extern void init_threads (void); |
| 238 | extern void syms_of_threads (void); | 238 | extern void syms_of_threads (void); |
| 239 | extern bool primary_thread_p (void *); | ||
| 239 | 240 | ||
| 240 | typedef int select_func (int, fd_set *, fd_set *, fd_set *, | 241 | typedef int select_func (int, fd_set *, fd_set *, fd_set *, |
| 241 | const struct timespec *, const sigset_t *); | 242 | const struct timespec *, const sigset_t *); |