Function: make-thread
make-thread is a function defined in thread.c.
Signature
(make-thread FUNCTION &optional NAME)
Documentation
Start a new thread and run FUNCTION in it.
When the function exits, the thread dies. If NAME is given, it must be a string; it names the new thread.
Source Code
// Defined in /usr/src/emacs/src/thread.c
{
/* Can't start a thread in temacs. */
if (!initialized)
emacs_abort ();
if (!NILP (name))
CHECK_STRING (name);
struct thread_state *new_thread
= ALLOCATE_ZEROED_PSEUDOVECTOR (struct thread_state, event_object,
PVEC_THREAD);
new_thread->function = function;
new_thread->name = name;
/* Perhaps copy m_last_thing_searched from parent? */
new_thread->m_current_buffer = current_thread->m_current_buffer;
ptrdiff_t size = 50;
union specbinding *pdlvec = xmalloc ((1 + size) * sizeof (union specbinding));
new_thread->m_specpdl = pdlvec + 1; /* Skip the dummy entry. */
new_thread->m_specpdl_end = new_thread->m_specpdl + size;
new_thread->m_specpdl_ptr = new_thread->m_specpdl;
init_bc_thread (&new_thread->bc);
sys_cond_init (&new_thread->thread_condvar);
/* We'll need locking here eventually. */
new_thread->next_thread = all_threads;
all_threads = new_thread;
char const *c_name = !NILP (name) ? SSDATA (ENCODE_SYSTEM (name)) : NULL;
if (c_name)
new_thread->thread_name = xstrdup (c_name);
else
new_thread->thread_name = NULL;
sys_thread_t thr;
if (! sys_thread_create (&thr, run_thread, new_thread))
{
/* Restore the previous situation. */
all_threads = all_threads->next_thread;
#ifdef THREADS_ENABLED
error ("Could not start a new thread");
#else
error ("Concurrency is not supported in this configuration");
#endif
}
/* FIXME: race here where new thread might not be filled in? */
Lisp_Object result;
XSETTHREAD (result, new_thread);
return result;
}