1
Fork 0
mirror of https://git.savannah.gnu.org/git/guile.git synced 2025-05-01 04:10:18 +02:00

Inline struct scm_vm into struct scm_i_thread

* libguile/threads.h (scm_i_thread): Inline struct scm_vm into struct
  scm_i_thread, as these exist in a one-to-one relationship.
* libguile/threads.c (guilify_self_1, thread_mark, on_thread_exit):
* libguile/control.c (scm_suspendable_continuation_p):
* libguile/vm.c (init_vm, thread_vm): Adapt users.
This commit is contained in:
Andy Wingo 2018-06-24 08:59:42 +02:00
parent aad5bfed60
commit 2480761bde
4 changed files with 13 additions and 30 deletions

View file

@ -223,7 +223,7 @@ scm_suspendable_continuation_p (SCM tag)
if (scm_dynstack_find_prompt (&thread->dynstack, tag, &flags, if (scm_dynstack_find_prompt (&thread->dynstack, tag, &flags,
NULL, NULL, NULL, &registers)) NULL, NULL, NULL, &registers))
return scm_from_bool (registers == thread->vp->resumable_prompt_cookie); return scm_from_bool (registers == thread->vm.resumable_prompt_cookie);
return SCM_BOOL_F; return SCM_BOOL_F;
} }

View file

@ -114,8 +114,8 @@ thread_mark (GC_word *addr, struct GC_ms_entry *mark_stack_ptr,
} }
} }
if (t->vp) if (t->vm.stack_bottom)
mark_stack_ptr = scm_i_vm_mark_stack (t->vp, mark_stack_ptr, mark_stack_ptr = scm_i_vm_mark_stack (&t->vm, mark_stack_ptr,
mark_stack_limit); mark_stack_limit);
return mark_stack_ptr; return mark_stack_ptr;
@ -380,23 +380,17 @@ guilify_self_1 (struct GC_stack_base *base, int needs_unregister)
cause GC to run, and GC could cause finalizers, which could invoke cause GC to run, and GC could cause finalizers, which could invoke
Scheme functions, which need the current thread to be set. */ Scheme functions, which need the current thread to be set. */
memset (&t, 0, sizeof (t));
t.pthread = scm_i_pthread_self (); t.pthread = scm_i_pthread_self ();
t.handle = SCM_BOOL_F; t.handle = SCM_BOOL_F;
t.result = SCM_BOOL_F; t.result = SCM_BOOL_F;
t.freelists = NULL;
t.pointerless_freelists = NULL;
t.dynamic_state = NULL;
t.dynstack.base = NULL;
t.dynstack.top = NULL;
t.dynstack.limit = NULL;
t.pending_asyncs = SCM_EOL; t.pending_asyncs = SCM_EOL;
t.block_asyncs = 1; t.block_asyncs = 1;
t.base = base->mem_base; t.base = base->mem_base;
t.continuation_root = SCM_EOL; t.continuation_root = SCM_EOL;
t.continuation_base = t.base; t.continuation_base = t.base;
scm_i_pthread_cond_init (&t.sleep_cond, NULL); scm_i_pthread_cond_init (&t.sleep_cond, NULL);
t.wake = NULL;
t.vp = NULL;
if (pipe2 (t.sleep_pipe, O_CLOEXEC) != 0) if (pipe2 (t.sleep_pipe, O_CLOEXEC) != 0)
/* FIXME: Error conditions during the initialization phase are handled /* FIXME: Error conditions during the initialization phase are handled
@ -514,12 +508,7 @@ on_thread_exit (void *v)
t->dynstack.base = NULL; t->dynstack.base = NULL;
t->dynstack.top = NULL; t->dynstack.top = NULL;
t->dynstack.limit = NULL; t->dynstack.limit = NULL;
{ scm_i_vm_free_stack (&t->vm);
struct scm_vm *vp = t->vp;
t->vp = NULL;
if (vp)
scm_i_vm_free_stack (vp);
}
#ifdef SCM_HAVE_THREAD_STORAGE_CLASS #ifdef SCM_HAVE_THREAD_STORAGE_CLASS
scm_i_current_thread = NULL; scm_i_current_thread = NULL;

View file

@ -30,6 +30,7 @@
#include "libguile/iselect.h" #include "libguile/iselect.h"
#include "libguile/smob.h" #include "libguile/smob.h"
#include "libguile/continuations.h" #include "libguile/continuations.h"
#include "libguile/vm.h"
#if SCM_USE_PTHREAD_THREADS #if SCM_USE_PTHREAD_THREADS
#include "libguile/pthread-threads.h" #include "libguile/pthread-threads.h"
@ -102,7 +103,7 @@ typedef struct scm_i_thread {
SCM_STACKITEM *continuation_base; SCM_STACKITEM *continuation_base;
/* For keeping track of the stack and registers. */ /* For keeping track of the stack and registers. */
struct scm_vm *vp; struct scm_vm vm;
SCM_STACKITEM *base; SCM_STACKITEM *base;
jmp_buf regs; jmp_buf regs;
} scm_i_thread; } scm_i_thread;

View file

@ -826,14 +826,10 @@ expand_stack (union scm_vm_stack_element *old_bottom, size_t old_size,
} }
#undef FUNC_NAME #undef FUNC_NAME
static struct scm_vm * static void
make_vm (void) init_vm (struct scm_vm *vp)
#define FUNC_NAME "make_vm"
{ {
int i; int i;
struct scm_vm *vp;
vp = scm_gc_malloc (sizeof (struct scm_vm), "vm");
vp->stack_size = page_size / sizeof (union scm_vm_stack_element); vp->stack_size = page_size / sizeof (union scm_vm_stack_element);
vp->stack_bottom = allocate_stack (vp->stack_size); vp->stack_bottom = allocate_stack (vp->stack_size);
@ -854,10 +850,7 @@ make_vm (void)
vp->trace_level = 0; vp->trace_level = 0;
for (i = 0; i < SCM_VM_NUM_HOOKS; i++) for (i = 0; i < SCM_VM_NUM_HOOKS; i++)
vp->hooks[i] = SCM_BOOL_F; vp->hooks[i] = SCM_BOOL_F;
return vp;
} }
#undef FUNC_NAME
static void static void
return_unused_stack_to_os (struct scm_vm *vp) return_unused_stack_to_os (struct scm_vm *vp)
@ -1158,10 +1151,10 @@ vm_expand_stack (struct scm_vm *vp, union scm_vm_stack_element *new_sp)
static struct scm_vm * static struct scm_vm *
thread_vm (scm_i_thread *t) thread_vm (scm_i_thread *t)
{ {
if (SCM_UNLIKELY (!t->vp)) if (SCM_UNLIKELY (!t->vm.stack_bottom))
t->vp = make_vm (); init_vm (&t->vm);
return t->vp; return &t->vm;
} }
struct scm_vm * struct scm_vm *