| } |
} |
| } |
} |
| |
|
| Address my_alloc(Cell size) |
#ifndef MAP_FAILED |
| |
#define MAP_FAILED ((Address) -1) |
| |
#endif |
| |
#ifndef MAP_FILE |
| |
# define MAP_FILE 0 |
| |
#endif |
| |
#ifndef MAP_PRIVATE |
| |
# define MAP_PRIVATE 0 |
| |
#endif |
| |
|
| |
#if defined(HAVE_MMAP) |
| |
static Address alloc_mmap(Cell size) |
| { |
{ |
| #if HAVE_MMAP |
|
| Address r; |
Address r; |
| |
|
| #if defined(MAP_ANON) |
#if defined(MAP_ANON) |
| #else /* !defined(MAP_ANON) */ |
#else /* !defined(MAP_ANON) */ |
| /* Ultrix (at least) does not define MAP_FILE and MAP_PRIVATE (both are |
/* Ultrix (at least) does not define MAP_FILE and MAP_PRIVATE (both are |
| apparently defaults) */ |
apparently defaults) */ |
| #ifndef MAP_FILE |
|
| # define MAP_FILE 0 |
|
| #endif |
|
| #ifndef MAP_PRIVATE |
|
| # define MAP_PRIVATE 0 |
|
| #endif |
|
| static int dev_zero=-1; |
static int dev_zero=-1; |
| |
|
| if (dev_zero == -1) |
if (dev_zero == -1) |
| dev_zero = open("/dev/zero", O_RDONLY); |
dev_zero = open("/dev/zero", O_RDONLY); |
| if (dev_zero == -1) { |
if (dev_zero == -1) { |
| r = (Address)-1; |
r = MAP_FAILED; |
| if (debug) |
if (debug) |
| fprintf(stderr, "open(\"/dev/zero\"...) failed (%s), no mmap; ", |
fprintf(stderr, "open(\"/dev/zero\"...) failed (%s), no mmap; ", |
| strerror(errno)); |
strerror(errno)); |
| } |
} |
| #endif /* !defined(MAP_ANON) */ |
#endif /* !defined(MAP_ANON) */ |
| after_alloc(r,size); |
after_alloc(r,size); |
| if (r!=(Address)-1) |
return r; |
| |
} |
| |
#endif |
| |
|
| |
Address my_alloc(Cell size) |
| |
{ |
| |
#if HAVE_MMAP |
| |
Address r; |
| |
|
| |
r=alloc_mmap(size); |
| |
if (r!=MAP_FAILED) |
| return r; |
return r; |
| #endif /* HAVE_MMAP */ |
#endif /* HAVE_MMAP */ |
| /* use malloc as fallback */ |
/* use malloc as fallback */ |
| #define dict_alloc(size) my_alloc(size) |
#define dict_alloc(size) my_alloc(size) |
| #endif |
#endif |
| |
|
| Address dict_alloc_read(FILE *file, Cell size, Cell offset) |
Address dict_alloc_read(FILE *file, Cell imagesize, Cell dictsize, Cell offset) |
| { |
{ |
| Address image = (Address) -1; |
Address image = MAP_FAILED; |
| |
|
| #ifndef mips_dict_alloc |
#if defined(HAVE_MMAP) && !defined(mips_dict_alloc) |
| if (offset==0) { |
if (offset==0) { |
| |
image=alloc_mmap(dictsize); |
| if (debug) |
if (debug) |
| fprintf(stderr,"try mmap(0, $%lx, ..., MAP_FILE, imagefile, 0); ", (long)size); |
fprintf(stderr,"try mmap($%lx, $%lx, ..., MAP_FIXED|MAP_FILE, imagefile, 0); ", (long)image, (long)imagesize); |
| image = mmap(0, size, PROT_EXEC|PROT_READ|PROT_WRITE, MAP_FILE|MAP_PRIVATE, fileno(file), 0); |
image = mmap(image, imagesize, PROT_EXEC|PROT_READ|PROT_WRITE, MAP_FIXED|MAP_FILE|MAP_PRIVATE, fileno(file), 0); |
| after_alloc(image,size); |
after_alloc(image,dictsize); |
| } |
} |
| #endif /* defined(mips_dict_alloc) */ |
#endif /* defined(MAP_ANON) && !defined(mips_dict_alloc) */ |
| if (image == (Address)-1) { |
if (image == MAP_FAILED) { |
| image = dict_alloc(size+offset)+offset; |
image = dict_alloc(dictsize+offset)+offset; |
| rewind(file); /* fseek(imagefile,0L,SEEK_SET); */ |
rewind(file); /* fseek(imagefile,0L,SEEK_SET); */ |
| fread(image, 1, size, file); |
fread(image, 1, imagesize, file); |
| } |
} |
| return image; |
return image; |
| } |
} |
| if (debug) |
if (debug) |
| fprintf(stderr,"pagesize=%ld\n",(unsigned long) pagesize); |
fprintf(stderr,"pagesize=%ld\n",(unsigned long) pagesize); |
| |
|
| image = dict_alloc_read(imagefile, preamblesize+dictsize, data_offset); |
image = dict_alloc_read(imagefile, preamblesize+header.image_size, |
| |
preamblesize+dictsize, data_offset); |
| imp=image+preamblesize; |
imp=image+preamblesize; |
| if (clear_dictionary) |
if (clear_dictionary) |
| memset(imp+header.image_size, 0, dictsize-header.image_size); |
memset(imp+header.image_size, 0, dictsize-header.image_size); |