From 349fcb86b8ffb1465613188b2086e81ea9766bfe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fredrik=20H=C3=BCbinette=20=28Hubbe=29?= <hubbe@hubbe.net> Date: Wed, 9 Oct 1996 04:01:18 +0200 Subject: [PATCH] mmap and exit_on_error fixed Rev: src/interpret.c:1.6 --- src/interpret.c | 25 +++++++++++++------------ 1 file changed, 13 insertions(+), 12 deletions(-) diff --git a/src/interpret.c b/src/interpret.c index eda985b07e..ef8e77c7d6 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; -- GitLab