0.9.9.38:
[sbcl.git] / src / runtime / gc.h
index 8861fec..2929013 100644 (file)
 
 #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_ */