}
#endif
-#define BYTES_ZERO_BEFORE_END (1<<12)
-
-/* FIXME do we need this? Doesn't it duplicate lisp code in
- * scrub-control-stack? */
-
-static void
-zero_stack(void)
-{
- lispobj *ptr = current_control_stack_pointer;
- search:
- do {
- if (*ptr)
- goto fill;
- ptr++;
- } while (((unsigned long)ptr) & (BYTES_ZERO_BEFORE_END-1));
- return;
- fill:
- do {
- *ptr++ = 0;
- } while (((unsigned long)ptr) & (BYTES_ZERO_BEFORE_END-1));
-
- goto search;
-}
-
-
-static void *
+void *
gc_general_alloc(long bytes, int page_type_flag, int quick_p) {
lispobj *new=new_space_free_pointer;
new_space_free_pointer+=(bytes/N_WORD_BYTES);
/* it's possible that signals are blocked already if this was called
* from a signal handler (e.g. with the sigsegv gc_trigger stuff) */
- sigemptyset(&tmp);
- sigaddset_blockable(&tmp);
- thread_sigmask(SIG_BLOCK, &tmp, &old);
+ block_blockable_signals(0, &old);
current_static_space_free_pointer =
(lispobj *) ((unsigned long)
/* Maybe FIXME: it's possible that we could significantly reduce
* RSS by zeroing the from_space or madvise(MADV_DONTNEED) or
* similar os-dependent tricks here */
+#ifdef LISP_FEATURE_HPUX
+ /* hpux cant handle unmapping areas that are not 100% mapped */
+ clear_auto_gc_trigger();
+#endif
os_zero((os_vm_address_t) from_space,
(os_vm_size_t) dynamic_space_size);
#ifdef PRINTNOISE
printf("Zeroing empty part of control stack ...\n");
#endif
- zero_stack();
+ scrub_control_stack();
set_auto_gc_trigger(size_retained+bytes_consed_between_gcs);
thread_sigmask(SIG_SETMASK, &old, 0);
lose("set_auto_gc_trigger: tried to set gc trigger too high! (0x%08lx)\n",
(unsigned long)dynamic_usage);
-#if defined(SUNOS) || defined(SOLARIS)
+#if defined(SUNOS) || defined(SOLARIS) || defined(LISP_FEATURE_HPUX)
os_invalidate(addr, length);
#else
os_protect(addr, length, 0);
addr = (os_vm_address_t)current_auto_gc_trigger;
length = dynamic_space_size + (os_vm_address_t)current_dynamic_space - addr;
-#if defined(SUNOS) || defined(SOLARIS)
+#if defined(SUNOS) || defined(SOLARIS) || defined(LISP_FEATURE_HPUX)
/* don't want to force whole space into swapping mode... */
os_validate(addr, length);
#else
* the PA section */
SetSymbolValue(GC_PENDING,T,thread);
arch_set_pseudo_atomic_interrupted(context);
+ maybe_save_gc_mask_and_block_deferrables
+ (os_context_sigmask_addr(context));
} else {
maybe_gc(context);
}