X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=src%2Fruntime%2Fgencgc.c;h=f4ffd2ffa5a0567a721c53f921af9af818e28311;hb=bf40ae88bc289fd765a33861cc4bc0853ed483ba;hp=f4cbcc76ea700cf14af4d0570a68237f19b47b74;hpb=1b6d885eaf7872b41947e0ea0da134cceee4cc0f;p=sbcl.git diff --git a/src/runtime/gencgc.c b/src/runtime/gencgc.c index f4cbcc7..f4ffd2f 100644 --- a/src/runtime/gencgc.c +++ b/src/runtime/gencgc.c @@ -597,7 +597,7 @@ report_heap_exhaustion(long available, long requested, struct thread *th) } -#if defined(LISP_FEATURE_X86) || defined(LISP_FEATURE_X86_64) +#if defined(LISP_FEATURE_X86) void fast_bzero(void*, size_t); /* in -assem.S */ #endif @@ -4303,13 +4303,26 @@ general_alloc(sword_t nbytes, int page_type_flag) } } -lispobj * +lispobj AMD64_SYSV_ABI * alloc(long nbytes) { -#if !(defined(LISP_FEATURE_WIN32) && defined(LISP_FEATURE_SB_THREAD)) +#ifdef LISP_FEATURE_SB_SAFEPOINT_STRICTLY + struct thread *self = arch_os_get_current_thread(); + int was_pseudo_atomic = get_pseudo_atomic_atomic(self); + if (!was_pseudo_atomic) + set_pseudo_atomic_atomic(self); +#else gc_assert(get_pseudo_atomic_atomic(arch_os_get_current_thread())); #endif - return general_alloc(nbytes, BOXED_PAGE_FLAG); + + lispobj *result = general_alloc(nbytes, BOXED_PAGE_FLAG); + +#ifdef LISP_FEATURE_SB_SAFEPOINT_STRICTLY + if (!was_pseudo_atomic) + clear_pseudo_atomic_atomic(self); +#endif + + return result; } /* @@ -4419,8 +4432,12 @@ void gc_alloc_update_all_page_tables(void) { /* Flush the alloc regions updating the tables. */ struct thread *th; - for_each_thread(th) + for_each_thread(th) { gc_alloc_update_page_tables(BOXED_PAGE_FLAG, &th->alloc_region); +#if defined(LISP_FEATURE_SB_SAFEPOINT_STRICTLY) && !defined(LISP_FEATURE_WIN32) + gc_alloc_update_page_tables(BOXED_PAGE_FLAG, &th->sprof_alloc_region); +#endif + } gc_alloc_update_page_tables(UNBOXED_PAGE_FLAG, &unboxed_region); gc_alloc_update_page_tables(BOXED_PAGE_FLAG, &boxed_region); }