mirror of
https://git.savannah.gnu.org/git/guile.git
synced 2025-06-14 07:30:32 +02:00
Threading changes.
This commit is contained in:
parent
be1b896c82
commit
a54a94b397
34 changed files with 1298 additions and 1127 deletions
135
libguile/init.c
135
libguile/init.c
|
@ -133,46 +133,6 @@
|
|||
#include <unistd.h>
|
||||
#endif
|
||||
|
||||
/* Setting up the stack. */
|
||||
|
||||
static void
|
||||
restart_stack (void *base)
|
||||
{
|
||||
scm_dynwinds = SCM_EOL;
|
||||
SCM_DYNENV (scm_rootcont) = SCM_EOL;
|
||||
SCM_THROW_VALUE (scm_rootcont) = SCM_EOL;
|
||||
SCM_DFRAME (scm_rootcont) = scm_last_debug_frame = 0;
|
||||
SCM_BASE (scm_rootcont) = base;
|
||||
}
|
||||
|
||||
static void
|
||||
start_stack (void *base)
|
||||
{
|
||||
SCM root;
|
||||
|
||||
root = scm_permanent_object (scm_make_root (SCM_UNDEFINED));
|
||||
scm_set_root (SCM_ROOT_STATE (root));
|
||||
scm_stack_base = base;
|
||||
|
||||
scm_exitval = SCM_BOOL_F; /* vestigial */
|
||||
|
||||
scm_root->fluids = scm_i_make_initial_fluids ();
|
||||
|
||||
/* Create an object to hold the root continuation.
|
||||
*/
|
||||
{
|
||||
scm_t_contregs *contregs = scm_gc_malloc (sizeof (scm_t_contregs),
|
||||
"continuation");
|
||||
contregs->num_stack_items = 0;
|
||||
contregs->seq = 0;
|
||||
SCM_NEWSMOB (scm_rootcont, scm_tc16_continuation, contregs);
|
||||
}
|
||||
|
||||
/* The remainder of stack initialization is factored out to another
|
||||
* function so that if this stack is ever exitted, it can be
|
||||
* re-entered using restart_stack. */
|
||||
restart_stack (base);
|
||||
}
|
||||
|
||||
|
||||
#if 0
|
||||
|
@ -345,11 +305,9 @@ struct main_func_closure
|
|||
char **argv; /* the argument list it should receive */
|
||||
};
|
||||
|
||||
|
||||
static void scm_init_guile_1 (SCM_STACKITEM *base);
|
||||
static void scm_boot_guile_1 (SCM_STACKITEM *base,
|
||||
struct main_func_closure *closure);
|
||||
static SCM invoke_main_func(void *body_data);
|
||||
static void *invoke_main_func(void *body_data);
|
||||
|
||||
|
||||
/* Fire up the Guile Scheme interpreter.
|
||||
|
@ -383,10 +341,6 @@ static SCM invoke_main_func(void *body_data);
|
|||
void
|
||||
scm_boot_guile (int argc, char ** argv, void (*main_func) (), void *closure)
|
||||
{
|
||||
/* The garbage collector uses the address of this variable as one
|
||||
end of the stack, and the address of one of its own local
|
||||
variables as the other end. */
|
||||
SCM_STACKITEM dummy;
|
||||
struct main_func_closure c;
|
||||
|
||||
c.main_func = main_func;
|
||||
|
@ -394,19 +348,47 @@ scm_boot_guile (int argc, char ** argv, void (*main_func) (), void *closure)
|
|||
c.argc = argc;
|
||||
c.argv = argv;
|
||||
|
||||
scm_boot_guile_1 (&dummy, &c);
|
||||
scm_with_guile (invoke_main_func, &c);
|
||||
}
|
||||
|
||||
static void *
|
||||
invoke_main_func (void *body_data)
|
||||
{
|
||||
struct main_func_closure *closure = (struct main_func_closure *) body_data;
|
||||
|
||||
scm_set_program_arguments (closure->argc, closure->argv, 0);
|
||||
(*closure->main_func) (closure->closure, closure->argc, closure->argv);
|
||||
|
||||
scm_restore_signals ();
|
||||
|
||||
/* This tick gives any pending
|
||||
* asyncs a chance to run. This must be done after
|
||||
* the call to scm_restore_signals.
|
||||
*/
|
||||
SCM_ASYNC_TICK;
|
||||
|
||||
/* If the caller doesn't want this, they should exit from main_func
|
||||
themselves.
|
||||
*/
|
||||
pthread_exit (NULL);
|
||||
|
||||
/* never reached */
|
||||
return NULL;
|
||||
}
|
||||
|
||||
#if 0
|
||||
void
|
||||
scm_init_guile ()
|
||||
{
|
||||
scm_init_guile_1 ((SCM_STACKITEM *)scm_get_stack_base ());
|
||||
scm_i_init_guile ((SCM_STACKITEM *)scm_get_stack_base ());
|
||||
}
|
||||
#endif
|
||||
|
||||
pthread_mutex_t scm_i_init_mutex = PTHREAD_MUTEX_INITIALIZER;
|
||||
int scm_initialized_p = 0;
|
||||
|
||||
static void
|
||||
scm_init_guile_1 (SCM_STACKITEM *base)
|
||||
void
|
||||
scm_i_init_guile (SCM_STACKITEM *base)
|
||||
{
|
||||
if (scm_initialized_p)
|
||||
return;
|
||||
|
@ -427,7 +409,7 @@ scm_init_guile_1 (SCM_STACKITEM *base)
|
|||
scm_block_gc = 1;
|
||||
|
||||
scm_storage_prehistory ();
|
||||
scm_threads_prehistory ();
|
||||
scm_threads_prehistory (base);
|
||||
scm_ports_prehistory ();
|
||||
scm_smob_prehistory ();
|
||||
scm_hashtab_prehistory (); /* requires storage_prehistory */
|
||||
|
@ -448,8 +430,7 @@ scm_init_guile_1 (SCM_STACKITEM *base)
|
|||
scm_init_variable (); /* all bindings need variables */
|
||||
scm_init_continuations ();
|
||||
scm_init_root (); /* requires continuations */
|
||||
scm_init_threads (base);
|
||||
start_stack (base);
|
||||
scm_init_threads ();
|
||||
scm_init_gsubr ();
|
||||
scm_init_thread_procs (); /* requires gsubrs */
|
||||
scm_init_procprop ();
|
||||
|
@ -551,6 +532,8 @@ scm_init_guile_1 (SCM_STACKITEM *base)
|
|||
scm_i_init_deprecated ();
|
||||
#endif
|
||||
|
||||
scm_init_threads_root_root ();
|
||||
|
||||
scm_initialized_p = 1;
|
||||
|
||||
scm_block_gc = 0; /* permit the gc to run */
|
||||
|
@ -567,50 +550,6 @@ scm_init_guile_1 (SCM_STACKITEM *base)
|
|||
scm_load_startup_files ();
|
||||
}
|
||||
|
||||
/* Record here whether SCM_BOOT_GUILE_1 has already been called. This
|
||||
variable is now here and not inside SCM_BOOT_GUILE_1 so that one
|
||||
can tweak it. This is necessary for unexec to work. (Hey, "1-live"
|
||||
is the name of a local radiostation...) */
|
||||
|
||||
int scm_boot_guile_1_live = 0;
|
||||
|
||||
static void
|
||||
scm_boot_guile_1 (SCM_STACKITEM *base, struct main_func_closure *closure)
|
||||
{
|
||||
scm_init_guile_1 (base);
|
||||
|
||||
/* This function is not re-entrant. */
|
||||
if (scm_boot_guile_1_live)
|
||||
abort ();
|
||||
|
||||
scm_boot_guile_1_live = 1;
|
||||
|
||||
scm_set_program_arguments (closure->argc, closure->argv, 0);
|
||||
invoke_main_func (closure);
|
||||
|
||||
scm_restore_signals ();
|
||||
|
||||
/* This tick gives any pending
|
||||
* asyncs a chance to run. This must be done after
|
||||
* the call to scm_restore_signals.
|
||||
*/
|
||||
SCM_ASYNC_TICK;
|
||||
|
||||
/* If the caller doesn't want this, they should return from
|
||||
main_func themselves. */
|
||||
exit (0);
|
||||
}
|
||||
|
||||
static SCM
|
||||
invoke_main_func (void *body_data)
|
||||
{
|
||||
struct main_func_closure *closure = (struct main_func_closure *) body_data;
|
||||
|
||||
(*closure->main_func) (closure->closure, closure->argc, closure->argv);
|
||||
|
||||
/* never reached */
|
||||
return SCM_UNDEFINED;
|
||||
}
|
||||
|
||||
/*
|
||||
Local Variables:
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue