X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=src%2Fruntime%2Fgencgc.c;h=a89d59c786dd3b7263aa85a0dcd203ee584461ff;hb=eac461c1f1ca91cfe282c779291d582ed6b336cb;hp=175be61c3cabdb2e259bc7f06e5aee39eb74a493;hpb=e38636b22c17685dca58131beb88e67870ce48f6;p=sbcl.git diff --git a/src/runtime/gencgc.c b/src/runtime/gencgc.c index 175be61..a89d59c 100644 --- a/src/runtime/gencgc.c +++ b/src/runtime/gencgc.c @@ -26,10 +26,14 @@ #include #include -#include #include #include #include "sbcl.h" +#if defined(LISP_FEATURE_WIN32) && defined(LISP_FEATURE_SB_THREAD) +#include "pthreads_win32.h" +#else +#include +#endif #include "runtime.h" #include "os.h" #include "interr.h" @@ -96,7 +100,7 @@ os_vm_size_t large_allocation = 0; /* the verbosity level. All non-error messages are disabled at level 0; * and only a few rare messages are printed at level 1. */ -#if QSHOW +#if QSHOW == 2 boolean gencgc_verbose = 1; #else boolean gencgc_verbose = 0; @@ -447,6 +451,15 @@ write_generation_stats(FILE *file) #elif defined(LISP_FEATURE_PPC) #define FPU_STATE_SIZE 32 long long fpu_state[FPU_STATE_SIZE]; +#elif defined(LISP_FEATURE_SPARC) + /* + * 32 (single-precision) FP registers, and the FP state register. + * But Sparc V9 has 32 double-precision registers (equivalent to 64 + * single-precision, but can't be accessed), so we leave enough room + * for that. + */ +#define FPU_STATE_SIZE (((32 + 32 + 1) + 1)/2) + long long fpu_state[FPU_STATE_SIZE]; #endif /* This code uses the FP instructions which may be set up for Lisp @@ -1246,10 +1259,12 @@ gc_heap_exhausted_error_or_lose (long available, long requested) else { /* FIXME: assert free_pages_lock held */ (void)thread_mutex_unlock(&free_pages_lock); +#if !(defined(LISP_FEATURE_WIN32) && defined(LISP_FEATURE_SB_THREAD)) gc_assert(get_pseudo_atomic_atomic(thread)); clear_pseudo_atomic_atomic(thread); if (get_pseudo_atomic_interrupted(thread)) do_pending_interrupt(); +#endif /* Another issue is that signalling HEAP-EXHAUSTED error leads * to running user code at arbitrary places, even in a * WITHOUT-INTERRUPTS which may lead to a deadlock without @@ -3310,7 +3325,7 @@ preserve_context_registers (os_context_t *c) /* On Darwin the signal context isn't a contiguous block of memory, * so just preserve_pointering its contents won't be sufficient. */ -#if defined(LISP_FEATURE_DARWIN) +#if defined(LISP_FEATURE_DARWIN)||defined(LISP_FEATURE_WIN32) #if defined LISP_FEATURE_X86 preserve_pointer((void*)*os_context_register_addr(c,reg_EAX)); preserve_pointer((void*)*os_context_register_addr(c,reg_ECX)); @@ -3339,9 +3354,11 @@ preserve_context_registers (os_context_t *c) #error "preserve_context_registers needs to be tweaked for non-x86 Darwin" #endif #endif +#if !defined(LISP_FEATURE_WIN32) for(ptr = ((void **)(c+1))-1; ptr>=(void **)c; ptr--) { preserve_pointer(*ptr); } +#endif } #endif @@ -4172,8 +4189,10 @@ general_alloc_internal(long nbytes, int page_type_flag, struct alloc_region *reg gc_assert((((unsigned long)region->free_pointer & LOWTAG_MASK) == 0) && ((nbytes & LOWTAG_MASK) == 0)); +#if !(defined(LISP_FEATURE_WIN32) && defined(LISP_FEATURE_SB_THREAD)) /* Must be inside a PA section. */ gc_assert(get_pseudo_atomic_atomic(thread)); +#endif if (nbytes > large_allocation) large_allocation = nbytes; @@ -4211,7 +4230,7 @@ general_alloc_internal(long nbytes, int page_type_flag, struct alloc_region *reg thread_register_gc_trigger(); #else set_pseudo_atomic_interrupted(thread); -#ifdef LISP_FEATURE_PPC +#ifdef GENCGC_IS_PRECISE /* PPC calls alloc() from a trap or from pa_alloc(), * look up the most context if it's from a trap. */ { @@ -4275,7 +4294,9 @@ general_alloc(long nbytes, int page_type_flag) lispobj * alloc(long nbytes) { +#if !(defined(LISP_FEATURE_WIN32) && defined(LISP_FEATURE_SB_THREAD)) gc_assert(get_pseudo_atomic_atomic(arch_os_get_current_thread())); +#endif return general_alloc(nbytes, BOXED_PAGE_FLAG); }