diff --git a/src/interpret.c b/src/interpret.c index eda985b07e4408ea27ad18ee9a21f409e791bf29..ef8e77c7d69d86030aae8c951b8c1506804bc6c4 100644 --- a/src/interpret.c +++ b/src/interpret.c @@ -26,6 +26,8 @@ #include "gc.h" #include "threads.h" +#include <fcntl.h> + #ifdef HAVE_MMAP #ifdef HAVE_SYS_TYPES_H #include <sys/types.h> @@ -61,7 +63,7 @@ struct frame *fp; /* frame pointer */ void init_interpreter() { #ifdef USE_MMAP_FOR_STACK - int fd; + static int fd = -1; #ifndef MAP_VARIABLE #define MAP_VARIABLE 0 @@ -75,12 +77,13 @@ void init_interpreter() #define MAP_FAILED -1 #endif -#ifdef MAP_ANONYMOUS - fd=-1; -#else +#ifndef MAP_ANONYMOUS #define MAP_ANONYMOUS 0 - fd=open("/dev/zero"); - if(fd < 0) fatal("Failed to open /dev/zero.\n"); + if(fd == -1) + { + fd=open("/dev/zero",O_RDONLY); + if(fd < 0) fatal("Failed to open /dev/zero.\n"); + } #endif #define MMALLOC(X,Y) (Y *)mmap(0,X*sizeof(Y),PROT_READ|PROT_WRITE, MAP_NORESERVE | MAP_PRIVATE | MAP_ANONYMOUS, fd, 0) @@ -89,10 +92,7 @@ void init_interpreter() mark_stack_malloced=0; evaluator_stack=MMALLOC(stack_size,struct svalue); mark_stack=MMALLOC(stack_size, struct svalue *); - - if(fd != -1) close(fd); - - if((char *)MAP_FAILED == (char *)evaluator_stack) evaluator_stack=0; + if((char *)MAP_FAILED == (char *)evaluator_stack) evaluator_stack=0; if((char *)MAP_FAILED == (char *)mark_stack) mark_stack=0; #else evaluator_stack=0; @@ -1341,11 +1341,12 @@ void safe_apply_low(struct object *o,int fun,int args) sp-=args; if(SETJMP(recovery)) { - automatic_fatal="Error in handle_error in master object!\nPrevious error:"; + ONERROR tmp; + SET_ONERROR(tmp,exit_on_error,"Error in handle_error in master object!"); assign_svalue_no_free(sp++, & throw_value); APPLY_MASTER("handle_error", 1); pop_stack(); - automatic_fatal=0; + UNSET_ONERROR(tmp); sp->u.integer = 0; sp->subtype=NUMBER_NUMBER;