Update of /cvsroot/sbcl/sbcl/src/runtime In directory sc8-pr-cvs1:/tmp/cvs-serv27362/src/runtime Modified Files: Tag: dan_native_threads_branch breakpoint.c coreparse.c dynbind.c dynbind.h gencgc.c interrupt.c monitor.c parse.c purify.c runtime.c runtime.h save.c thread.c thread.h x86-arch.c x86-linux-os.c x86-linux-os.h Log Message: 0.7.9.54.thread.4 Experimental native threads branch: #-any-expectation-of-utility Runtime: changes to SymbolValue and SetSymbolValue signature; these both now take an additional argument for the thread in which to look up values. All callers of the above functions updated to call with current thread, initial thread, or all-threads-in-turn as appropriate init_thread now copies tls vector from current thread instead of always from the initial thread Index: breakpoint.c =================================================================== RCS file: /cvsroot/sbcl/sbcl/src/runtime/breakpoint.c,v retrieving revision 1.10 retrieving revision 1.10.6.1 diff -u -d -r1.10 -r1.10.6.1 --- breakpoint.c 18 Mar 2002 17:56:11 -0000 1.10 +++ breakpoint.c 25 Nov 2002 17:58:36 -0000 1.10.6.1 @@ -21,6 +21,7 @@ #include "globals.h" #include "alloc.h" #include "breakpoint.h" +#include "thread.h" #define REAL_LRA_SLOT 0 #ifndef __i386__ Index: coreparse.c =================================================================== RCS file: /cvsroot/sbcl/sbcl/src/runtime/coreparse.c,v retrieving revision 1.16.2.1 retrieving revision 1.16.2.2 diff -u -d -r1.16.2.1 -r1.16.2.2 --- coreparse.c 24 Nov 2002 13:14:16 -0000 1.16.2.1 +++ coreparse.c 25 Nov 2002 17:58:36 -0000 1.16.2.2 @@ -33,6 +33,7 @@ #include "arch.h" #include "interr.h" #include "sbcl.h" +#include "thread.h" unsigned char build_id[] = #include "../../output/build-id.tmp" @@ -92,7 +93,7 @@ * defined(__i386__) * ? */ #if defined(LISP_FEATURE_X86) - SetSymbolValue(ALLOCATION_POINTER, (lispobj)free_pointer); + SetSymbolValue(ALLOCATION_POINTER, (lispobj)free_pointer,0); #else dynamic_space_free_pointer = free_pointer; #endif Index: dynbind.c =================================================================== RCS file: /cvsroot/sbcl/sbcl/src/runtime/dynbind.c,v retrieving revision 1.5 retrieving revision 1.5.6.1 diff -u -d -r1.5 -r1.5.6.1 --- dynbind.c 18 Jul 2002 17:47:34 -0000 1.5 +++ dynbind.c 25 Nov 2002 17:58:36 -0000 1.5.6.1 @@ -17,32 +17,35 @@ #include "sbcl.h" #include "globals.h" #include "dynbind.h" +#include "thread.h" #if defined(__i386__) -#define GetBSP() ((struct binding *)SymbolValue(BINDING_STACK_POINTER)) -#define SetBSP(value) SetSymbolValue(BINDING_STACK_POINTER, (lispobj)(value)) +#define GetBSP() ((struct binding *)SymbolValue(BINDING_STACK_POINTER,thread)) +#define SetBSP(value) SetSymbolValue(BINDING_STACK_POINTER, (lispobj)(value),thread) #else #define GetBSP() ((struct binding *)current_binding_stack_pointer) #define SetBSP(value) (current_binding_stack_pointer=(lispobj *)(value)) #endif -void bind_variable(lispobj symbol, lispobj value) +void bind_variable(lispobj symbol, lispobj value, void *th) { lispobj old_value; struct binding *binding; + struct thread *thread=(struct thread *)th; - old_value = SymbolValue(symbol); + old_value = SymbolValue(symbol,thread); binding = GetBSP(); SetBSP(binding+1); binding->value = old_value; binding->symbol = symbol; - SetSymbolValue(symbol, value); + SetSymbolValue(symbol, value,thread); } void -unbind(void) +unbind(void *th) { + struct thread *thread=(struct thread *)th; struct binding *binding; lispobj symbol; @@ -50,7 +53,7 @@ symbol = binding->symbol; - SetSymbolValue(symbol, binding->value); + SetSymbolValue(symbol, binding->value,thread); binding->symbol = 0; @@ -58,8 +61,9 @@ } void -unbind_to_here(lispobj *bsp) +unbind_to_here(lispobj *bsp,void *th) { + struct thread *thread=(struct thread *)th; struct binding *target = (struct binding *)bsp; struct binding *binding = GetBSP(); lispobj symbol; @@ -70,7 +74,7 @@ symbol = binding->symbol; if (symbol) { - SetSymbolValue(symbol, binding->value); + SetSymbolValue(symbol, binding->value,thread); binding->symbol = 0; } Index: dynbind.h =================================================================== RCS file: /cvsroot/sbcl/sbcl/src/runtime/dynbind.h,v retrieving revision 1.2 retrieving revision 1.2.20.1 diff -u -d -r1.2 -r1.2.20.1 --- dynbind.h 20 Oct 2000 23:30:35 -0000 1.2 +++ dynbind.h 25 Nov 2002 17:58:36 -0000 1.2.20.1 @@ -12,8 +12,8 @@ #ifndef _DYNBIND_H_ #define _DYNBIND_H_ -extern void bind_variable(lispobj symbol, lispobj value); -extern void unbind(void); -extern void unbind_to_here(lispobj *bsp); +extern void bind_variable(lispobj symbol, lispobj value,void *thread); +extern void unbind(void *thread); +extern void unbind_to_here(lispobj *bsp,void *thread); #endif Index: gencgc.c =================================================================== RCS file: /cvsroot/sbcl/sbcl/src/runtime/gencgc.c,v retrieving revision 1.24.4.1 retrieving revision 1.24.4.2 diff -u -d -r1.24.4.1 -r1.24.4.2 --- gencgc.c 24 Nov 2002 13:14:16 -0000 1.24.4.1 +++ gencgc.c 25 Nov 2002 17:58:36 -0000 1.24.4.2 @@ -648,7 +648,8 @@ if (last_page+1 > last_free_page) { last_free_page = last_page+1; SetSymbolValue(ALLOCATION_POINTER, - (lispobj)(((char *)heap_base) + last_free_page*4096)); + (lispobj)(((char *)heap_base) + last_free_page*4096), + 0); if (last_page+1 > last_used_page) last_used_page = last_page+1; } @@ -1113,7 +1114,7 @@ if (last_page+1 > last_free_page) { last_free_page = last_page+1; SetSymbolValue(ALLOCATION_POINTER, - (lispobj)(((char *)heap_base) + last_free_page*4096)); + (lispobj)(((char *)heap_base) + last_free_page*4096),0); if (last_page+1 > last_used_page) last_used_page = last_page+1; } @@ -2173,7 +2174,7 @@ search_read_only_space(lispobj *pointer) { lispobj* start = (lispobj*)READ_ONLY_SPACE_START; - lispobj* end = (lispobj*)SymbolValue(READ_ONLY_SPACE_FREE_POINTER); + lispobj* end = (lispobj*)SymbolValue(READ_ONLY_SPACE_FREE_POINTER,0); if ((pointer < start) || (pointer >= end)) return NULL; return (search_space(start, (pointer+2)-start, pointer)); @@ -2183,7 +2184,7 @@ search_static_space(lispobj *pointer) { lispobj* start = (lispobj*)STATIC_SPACE_START; - lispobj* end = (lispobj*)SymbolValue(STATIC_SPACE_FREE_POINTER); + lispobj* end = (lispobj*)SymbolValue(STATIC_SPACE_FREE_POINTER,0); if ((pointer < start) || (pointer >= end)) return NULL; return (search_space(start, (pointer+2)-start, pointer)); @@ -3312,7 +3313,7 @@ int is_in_dynamic_space = (find_page_index((void*)start) != -1); int is_in_readonly_space = (READ_ONLY_SPACE_START <= (unsigned)start && - (unsigned)start < SymbolValue(READ_ONLY_SPACE_FREE_POINTER)); + (unsigned)start < SymbolValue(READ_ONLY_SPACE_FREE_POINTER,0)); while (words > 0) { size_t count = 1; @@ -3322,10 +3323,10 @@ int page_index = find_page_index((void*)thing); int to_readonly_space = (READ_ONLY_SPACE_START <= thing && - thing < SymbolValue(READ_ONLY_SPACE_FREE_POINTER)); + thing < SymbolValue(READ_ONLY_SPACE_FREE_POINTER,0)); int to_static_space = (STATIC_SPACE_START <= thing && - thing < SymbolValue(STATIC_SPACE_FREE_POINTER)); + thing < SymbolValue(STATIC_SPACE_FREE_POINTER,0)); /* Does it point to the dynamic space? */ if (page_index != -1) { @@ -3511,17 +3512,15 @@ * to grep for all foo_size and rename the appropriate ones to * foo_count. */ int read_only_space_size = - (lispobj*)SymbolValue(READ_ONLY_SPACE_FREE_POINTER) + (lispobj*)SymbolValue(READ_ONLY_SPACE_FREE_POINTER,0) - (lispobj*)READ_ONLY_SPACE_START; int static_space_size = - (lispobj*)SymbolValue(STATIC_SPACE_FREE_POINTER) + (lispobj*)SymbolValue(STATIC_SPACE_FREE_POINTER,0) - (lispobj*)STATIC_SPACE_START; struct thread *th; for_each_thread(th) { - /* XXX this needs to be a per-process special and accessed - * appropriately for such */ int binding_stack_size = - (lispobj*)SymbolValue(BINDING_STACK_POINTER) + (lispobj*)SymbolValue(BINDING_STACK_POINTER,th) - (lispobj*)th->binding_stack_start; verify_space(th->binding_stack_start, binding_stack_size); } @@ -3757,7 +3756,7 @@ * per-thread value of BINDING_STACK_POINTER */ for(th=all_threads;th;th=th->next) scavenge((lispobj *) th->binding_stack_start, - (lispobj *)SymbolValue(BINDING_STACK_POINTER) - + (lispobj *)SymbolValue(BINDING_STACK_POINTER,th) - (lispobj *)th->binding_stack_start); } @@ -3782,7 +3781,7 @@ /* Scavenge static space. */ static_space_size = - (lispobj *)SymbolValue(STATIC_SPACE_FREE_POINTER) - + (lispobj *)SymbolValue(STATIC_SPACE_FREE_POINTER,0) - (lispobj *)STATIC_SPACE_START; if (gencgc_verbose > 1) { FSHOW((stderr, @@ -3895,7 +3894,7 @@ last_free_page = last_page+1; SetSymbolValue(ALLOCATION_POINTER, - (lispobj)(((char *)heap_base) + last_free_page*4096)); + (lispobj)(((char *)heap_base) + last_free_page*4096),0); return 0; /* dummy value: return something ... */ } @@ -4112,7 +4111,7 @@ unboxed_region.end_addr = page_address(0); last_free_page = 0; - SetSymbolValue(ALLOCATION_POINTER, (lispobj)((char *)heap_base)); + SetSymbolValue(ALLOCATION_POINTER, (lispobj)((char *)heap_base),0); current_region_free_pointer = boxed_region.free_pointer; current_region_end_addr = boxed_region.end_addr; @@ -4198,7 +4197,7 @@ { int page = 0; int addr = DYNAMIC_SPACE_START; - int alloc_ptr = SymbolValue(ALLOCATION_POINTER); + int alloc_ptr = SymbolValue(ALLOCATION_POINTER,0); /* Initialize the first region. */ do { @@ -4250,7 +4249,7 @@ gc_assert((((unsigned)current_region_free_pointer & 0x7) == 0) && ((nbytes & 0x7) == 0)); - if (SymbolValue(PSEUDO_ATOMIC_ATOMIC)) {/* if already in a pseudo atomic */ + if (SymbolValue(PSEUDO_ATOMIC_ATOMIC,0)) {/* if already in a pseudo atomic */ void *new_free_pointer; @@ -4296,16 +4295,16 @@ auto_gc_trigger *= 2; alloc_entered--; /* Exit the pseudo-atomic. */ - SetSymbolValue(PSEUDO_ATOMIC_ATOMIC, make_fixnum(0)); - if (SymbolValue(PSEUDO_ATOMIC_INTERRUPTED) != 0) { + SetSymbolValue(PSEUDO_ATOMIC_ATOMIC, make_fixnum(0),0); + if (SymbolValue(PSEUDO_ATOMIC_INTERRUPTED,0) != 0) { /* Handle any interrupts that occurred during * gc_alloc(..). */ do_pending_interrupt(); } funcall0(SymbolFunction(MAYBE_GC)); /* Re-enter the pseudo-atomic. */ - SetSymbolValue(PSEUDO_ATOMIC_INTERRUPTED, make_fixnum(0)); - SetSymbolValue(PSEUDO_ATOMIC_ATOMIC, make_fixnum(1)); + SetSymbolValue(PSEUDO_ATOMIC_INTERRUPTED, make_fixnum(0),0); + SetSymbolValue(PSEUDO_ATOMIC_ATOMIC, make_fixnum(1),0); goto retry1; } /* Call gc_alloc(). */ @@ -4324,8 +4323,8 @@ retry2: /* At least wrap this allocation in a pseudo atomic to prevent * gc_alloc() from being re-entered. */ - SetSymbolValue(PSEUDO_ATOMIC_INTERRUPTED, make_fixnum(0)); - SetSymbolValue(PSEUDO_ATOMIC_ATOMIC, make_fixnum(1)); + SetSymbolValue(PSEUDO_ATOMIC_INTERRUPTED, make_fixnum(0),0); + SetSymbolValue(PSEUDO_ATOMIC_ATOMIC, make_fixnum(1),0); if (alloc_entered) SHOW("alloc re-entered in not-already-pseudo-atomic case"); @@ -4339,8 +4338,8 @@ void *new_obj = current_region_free_pointer; current_region_free_pointer = new_free_pointer; alloc_entered--; - SetSymbolValue(PSEUDO_ATOMIC_ATOMIC, make_fixnum(0)); - if (SymbolValue(PSEUDO_ATOMIC_INTERRUPTED)) { + SetSymbolValue(PSEUDO_ATOMIC_ATOMIC, make_fixnum(0),0); + if (SymbolValue(PSEUDO_ATOMIC_INTERRUPTED,0)) { /* Handle any interrupts that occurred during * gc_alloc(..). */ do_pending_interrupt(); @@ -4358,8 +4357,8 @@ auto_gc_trigger *= 2; alloc_entered--; /* Exit the pseudo atomic. */ - SetSymbolValue(PSEUDO_ATOMIC_ATOMIC, make_fixnum(0)); - if (SymbolValue(PSEUDO_ATOMIC_INTERRUPTED) != 0) { + SetSymbolValue(PSEUDO_ATOMIC_ATOMIC, make_fixnum(0),0); + if (SymbolValue(PSEUDO_ATOMIC_INTERRUPTED,0) != 0) { /* Handle any interrupts that occurred during * gc_alloc(..); */ do_pending_interrupt(); @@ -4375,8 +4374,8 @@ current_region_end_addr = boxed_region.end_addr; alloc_entered--; - SetSymbolValue(PSEUDO_ATOMIC_ATOMIC, make_fixnum(0)); - if (SymbolValue(PSEUDO_ATOMIC_INTERRUPTED) != 0) { + SetSymbolValue(PSEUDO_ATOMIC_ATOMIC, make_fixnum(0),0); + if (SymbolValue(PSEUDO_ATOMIC_INTERRUPTED,0) != 0) { /* Handle any interrupts that occurred during gc_alloc(..). */ do_pending_interrupt(); goto retry2; Index: interrupt.c =================================================================== RCS file: /cvsroot/sbcl/sbcl/src/runtime/interrupt.c,v retrieving revision 1.32.4.1 retrieving revision 1.32.4.2 diff -u -d -r1.32.4.1 -r1.32.4.2 --- interrupt.c 24 Nov 2002 13:14:17 -0000 1.32.4.1 +++ interrupt.c 25 Nov 2002 17:58:36 -0000 1.32.4.2 @@ -31,6 +31,7 @@ #include "alloc.h" #include "dynbind.h" #include "interr.h" +#include "thread.h" void sigaddset_blockable(sigset_t *s) { @@ -160,7 +161,7 @@ fake_foreign_function_call(os_context_t *context) { int context_index; - + struct thread *thread=arch_os_get_current_thread(); /* Get current Lisp state from context. */ #ifdef reg_ALLOC dynamic_space_free_pointer = @@ -180,7 +181,7 @@ /* Do dynamic binding of the active interrupt context index * and save the context in the context array. */ - context_index = SymbolValue(FREE_INTERRUPT_CONTEXT_INDEX)>>2; + context_index = SymbolValue(FREE_INTERRUPT_CONTEXT_INDEX,thread)>>2; /* FIXME: Ick! Why use abstract "make_fixnum" in some places if * you're going to convert from fixnum by bare >>2 in other * places? Use fixnum_value(..) here, and look for other places @@ -191,7 +192,7 @@ } bind_variable(FREE_INTERRUPT_CONTEXT_INDEX, - make_fixnum(context_index + 1)); + make_fixnum(context_index + 1),thread); lisp_interrupt_contexts[context_index] = context; @@ -202,6 +203,7 @@ void undo_fake_foreign_function_call(os_context_t *context) { + struct thread *thread=arch_os_get_current_thread(); /* Block all blockable signals. */ sigset_t block; sigemptyset(&block); @@ -218,7 +220,7 @@ * perhaps yes, unbind_to_here() really would be clearer and less * fragile.. */ /* dan (2001.08.10) thinks the above supposition is probably correct */ - unbind(); + unbind(thread); #ifdef reg_ALLOC /* Put the dynamic space free pointer back into the context. */ @@ -280,8 +282,8 @@ #ifndef __i386__ boolean were_in_lisp = !foreign_function_call_active; #endif - - SetSymbolValue(INTERRUPT_PENDING, NIL); + struct thread *thread=arch_os_get_current_thread(); + SetSymbolValue(INTERRUPT_PENDING, NIL,thread); if (maybe_gc_pending) { maybe_gc_pending = 0; @@ -444,6 +446,7 @@ maybe_now_maybe_later(int signal, siginfo_t *info, void *void_context) { os_context_t *context = arch_os_get_context(&void_context); + struct thread *thread=arch_os_get_current_thread(); #ifdef LISP_FEATURE_LINUX os_restore_fp_control(context); @@ -452,7 +455,7 @@ /* see comments at top of code/signal.lisp for what's going on here * with INTERRUPTS_ENABLED/INTERRUPT_HANDLE_NOW */ - if (SymbolValue(INTERRUPTS_ENABLED) == NIL) { + if (SymbolValue(INTERRUPTS_ENABLED,thread) == NIL) { /* FIXME: This code is exactly the same as the code in the * other leg of the if(..), and should be factored out into @@ -463,7 +466,7 @@ os_context_sigmask_addr(context), sizeof(sigset_t)); sigaddset_blockable(os_context_sigmask_addr(context)); - SetSymbolValue(INTERRUPT_PENDING, T); + SetSymbolValue(INTERRUPT_PENDING, T,thread); } else if ( #ifndef __i386__ Index: monitor.c =================================================================== RCS file: /cvsroot/sbcl/sbcl/src/runtime/monitor.c,v retrieving revision 1.16 retrieving revision 1.16.6.1 diff -u -d -r1.16 -r1.16.6.1 --- monitor.c 18 Jul 2002 17:47:34 -0000 1.16 +++ monitor.c 25 Nov 2002 17:58:36 -0000 1.16.6.1 @@ -33,6 +33,7 @@ #include "globals.h" #include "lispregs.h" #include "interrupt.h" +#include "thread.h" /* When we need to do command input, we use this stream, which is not * in general stdin, so that things will "work" (as well as being @@ -174,6 +175,7 @@ #if !defined(__i386__) printf("BSP\t=\t0x%08X\n", (unsigned long)current_binding_stack_pointer); #endif +#if 0 #ifdef __i386__ printf("BSP\t=\t0x%08lx\n", (unsigned long)SymbolValue(BINDING_STACK_POINTER)); @@ -192,7 +194,7 @@ (unsigned long)SymbolValue(STATIC_SPACE_FREE_POINTER)); printf("RDONLY\t=\t0x%08lx\n", (unsigned long)SymbolValue(READ_ONLY_SPACE_FREE_POINTER)); - +#endif /* 0 */ #ifdef MIPS printf("FLAGS\t=\t0x%08x\n", current_flags_register); #endif @@ -328,8 +330,9 @@ print_context_cmd(char **ptr) { int free; + struct thread *thread=arch_os_get_current_thread(); - free = SymbolValue(FREE_INTERRUPT_CONTEXT_INDEX)>>2; + free = SymbolValue(FREE_INTERRUPT_CONTEXT_INDEX,thread)>>2; if (more_p(ptr)) { int index; @@ -374,8 +377,9 @@ catchers_cmd(char **ptr) { struct catch_block *catch; + struct thread *thread=arch_os_get_current_thread(); - catch = (struct catch_block *)SymbolValue(CURRENT_CATCH_BLOCK); + catch = (struct catch_block *)SymbolValue(CURRENT_CATCH_BLOCK,thread); if (catch == NULL) printf("There are no active catchers!\n"); Index: parse.c =================================================================== RCS file: /cvsroot/sbcl/sbcl/src/runtime/parse.c,v retrieving revision 1.9 retrieving revision 1.9.4.1 diff -u -d -r1.9 -r1.9.4.1 --- parse.c 6 Aug 2002 11:46:33 -0000 1.9 +++ parse.c 25 Nov 2002 17:58:36 -0000 1.9.4.1 @@ -29,6 +29,7 @@ #include "monitor.h" #include "arch.h" #include "search.h" +#include "thread.h" static void skip_ws(char **ptr) { @@ -243,7 +244,7 @@ /* Search static space. */ headerptr = (lispobj *)STATIC_SPACE_START; count = - (lispobj *)SymbolValue(STATIC_SPACE_FREE_POINTER) - + (lispobj *)SymbolValue(STATIC_SPACE_FREE_POINTER,0) - (lispobj *)STATIC_SPACE_START; if (search_for_symbol(name, &headerptr, &count)) { *result = make_lispobj(headerptr,OTHER_POINTER_LOWTAG); @@ -258,7 +259,7 @@ (lispobj *)DYNAMIC_SPACE_START; #else count = - (lispobj *)SymbolValue(ALLOCATION_POINTER) - + (lispobj *)SymbolValue(ALLOCATION_POINTER,0) - (lispobj *)DYNAMIC_SPACE_START; #endif if (search_for_symbol(name, &headerptr, &count)) { @@ -302,6 +303,7 @@ lispobj parse_lispobj(ptr) char **ptr; { + struct thread *thread=arch_os_get_current_thread(); char *token = parse_token(ptr); long pointer; lispobj result; @@ -315,7 +317,7 @@ int regnum; os_context_t *context; - free = SymbolValue(FREE_INTERRUPT_CONTEXT_INDEX)>>2; + free = SymbolValue(FREE_INTERRUPT_CONTEXT_INDEX,thread)>>2; if (free == 0) { printf("Variable ``%s'' is not valid -- there is no current interrupt context.\n", token); Index: purify.c =================================================================== RCS file: /cvsroot/sbcl/sbcl/src/runtime/purify.c,v retrieving revision 1.20.4.1 retrieving revision 1.20.4.2 diff -u -d -r1.20.4.1 -r1.20.4.2 --- purify.c 24 Nov 2002 13:14:17 -0000 1.20.4.1 +++ purify.c 25 Nov 2002 17:58:36 -0000 1.20.4.2 @@ -1295,30 +1295,31 @@ lispobj *clean; int count, i; struct later *laters, *next; + struct thread *thread; #ifdef PRINTNOISE printf("[doing purification:"); fflush(stdout); #endif - - if (fixnum_value(SymbolValue(FREE_INTERRUPT_CONTEXT_INDEX)) != 0) { - /* FIXME: 1. What does this mean? 2. It shouldn't be reporting - * its error simply by a. printing a string b. to stdout instead - * of stderr. */ - printf(" Ack! Can't purify interrupt contexts. "); - fflush(stdout); - return 0; - } - + for_each_thread(thread) + if (fixnum_value(SymbolValue(FREE_INTERRUPT_CONTEXT_INDEX,thread)) != 0) { + /* FIXME: 1. What does this mean? 2. It shouldn't be reporting + * its error simply by a. printing a string b. to stdout instead + * of stderr. */ + printf(" Ack! Can't purify interrupt contexts. "); + fflush(stdout); + return 0; + } + #if defined(__i386__) dynamic_space_free_pointer = - (lispobj*)SymbolValue(ALLOCATION_POINTER); + (lispobj*)SymbolValue(ALLOCATION_POINTER,all_threads); #endif read_only_end = read_only_free = - (lispobj *)SymbolValue(READ_ONLY_SPACE_FREE_POINTER); + (lispobj *)SymbolValue(READ_ONLY_SPACE_FREE_POINTER,all_threads); static_end = static_free = - (lispobj *)SymbolValue(STATIC_SPACE_FREE_POINTER); + (lispobj *)SymbolValue(STATIC_SPACE_FREE_POINTER,all_threads); #ifdef PRINTNOISE printf(" roots"); @@ -1367,7 +1368,7 @@ 0); #else pscav( (lispobj *)all_threads->binding_stack_start, - (lispobj *)SymbolValue(BINDING_STACK_POINTER) - + (lispobj *)SymbolValue(BINDING_STACK_POINTER,all_threads) - (lispobj *)all_threads->binding_stack_start, 0); #endif @@ -1442,8 +1443,8 @@ /* It helps to update the heap free pointers so that free_heap can * verify after it's done. */ - SetSymbolValue(READ_ONLY_SPACE_FREE_POINTER, (lispobj)read_only_free); - SetSymbolValue(STATIC_SPACE_FREE_POINTER, (lispobj)static_free); + SetSymbolValue(READ_ONLY_SPACE_FREE_POINTER, (lispobj)read_only_free,0); + SetSymbolValue(STATIC_SPACE_FREE_POINTER, (lispobj)static_free,0); #if !defined(__i386__) dynamic_space_free_pointer = current_dynamic_space; Index: runtime.c =================================================================== RCS file: /cvsroot/sbcl/sbcl/src/runtime/runtime.c,v retrieving revision 1.16.4.1 retrieving revision 1.16.4.2 diff -u -d -r1.16.4.1 -r1.16.4.2 --- runtime.c 24 Nov 2002 13:14:17 -0000 1.16.4.1 +++ runtime.c 25 Nov 2002 17:58:36 -0000 1.16.4.2 @@ -43,6 +43,7 @@ #include "core.h" #include "save.h" #include "lispregs.h" +#include "thread.h" #ifdef irix #include <string.h> @@ -112,6 +113,8 @@ return NIL; } } + + int main(int argc, char *argv[], char *envp[]) @@ -270,13 +273,13 @@ #ifdef PSEUDO_ATOMIC_ATOMIC /* Turn on pseudo atomic for when we call into Lisp. */ SHOW("turning on pseudo atomic"); - SetSymbolValue(PSEUDO_ATOMIC_ATOMIC, make_fixnum(1)); - SetSymbolValue(PSEUDO_ATOMIC_INTERRUPTED, make_fixnum(0)); + SetSymbolValue(PSEUDO_ATOMIC_ATOMIC, make_fixnum(1),0); + SetSymbolValue(PSEUDO_ATOMIC_INTERRUPTED, make_fixnum(0),0); #endif /* Convert remaining argv values to something that Lisp can grok. */ SHOW("setting POSIX-ARGV symbol value"); - SetSymbolValue(POSIX_ARGV, alloc_string_list(argv)); + SetSymbolValue(POSIX_ARGV, alloc_string_list(argv),0); /* Install a handler to pick off SIGINT until the Lisp system gets * far enough along to install its own handler. */ Index: runtime.h =================================================================== RCS file: /cvsroot/sbcl/sbcl/src/runtime/runtime.h,v retrieving revision 1.12.4.1 retrieving revision 1.12.4.2 diff -u -d -r1.12.4.1 -r1.12.4.2 --- runtime.h 24 Nov 2002 13:14:17 -0000 1.12.4.1 +++ runtime.h 25 Nov 2002 17:58:36 -0000 1.12.4.2 @@ -102,19 +102,15 @@ /* Too bad ANSI C doesn't define "bool" as C++ does.. */ typedef int boolean; -/* FIXME: There seems to be no reason that SymbolValue, SetSymbolValue, - * and SymbolFunction can't be defined as (possibly inline) functions - * instead of macros. */ - -#define SymbolValue(sym) \ - (((struct symbol *)((sym)-OTHER_POINTER_LOWTAG))->value) -#define SetSymbolValue(sym,val) \ - (((struct symbol *)((sym)-OTHER_POINTER_LOWTAG))->value = (val)) +/* FIXME: There seems to be no reason that SymbolFunction can't be + * defined as (possibly inline) functions instead of macros. */ +static inline lispobj SymbolValue(u32 sym, void *thread); +static inline void SetSymbolValue(u32 sym, lispobj val, void *thread); /* This only works for static symbols. */ /* FIXME: should be called StaticSymbolFunction, right? */ #define SymbolFunction(sym) \ - (((struct fdefn *)(native_pointer(SymbolValue(sym))))->fun) + (((struct fdefn *)(native_pointer(SymbolValue(sym,0))))->fun) /* KLUDGE: As far as I can tell there's no ANSI C way of saying * "this function never returns". This is the way that you do it Index: save.c =================================================================== RCS file: /cvsroot/sbcl/sbcl/src/runtime/save.c,v retrieving revision 1.14.2.1 retrieving revision 1.14.2.2 diff -u -d -r1.14.2.1 -r1.14.2.2 --- save.c 24 Nov 2002 13:14:17 -0000 1.14.2.1 +++ save.c 25 Nov 2002 17:58:36 -0000 1.14.2.2 @@ -98,10 +98,11 @@ * being SAVE-LISP-AND-DIE instead of SAVE-LISP-AND-GO-ON). */ printf("[undoing binding stack and other enclosing state... "); fflush(stdout); - for_each_thread(th) /* XXX really? */ - unbind_to_here((lispobj *)th->binding_stack_start); - SetSymbolValue(CURRENT_CATCH_BLOCK, 0); - SetSymbolValue(CURRENT_UNWIND_PROTECT_BLOCK, 0); + for_each_thread(th) { /* XXX really? */ + unbind_to_here((lispobj *)th->binding_stack_start,th); + SetSymbolValue(CURRENT_CATCH_BLOCK, 0,th); + SetSymbolValue(CURRENT_UNWIND_PROTECT_BLOCK, 0,th); + } printf("done]\n"); fflush(stdout); @@ -135,11 +136,11 @@ output_space(file, READ_ONLY_CORE_SPACE_ID, (lispobj *)READ_ONLY_SPACE_START, - (lispobj *)SymbolValue(READ_ONLY_SPACE_FREE_POINTER)); + (lispobj *)SymbolValue(READ_ONLY_SPACE_FREE_POINTER,0)); output_space(file, STATIC_CORE_SPACE_ID, (lispobj *)STATIC_SPACE_START, - (lispobj *)SymbolValue(STATIC_SPACE_FREE_POINTER)); + (lispobj *)SymbolValue(STATIC_SPACE_FREE_POINTER,0)); #ifdef reg_ALLOC output_space(file, DYNAMIC_CORE_SPACE_ID, @@ -163,7 +164,7 @@ output_space(file, DYNAMIC_CORE_SPACE_ID, (lispobj *)DYNAMIC_SPACE_START, - (lispobj *)SymbolValue(ALLOCATION_POINTER)); + (lispobj *)SymbolValue(ALLOCATION_POINTER,0)); #endif putw(INITIAL_FUN_CORE_ENTRY_TYPE_CODE, file); Index: thread.c =================================================================== RCS file: /cvsroot/sbcl/sbcl/src/runtime/Attic/thread.c,v retrieving revision 1.1.2.1 retrieving revision 1.1.2.2 diff -u -d -r1.1.2.1 -r1.1.2.2 --- thread.c 24 Nov 2002 13:14:17 -0000 1.1.2.1 +++ thread.c 25 Nov 2002 17:58:36 -0000 1.1.2.2 @@ -41,9 +41,8 @@ th->dynamic_values_start= (lispobj*)((void*)th->alien_stack_start+ALIEN_STACK_SIZE); if(all_threads) { - /* XXX this is wrong, should be copying from the current - thread instead */ - memcpy(th->dynamic_values_start,all_threads->dynamic_values_start, + memcpy(th->dynamic_values_start, + arch_os_get_current_thread()->dynamic_values_start, dynamic_values_bytes); } else { int i; @@ -60,7 +59,7 @@ ((struct symbol *)native_pointer(ALIEN_STACK))->value =LOW_WORD(th->dynamic_values_start-1); #ifdef BINDING_STACK_POINTER - SetSymbolValue(BINDING_STACK_POINTER, LOW_WORD(th->binding_stack_start)); + SetSymbolValue(BINDING_STACK_POINTER, LOW_WORD(th->binding_stack_start),th); #endif th->next=all_threads; @@ -92,3 +91,10 @@ return 0; } +struct thread *find_thread_by_pid(pid_t pid) +{ + struct thread *th; + for_each_thread(th) + if(th->pid==pid) return th; + return 0; +} Index: thread.h =================================================================== RCS file: /cvsroot/sbcl/sbcl/src/runtime/Attic/thread.h,v retrieving revision 1.1.2.1 retrieving revision 1.1.2.2 diff -u -d -r1.1.2.1 -r1.1.2.2 --- thread.h 24 Nov 2002 13:14:17 -0000 1.1.2.1 +++ thread.h 25 Nov 2002 17:58:36 -0000 1.1.2.2 @@ -14,5 +14,26 @@ }; extern struct thread *all_threads; extern int dynamic_values_bytes; +extern struct thread *find_thread_by_pid(pid_t pid); #define for_each_thread(th) for(th=all_threads;th;th=th->next) + +static inline lispobj SymbolValue(u32 tagged_symbol_pointer, void *thread) { + struct symbol *sym= (struct symbol *) + (tagged_symbol_pointer-OTHER_POINTER_LOWTAG); + if(thread && sym->tls_index) { + return ((struct thread *)thread)->dynamic_values_start[sym->tls_index]; + } else { + return sym->value; + } +} +static inline void SetSymbolValue(u32 tagged_symbol_pointer,lispobj val, void *thread) { + struct symbol *sym= (struct symbol *) + (tagged_symbol_pointer-OTHER_POINTER_LOWTAG); + if(thread && sym->tls_index) { + ((struct thread *)thread)->dynamic_values_start[sym->tls_index]=val; + } else { + sym->value = val; + } +} + Index: x86-arch.c =================================================================== RCS file: /cvsroot/sbcl/sbcl/src/runtime/x86-arch.c,v retrieving revision 1.16 retrieving revision 1.16.6.1 diff -u -d -r1.16 -r1.16.6.1 --- x86-arch.c 16 Jul 2002 13:48:07 -0000 1.16 +++ x86-arch.c 25 Nov 2002 17:58:36 -0000 1.16.6.1 @@ -24,6 +24,7 @@ #include "interr.h" #include "breakpoint.h" #include "monitor.h" +#include "thread.h" #define BREAKPOINT_INST 0xcc /* INT3 */ @@ -112,13 +113,13 @@ boolean arch_pseudo_atomic_atomic(os_context_t *context) { - return SymbolValue(PSEUDO_ATOMIC_ATOMIC); + return SymbolValue(PSEUDO_ATOMIC_ATOMIC,0); } void arch_set_pseudo_atomic_interrupted(os_context_t *context) { - SetSymbolValue(PSEUDO_ATOMIC_INTERRUPTED, make_fixnum(1)); + SetSymbolValue(PSEUDO_ATOMIC_INTERRUPTED, make_fixnum(1),0); } /* Index: x86-linux-os.c =================================================================== RCS file: /cvsroot/sbcl/sbcl/src/runtime/x86-linux-os.c,v retrieving revision 1.7.4.1 retrieving revision 1.7.4.2 diff -u -d -r1.7.4.1 -r1.7.4.2 --- x86-linux-os.c 24 Nov 2002 13:14:17 -0000 1.7.4.1 +++ x86-linux-os.c 25 Nov 2002 17:58:37 -0000 1.7.4.2 @@ -81,7 +81,11 @@ + 3)); /* privilege level */ return n; } - + +struct thread *arch_os_get_current_thread() { + return find_thread_by_pid(getpid()); +} + /* KLUDGE: As of kernel 2.2.14 on Red Hat 6.2, there's code in the * <sys/ucontext.h> file to define symbolic names for offsets into Index: x86-linux-os.h =================================================================== RCS file: /cvsroot/sbcl/sbcl/src/runtime/x86-linux-os.h,v retrieving revision 1.4 retrieving revision 1.4.4.1 diff -u -d -r1.4 -r1.4.4.1 --- x86-linux-os.h 1 Sep 2002 22:34:18 -0000 1.4 +++ x86-linux-os.h 25 Nov 2002 17:58:37 -0000 1.4.4.1 @@ -8,6 +8,7 @@ return (os_context_t *) *void_context; } +extern struct thread *os_get_current_thread(); unsigned long os_context_fp_control(os_context_t *context); void os_restore_fp_control(os_context_t *context); |