#include <stdio.h>
#include <signal.h>
+#include <string.h>
#include "runtime.h"
#include "sbcl.h"
#include "os.h"
{
int tag;
lispobj *new;
- lispobj *source, *dest;
gc_assert(is_lisp_pointer(object));
gc_assert(from_space_p(object));
/* Allocate space. */
new = gc_general_alloc(nwords*4,ALLOC_BOXED,ALLOC_QUICK);
- dest = new;
- source = (lispobj *) native_pointer(object);
-
/* Copy the object. */
- while (nwords > 0) {
- dest[0] = source[0];
- dest[1] = source[1];
- dest += 2;
- source += 2;
- nwords -= 2;
- }
-
+ memcpy(new,native_pointer(object),nwords*4);
return make_lispobj(new,tag);
}
/* FIXME: Most calls end up going to some trouble to compute an
* 'n_words' value for this function. The system might be a little
* simpler if this function used an 'end' parameter instead. */
-
+#define PAGE_SIZE 4096
void
scavenge(lispobj *start, long n_words)
{
lispobj *end = start + n_words;
lispobj *object_ptr;
int n_words_scavenged;
-
+ if((((unsigned int)start & (PAGE_SIZE-1))==0) &&
+ (n_words>(PAGE_SIZE/4))) {
+ madvise(start, n_words*4, MADV_SEQUENTIAL|MADV_WILLNEED);
+ }
for (object_ptr = start;
object_ptr < end;
object_ptr += n_words_scavenged) {
switch (widetag_of(*first_pointer)) {
case SIMPLE_FUN_HEADER_WIDETAG:
- case CLOSURE_FUN_HEADER_WIDETAG:
copy = trans_fun_header(object);
break;
default:
/* fix self pointer. */
nfheaderp->self =
-#ifdef LISP_FEATURE_GENCGC /* GENCGC? Maybe x86 is better conditional */
+#ifdef LISP_FEATURE_X86
FUN_RAW_ADDR_OFFSET +
#endif
nfheaderl;
scavtab[CODE_HEADER_WIDETAG] = scav_code_header;
#ifndef LISP_FEATURE_GENCGC /* FIXME ..._X86 ? */
scavtab[SIMPLE_FUN_HEADER_WIDETAG] = scav_fun_header;
- scavtab[CLOSURE_FUN_HEADER_WIDETAG] = scav_fun_header;
scavtab[RETURN_PC_HEADER_WIDETAG] = scav_return_pc_header;
#endif
#ifdef LISP_FEATURE_X86
transother[COMPLEX_ARRAY_WIDETAG] = trans_boxed;
transother[CODE_HEADER_WIDETAG] = trans_code_header;
transother[SIMPLE_FUN_HEADER_WIDETAG] = trans_fun_header;
- transother[CLOSURE_FUN_HEADER_WIDETAG] = trans_fun_header;
transother[RETURN_PC_HEADER_WIDETAG] = trans_return_pc_header;
transother[CLOSURE_HEADER_WIDETAG] = trans_boxed;
transother[FUNCALLABLE_INSTANCE_HEADER_WIDETAG] = trans_boxed;
#if 0
/* We shouldn't see these, so just lose if it happens. */
sizetab[SIMPLE_FUN_HEADER_WIDETAG] = size_function_header;
- sizetab[CLOSURE_FUN_HEADER_WIDETAG] = size_function_header;
sizetab[RETURN_PC_HEADER_WIDETAG] = size_return_pc_header;
#endif
sizetab[CLOSURE_HEADER_WIDETAG] = size_boxed;