Repercuter les modifs recentes sur posix.c -- a tester

git-svn-id: http://caml.inria.fr/svn/ocaml/trunk@1828 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02
master
Xavier Leroy 1997-12-02 13:12:07 +00:00
parent 3c1dede455
commit f8c6ae416a
1 changed files with 14 additions and 15 deletions

View File

@ -64,8 +64,9 @@ struct caml_thread_struct {
struct caml_thread_struct * next; /* Double linking of running threads */ struct caml_thread_struct * next; /* Double linking of running threads */
struct caml_thread_struct * prev; struct caml_thread_struct * prev;
#ifdef NATIVE_CODE #ifdef NATIVE_CODE
struct caml_context * last_context; char * bottom_of_stack; /* Saved value of caml_bottom_of_stack */
/* Saved value of caml_last_context */ unsigned long last_retaddr; /* Saved value of caml_last_return_address */
value * gc_regs; /* Saved value of caml_gc_regs */
char * exception_pointer; /* Saved value of caml_exception_pointer */ char * exception_pointer; /* Saved value of caml_exception_pointer */
struct caml__roots_block * local_roots; /* Saved value of local_roots */ struct caml__roots_block * local_roots; /* Saved value of local_roots */
#else #else
@ -96,14 +97,6 @@ static __declspec( thread ) struct channel * last_channel_locked = NULL;
/* Identifier for next thread creation */ /* Identifier for next thread creation */
static long thread_next_ident = 0; static long thread_next_ident = 0;
/* These declarations should go in some include file */
#ifdef NATIVE_CODE
extern char * caml_bottom_of_stack;
extern unsigned long caml_last_return_address;
extern char * caml_exception_pointer;
#endif
/* Forward declarations */ /* Forward declarations */
static void caml_wthread_error (char * msg); static void caml_wthread_error (char * msg);
@ -122,8 +115,9 @@ static void caml_thread_scan_roots(scanning_action action)
/* Don't rescan the stack of the current thread, it was done already */ /* Don't rescan the stack of the current thread, it was done already */
if (th != curr_thread) { if (th != curr_thread) {
#ifdef NATIVE_CODE #ifdef NATIVE_CODE
if (th->last_context != NULL) if (th->bottom_of_stack != NULL)
do_local_roots(action, th->last_context, th->local_roots); do_local_roots(action, th->bottom_of_stack, th->last_retaddr,
th->gc_regs, th->local_roots);
#else #else
do_local_roots(action, th->sp, th->stack_high, th->local_roots); do_local_roots(action, th->sp, th->stack_high, th->local_roots);
#endif #endif
@ -146,7 +140,9 @@ static void caml_thread_enter_blocking_section(void)
/* Save the stack-related global variables in the thread descriptor /* Save the stack-related global variables in the thread descriptor
of the current thread */ of the current thread */
#ifdef NATIVE_CODE #ifdef NATIVE_CODE
curr_thread->last_context = caml_last_context; curr_thread->bottom_of_stack = caml_bottom_of_stack;
curr_thread->last_retaddr = caml_last_return_address;
curr_thread->gc_regs = caml_gc_regs;
curr_thread->exception_pointer = caml_exception_pointer; curr_thread->exception_pointer = caml_exception_pointer;
curr_thread->local_roots = local_roots; curr_thread->local_roots = local_roots;
#else #else
@ -168,7 +164,9 @@ static void caml_thread_leave_blocking_section(void)
WaitForSingleObject(caml_mutex, INFINITE); WaitForSingleObject(caml_mutex, INFINITE);
/* Restore the stack-related global variables */ /* Restore the stack-related global variables */
#ifdef NATIVE_CODE #ifdef NATIVE_CODE
caml_last_context = curr_thread->last_context; caml_bottom_of_stack= curr_thread->bottom_of_stack;
caml_last_return_address = curr_thread->last_retaddr;
caml_gc_regs = curr_thread->gc_regs;
caml_exception_pointer = curr_thread->exception_pointer; caml_exception_pointer = curr_thread->exception_pointer;
local_roots = curr_thread->local_roots; local_roots = curr_thread->local_roots;
#else #else
@ -218,7 +216,7 @@ static void caml_io_mutex_unlock_exn(void)
if (last_channel_locked != NULL) caml_io_mutex_unlock(last_channel_locked); if (last_channel_locked != NULL) caml_io_mutex_unlock(last_channel_locked);
} }
/* The "tick" thread fakes a SIGVTALRM signal at regular intervals. */ /* The "tick" thread fakes a signal at regular intervals. */
static void * caml_thread_tick(void) static void * caml_thread_tick(void)
{ {
@ -347,6 +345,7 @@ value caml_thread_new(value clos) /* ML */
th->descr = descr; th->descr = descr;
#ifdef NATIVE_CODE #ifdef NATIVE_CODE
th->bottom_of_stack = NULL; th->bottom_of_stack = NULL;
th->exception_pointer = NULL;
th->local_roots = NULL; th->local_roots = NULL;
#else #else
/* Allocate the stacks */ /* Allocate the stacks */