[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Emacs-diffs] master 4c90369: Simplify thread initialization and GC
From: |
Paul Eggert |
Subject: |
[Emacs-diffs] master 4c90369: Simplify thread initialization and GC |
Date: |
Wed, 24 Apr 2019 16:37:19 -0400 (EDT) |
branch: master
commit 4c90369d77d3db1cbd37df7857e4706176fd7ba2
Author: Paul Eggert <address@hidden>
Commit: Paul Eggert <address@hidden>
Simplify thread initialization and GC
* src/lisp.h (PVECHEADERSIZE): New macro.
(XSETPVECTYPESIZE): Use it.
* src/search.c (syms_of_search): No need to initialize or
staticpro last_thing_searched or saved_last_thing_searched, as
the thread code arranges for initialization and GC.
* src/thread.c (main_thread): Initialize statically.
(Fmake_mutex, Fmake_condition_variable, Fmake_thread):
Use ALLOCATE_ZEROED_PSEUDOVECTOR rather than zeroing by hand.
(mark_one_thread): No need to mark Lisp_Object members.
(init_main_thread, init_threads_once): Remove. All uses removed.
---
src/emacs.c | 1 -
src/lisp.h | 8 +++---
src/search.c | 6 ----
src/thread.c | 92 ++++++++++++++++++++----------------------------------------
src/thread.h | 1 -
5 files changed, 34 insertions(+), 74 deletions(-)
diff --git a/src/emacs.c b/src/emacs.c
index 8655f71..86d2bc6 100644
--- a/src/emacs.c
+++ b/src/emacs.c
@@ -1436,7 +1436,6 @@ Using an Emacs configured with --with-x-toolkit=lucid
does not have this problem
if (!initialized)
{
init_alloc_once ();
- init_threads_once ();
init_obarray_once ();
init_eval_once ();
init_charset_once ();
diff --git a/src/lisp.h b/src/lisp.h
index 703fe76..70b2aa2 100644
--- a/src/lisp.h
+++ b/src/lisp.h
@@ -1279,11 +1279,11 @@ INLINE bool
#define XSETPVECTYPE(v, code) \
((v)->header.size |= PSEUDOVECTOR_FLAG | ((code) << PSEUDOVECTOR_AREA_BITS))
+#define PVECHEADERSIZE(code, lispsize, restsize) \
+ (PSEUDOVECTOR_FLAG | ((code) << PSEUDOVECTOR_AREA_BITS) \
+ | ((restsize) << PSEUDOVECTOR_SIZE_BITS) | (lispsize))
#define XSETPVECTYPESIZE(v, code, lispsize, restsize) \
- ((v)->header.size = (PSEUDOVECTOR_FLAG \
- | ((code) << PSEUDOVECTOR_AREA_BITS) \
- | ((restsize) << PSEUDOVECTOR_SIZE_BITS) \
- | (lispsize)))
+ ((v)->header.size = PVECHEADERSIZE (code, lispsize, restsize))
/* The cast to union vectorlike_header * avoids aliasing issues. */
#define XSETPSEUDOVECTOR(a, b, code) \
diff --git a/src/search.c b/src/search.c
index 7a6e680..dfbae5c 100644
--- a/src/search.c
+++ b/src/search.c
@@ -3387,12 +3387,6 @@ syms_of_search (void)
Fput (Qinvalid_regexp, Qerror_message,
build_pure_c_string ("Invalid regexp"));
- last_thing_searched = Qnil;
- staticpro (&last_thing_searched);
-
- saved_last_thing_searched = Qnil;
- staticpro (&saved_last_thing_searched);
-
re_match_object = Qnil;
staticpro (&re_match_object);
diff --git a/src/thread.c b/src/thread.c
index 670680f..e2deadd 100644
--- a/src/thread.c
+++ b/src/thread.c
@@ -35,7 +35,21 @@ union aligned_thread_state
};
verify (GCALIGNED (union aligned_thread_state));
-static union aligned_thread_state main_thread;
+static union aligned_thread_state main_thread
+ = {{
+ .header.size = PVECHEADERSIZE (PVEC_THREAD,
+ PSEUDOVECSIZE (struct thread_state,
+ event_object),
+ VECSIZE (struct thread_state)),
+ .m_last_thing_searched = LISPSYM_INITIALLY (Qnil),
+ .m_saved_last_thing_searched = LISPSYM_INITIALLY (Qnil),
+ .name = LISPSYM_INITIALLY (Qnil),
+ .function = LISPSYM_INITIALLY (Qnil),
+ .result = LISPSYM_INITIALLY (Qnil),
+ .error_symbol = LISPSYM_INITIALLY (Qnil),
+ .error_data = LISPSYM_INITIALLY (Qnil),
+ .event_object = LISPSYM_INITIALLY (Qnil),
+ }};
struct thread_state *current_thread = &main_thread.s;
@@ -261,19 +275,15 @@ NAME, if given, is used as the name of the mutex. The
name is
informational only. */)
(Lisp_Object name)
{
- struct Lisp_Mutex *mutex;
- Lisp_Object result;
-
if (!NILP (name))
CHECK_STRING (name);
- mutex = ALLOCATE_PSEUDOVECTOR (struct Lisp_Mutex, name, PVEC_MUTEX);
- memset ((char *) mutex + offsetof (struct Lisp_Mutex, mutex),
- 0, sizeof (struct Lisp_Mutex) - offsetof (struct Lisp_Mutex,
- mutex));
+ struct Lisp_Mutex *mutex
+ = ALLOCATE_ZEROED_PSEUDOVECTOR (struct Lisp_Mutex, name, PVEC_MUTEX);
mutex->name = name;
lisp_mutex_init (&mutex->mutex);
+ Lisp_Object result;
XSETMUTEX (result, mutex);
return result;
}
@@ -379,21 +389,17 @@ NAME, if given, is the name of this condition variable.
The name is
informational only. */)
(Lisp_Object mutex, Lisp_Object name)
{
- struct Lisp_CondVar *condvar;
- Lisp_Object result;
-
CHECK_MUTEX (mutex);
if (!NILP (name))
CHECK_STRING (name);
- condvar = ALLOCATE_PSEUDOVECTOR (struct Lisp_CondVar, name, PVEC_CONDVAR);
- memset ((char *) condvar + offsetof (struct Lisp_CondVar, cond),
- 0, sizeof (struct Lisp_CondVar) - offsetof (struct Lisp_CondVar,
- cond));
+ struct Lisp_CondVar *condvar
+ = ALLOCATE_ZEROED_PSEUDOVECTOR (struct Lisp_CondVar, name, PVEC_CONDVAR);
condvar->mutex = mutex;
condvar->name = name;
sys_cond_init (&condvar->cond);
+ Lisp_Object result;
XSETCONDVAR (result, condvar);
return result;
}
@@ -637,10 +643,8 @@ mark_one_thread (struct thread_state *thread)
mark_object (tem);
}
- mark_object (thread->m_last_thing_searched);
-
- if (!NILP (thread->m_saved_last_thing_searched))
- mark_object (thread->m_saved_last_thing_searched);
+ /* No need to mark Lisp_Object members like m_last_thing_searched,
+ as mark_threads_callback does that by calling mark_object. */
}
static void
@@ -792,12 +796,6 @@ When the function exits, the thread dies.
If NAME is given, it must be a string; it names the new thread. */)
(Lisp_Object function, Lisp_Object name)
{
- sys_thread_t thr;
- struct thread_state *new_thread;
- Lisp_Object result;
- const char *c_name = NULL;
- size_t offset = offsetof (struct thread_state, m_stack_bottom);
-
/* Can't start a thread in temacs. */
if (!initialized)
emacs_abort ();
@@ -805,20 +803,13 @@ If NAME is given, it must be a string; it names the new
thread. */)
if (!NILP (name))
CHECK_STRING (name);
- new_thread = ALLOCATE_PSEUDOVECTOR (struct thread_state, event_object,
- PVEC_THREAD);
- memset ((char *) new_thread + offset, 0,
- sizeof (struct thread_state) - offset);
-
+ struct thread_state *new_thread
+ = ALLOCATE_ZEROED_PSEUDOVECTOR (struct thread_state, event_object,
+ PVEC_THREAD);
new_thread->function = function;
new_thread->name = name;
- new_thread->m_last_thing_searched = Qnil; /* copy from parent? */
- new_thread->m_saved_last_thing_searched = Qnil;
+ /* Perhaps copy m_last_thing_searched from parent? */
new_thread->m_current_buffer = current_thread->m_current_buffer;
- new_thread->result = Qnil;
- new_thread->error_symbol = Qnil;
- new_thread->error_data = Qnil;
- new_thread->event_object = Qnil;
new_thread->m_specpdl_size = 50;
new_thread->m_specpdl = xmalloc ((1 + new_thread->m_specpdl_size)
@@ -833,9 +824,8 @@ If NAME is given, it must be a string; it names the new
thread. */)
new_thread->next_thread = all_threads;
all_threads = new_thread;
- if (!NILP (name))
- c_name = SSDATA (ENCODE_UTF_8 (name));
-
+ char const *c_name = !NILP (name) ? SSDATA (ENCODE_UTF_8 (name)) : NULL;
+ sys_thread_t thr;
if (! sys_thread_create (&thr, c_name, run_thread, new_thread))
{
/* Restore the previous situation. */
@@ -848,6 +838,7 @@ If NAME is given, it must be a string; it names the new
thread. */)
}
/* FIXME: race here where new thread might not be filled in? */
+ Lisp_Object result;
XSETTHREAD (result, new_thread);
return result;
}
@@ -1060,22 +1051,6 @@ thread_check_current_buffer (struct buffer *buffer)
-static void
-init_main_thread (void)
-{
- main_thread.s.header.size
- = PSEUDOVECSIZE (struct thread_state, event_object);
- XSETPVECTYPE (&main_thread.s, PVEC_THREAD);
- main_thread.s.m_last_thing_searched = Qnil;
- main_thread.s.m_saved_last_thing_searched = Qnil;
- main_thread.s.name = Qnil;
- main_thread.s.function = Qnil;
- main_thread.s.result = Qnil;
- main_thread.s.error_symbol = Qnil;
- main_thread.s.error_data = Qnil;
- main_thread.s.event_object = Qnil;
-}
-
bool
main_thread_p (const void *ptr)
{
@@ -1091,15 +1066,8 @@ in_current_thread (void)
}
void
-init_threads_once (void)
-{
- init_main_thread ();
-}
-
-void
init_threads (void)
{
- init_main_thread ();
sys_cond_init (&main_thread.s.thread_condvar);
sys_mutex_init (&global_lock);
sys_mutex_lock (&global_lock);
diff --git a/src/thread.h b/src/thread.h
index 0514669..498b990 100644
--- a/src/thread.h
+++ b/src/thread.h
@@ -287,7 +287,6 @@ extern void finalize_one_mutex (struct Lisp_Mutex *);
extern void finalize_one_condvar (struct Lisp_CondVar *);
extern void maybe_reacquire_global_lock (void);
-extern void init_threads_once (void);
extern void init_threads (void);
extern void syms_of_threads (void);
extern bool main_thread_p (const void *);
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [Emacs-diffs] master 4c90369: Simplify thread initialization and GC,
Paul Eggert <=