X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=src%2Fruntime%2Falloc.c;h=19518e4970d045619fae8bbdbc25e4051b3ed75c;hb=de0a47a2f2b165f34177669bd9499135847b4897;hp=fea25727613f4bfe30d1534d1668373fef2c2f69;hpb=6cbed049e2373d34fde8c96a3ce7b32b7034a7f2;p=sbcl.git diff --git a/src/runtime/alloc.c b/src/runtime/alloc.c index fea2572..19518e4 100644 --- a/src/runtime/alloc.c +++ b/src/runtime/alloc.c @@ -24,6 +24,7 @@ #include "globals.h" #include "gc.h" #include "thread.h" +#include "pseudo-atomic.h" #include "genesis/vector.h" #include "genesis/cons.h" #include "genesis/bignum.h" @@ -43,6 +44,16 @@ pa_alloc(int bytes, int page_type_flag) clear_pseudo_atomic_interrupted(th); set_pseudo_atomic_atomic(th); result = general_alloc(bytes, page_type_flag); +#if 0 + /* See how the runtime deals with GC being triggerred. */ + if ((SymbolValue(GC_PENDING,th) == NIL) && + (SymbolValue(GC_INHIBIT,th) == NIL) && + (random() < RAND_MAX/100)) { + SetSymbolValue(GC_PENDING,T,th); + set_pseudo_atomic_interrupted(th); + maybe_save_gc_mask_and_block_deferrables(NULL); + } +#endif clear_pseudo_atomic_atomic(th); if (get_pseudo_atomic_interrupted(th)) { @@ -73,8 +84,13 @@ pa_alloc(int bytes, int page_type_flag) static lispobj * pa_alloc(int bytes, int page_type_flag) { - /* FIXME: this is not pseudo atomic at all, but is called only from - * interrupt safe places like interrupt handlers. MG - 2005-08-09 */ + lispobj *result; + + /* This is not pseudo atomic at all, but is called only from + * interrupt safe places like interrupt handlers. MG - + * 2005-08-09 */ + check_deferrables_blocked_or_lose(); + result = dynamic_space_free_pointer; /* Align up to next dual word boundary. */ @@ -92,12 +108,13 @@ pa_alloc(int bytes, int page_type_flag) } #endif -lispobj * +static lispobj * alloc_unboxed(int type, int words) { lispobj *result; - result = pa_alloc(ALIGNED_SIZE((1 + words) * sizeof(lispobj)), UNBOXED_PAGE_FLAG); + result = pa_alloc(ALIGNED_SIZE((1 + words) * sizeof(lispobj)), + UNBOXED_PAGE_FLAG); *result = (lispobj) (words << N_WIDETAG_BITS) | type; return result; } @@ -108,7 +125,8 @@ alloc_vector(int type, int length, int size, int page_type_flag) struct vector *result; result = (struct vector *) - pa_alloc(ALIGNED_SIZE((2 + (length*size + 31) / 32) * sizeof(lispobj)), page_type_flag); + pa_alloc(ALIGNED_SIZE((2 + (length*size + 31) / 32) * sizeof(lispobj)), + page_type_flag); result->header = type; result->length = make_fixnum(length); @@ -120,7 +138,8 @@ lispobj alloc_cons(lispobj car, lispobj cdr) { struct cons *ptr = - (struct cons *)pa_alloc(ALIGNED_SIZE(sizeof(struct cons)), BOXED_PAGE_FLAG); + (struct cons *)pa_alloc(ALIGNED_SIZE(sizeof(struct cons)), + BOXED_PAGE_FLAG); ptr->car = car; ptr->cdr = cdr; @@ -148,7 +167,8 @@ lispobj alloc_base_string(char *str) { int len = strlen(str); - lispobj result = alloc_vector(SIMPLE_BASE_STRING_WIDETAG, len+1, 8, UNBOXED_PAGE_FLAG); + lispobj result = alloc_vector(SIMPLE_BASE_STRING_WIDETAG, len+1, 8, + UNBOXED_PAGE_FLAG); struct vector *vec = (struct vector *)native_pointer(result); vec->length = make_fixnum(len); @@ -170,14 +190,15 @@ alloc_sap(void *ptr) lispobj alloc_code_object (unsigned boxed, unsigned unboxed) { struct code * code; - unsigned size; - boxed = make_fixnum(boxed + 1 + 4); /* 4 == trace_table_offset offset in words */ + /* 4 == trace_table_offset offset in words */ + boxed = make_fixnum(boxed + 1 + 4); boxed &= ~LOWTAG_MASK; unboxed += LOWTAG_MASK; unboxed &= ~LOWTAG_MASK; - code = (struct code *) pa_alloc(ALIGNED_SIZE((boxed + unboxed) * sizeof(lispobj)), + code = (struct code *)pa_alloc(ALIGNED_SIZE((boxed + unboxed) * + sizeof(lispobj)), CODE_PAGE_FLAG); boxed = boxed << (N_WIDETAG_BITS - WORD_SHIFT);