X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=src%2Fruntime%2Fgc.h;h=2929013fba2bf96f953ad6c9df4946f4f1b8714b;hb=427cac784579a935a06b0d66bac63dbf9bf325a4;hp=8861fecab44246e9b77f03f7f7736a2bc94cde06;hpb=6cbe4d8ba6d7bc469d03a72514c789b1f3944878;p=sbcl.git diff --git a/src/runtime/gc.h b/src/runtime/gc.h index 8861fec..2929013 100644 --- a/src/runtime/gc.h +++ b/src/runtime/gc.h @@ -15,19 +15,72 @@ #ifndef _GC_H_ #define _GC_H_ +typedef signed long page_index_t; +typedef signed char generation_index_t; extern void gc_init(void); +extern void gc_initialize_pointers(void); +extern void collect_garbage(generation_index_t last_gen); +extern void gc_init_tables(void); -/* Note: CMU CL had two different argument conventions for - * collect_garbage(..), depending on whether gencgc was in use. SBCL - * should have only one, which is automatic right now (20000814) since - * we only support gencgc, but should also be maintained if someone - * adds another GC, or ports one of the other CMU CL GCs like gengc. */ -extern void collect_garbage(unsigned last_gen); #include "os.h" extern void set_auto_gc_trigger(os_vm_size_t usage); extern void clear_auto_gc_trigger(void); -#endif _GC_H_ +extern int maybe_gc_pending; + +#include "fixnump.h" + +#if defined(LISP_FEATURE_X86) || defined(LISP_FEATURE_X86_64) + +#define set_alloc_pointer(value) \ + SetSymbolValue(ALLOCATION_POINTER, value, 0) +#define get_alloc_pointer() \ + SymbolValue(ALLOCATION_POINTER, 0) +#define get_binding_stack_pointer(thread) \ + SymbolValue(BINDING_STACK_POINTER, thread) +#define get_pseudo_atomic_atomic(thread) \ + SymbolValue(PSEUDO_ATOMIC_ATOMIC, thread) +#define set_pseudo_atomic_atomic(thread) \ + SetSymbolValue(PSEUDO_ATOMIC_ATOMIC, make_fixnum(1), thread); +#define clear_pseudo_atomic_atomic(thread) \ + SetSymbolValue(PSEUDO_ATOMIC_ATOMIC, make_fixnum(0), thread); +#define get_pseudo_atomic_interrupted(thread) \ + fixnum_value(SymbolValue(PSEUDO_ATOMIC_INTERRUPTED, thread)) +#define clear_pseudo_atomic_interrupted(thread) \ + SetSymbolValue(PSEUDO_ATOMIC_INTERRUPTED, make_fixnum(0), thread) +#define set_pseudo_atomic_interrupted(thread) \ + SetSymbolValue(PSEUDO_ATOMIC_INTERRUPTED, make_fixnum(1), thread) + +#elif defined(LISP_FEATURE_PPC) && defined(LISP_FEATURE_GENCGC) + +#define set_alloc_pointer(value) \ + (dynamic_space_free_pointer = \ + (value) | (((unsigned long)dynamic_space_free_pointer) & LOWTAG_MASK)) + +#define get_alloc_pointer() \ + ((unsigned long) dynamic_space_free_pointer & ~LOWTAG_MASK) +#define get_binding_stack_pointer(thread) \ + (current_binding_stack_pointer) +#define get_pseudo_atomic_atomic(thread) \ + ((unsigned long)dynamic_space_free_pointer & flag_PseudoAtomic) +#define set_pseudo_atomic_atomic(thread) \ + (dynamic_space_free_pointer \ + = (lispobj*) ((unsigned long)dynamic_space_free_pointer | flag_PseudoAtomic)) +#define clear_pseudo_atomic_atomic(thread) \ + (dynamic_space_free_pointer \ + = (lispobj*) ((unsigned long) dynamic_space_free_pointer & ~flag_PseudoAtomic)) +#define get_pseudo_atomic_interrupted(thread) \ + ((unsigned long) dynamic_space_free_pointer & flag_PseudoAtomicInterrupted) +#define clear_pseudo_atomic_interrupted(thread) \ + (dynamic_space_free_pointer \ + = (lispobj*) ((unsigned long) dynamic_space_free_pointer & ~flag_PseudoAtomicInterrupted)) +#define set_pseudo_atomic_interrupted(thread) \ + (dynamic_space_free_pointer \ + = (lispobj*) ((unsigned long) dynamic_space_free_pointer | flag_PseudoAtomicInterrupted)) + +#endif + +#endif /* _GC_H_ */