+#include "thread.h"
+#include "genesis/vector.h"
+#include "genesis/cons.h"
+#include "genesis/bignum.h"
+#include "genesis/sap.h"
+
+#define ALIGNED_SIZE(n) (n+LOWTAG_MASK) & ~LOWTAG_MASK
+
+#if defined LISP_FEATURE_GENCGC
+extern lispobj *alloc(int bytes);
+lispobj *
+pa_alloc(int bytes)
+{
+ lispobj *result=0;
+ struct thread *th=arch_os_get_current_thread();
+ /* FIXME: OOAO violation: see arch_pseudo_* */
+ SetSymbolValue(PSEUDO_ATOMIC_INTERRUPTED, make_fixnum(0),th);
+ SetSymbolValue(PSEUDO_ATOMIC_ATOMIC, make_fixnum(1),th);
+ result=alloc(bytes);
+ SetSymbolValue(PSEUDO_ATOMIC_ATOMIC, make_fixnum(0),th);
+ if (fixnum_value(SymbolValue(PSEUDO_ATOMIC_INTERRUPTED,th)))
+ /* even if we gc at this point, the new allocation will be
+ * protected from being moved, because result is on the c stack
+ * and points to it */
+ do_pending_interrupt();
+ return result;
+}
+
+#else