pike.git / src / main.c

version» Context lines:

pike.git/src/main.c:1:   /*\   ||| This file a part of Pike, and is copyright by Fredrik Hubinette   ||| Pike is distributed as GPL (General Public License)   ||| See the files COPYING and DISCLAIMER for more information.   \*/   #include "global.h" - RCSID("$Id: main.c,v 1.57 1998/08/10 23:33:30 hubbe Exp $"); + RCSID("$Id: main.c,v 1.58 1998/09/02 01:05:45 grubba Exp $");   #include "fdlib.h"   #include "backend.h"   #include "module.h"   #include "object.h"   #include "lex.h"   #include "pike_types.h"   #include "builtin_functions.h"   #include "array.h"   #include "stralloc.h"   #include "interpret.h"
pike.git/src/main.c:316:    }    }else{    break;    }    }      #if !defined(RLIMIT_NOFILE) && defined(RLIMIT_OFILE)   #define RLIMIT_NOFILE RLIMIT_OFILE   #endif    +  stack_top = (char *)&argv; +  +  /* Adjust for anything already pushed on the stack. +  * We align on a 64 KB boundary. +  * Thus we at worst, lose 64 KB stack. +  * +  * We have to do it this way since some compilers don't like +  * & and | on pointers, and casting to an integer type is +  * too unsafe (consider 64-bit systems). +  */ + #if STACK_DIRECTION < 0 +  /* Equvivalent with |= 0xffff */ +  stack_top += (~((unsigned long)stack_top)) & 0xffff; + #else /* STACK_DIRECTION >= 0 */ +  /* Equvivalent with &= ~0xffff */ +  stack_top -= ( ((unsigned long)stack_top)) & 0xffff; + #endif /* STACK_DIRECTION < 0 */ +    #if defined(HAVE_GETRLIMIT) && defined(RLIMIT_STACK)    {    struct rlimit lim;    if(!getrlimit(RLIMIT_STACK, &lim))    {   #ifdef RLIM_INFINITY    if(lim.rlim_cur == RLIM_INFINITY)    lim.rlim_cur=1024*1024*128;   #endif -  stack_top= ((char *) &argv) + -  STACK_DIRECTION * (lim.rlim_cur - 8192 * sizeof(char *)); +  stack_top += STACK_DIRECTION * (lim.rlim_cur - 8192 * sizeof(char *)); +  + #ifdef STACK_DEBUG +  fprintf(stderr, "1: C-stack: 0x%08p - 0x%08p, direction:%d\n", +  &argv, stack_top, STACK_DIRECTION); + #endif /* STACK_DEBUG */    }    } - #else -  stack_top= ((char *) &argv) + -  STACK_DIRECTION * (1024*1024 * 128 - 8192 * sizeof(char *)); - #endif + #else /* !HAVE_GETRLIMIT || !RLIMIT_STACK */ +  /* 128 MB seems a bit extreme, most OS's seem to have their limit at ~8MB */ +  stack_top += STACK_DIRECTION * (1024*1024 * 128 - 8192 * sizeof(char *)); + #ifdef STACK_DEBUG +  fprintf(stderr, "2: C-stack: 0x%08p - 0x%08p, direction:%d\n", +  &argv, stack_top, STACK_DIRECTION); + #endif /* STACK_DEBUG */ + #endif /* HAVE_GETRLIMIT && RLIMIT_STACK */      #if defined(HAVE_SETRLIMIT) && defined(RLIMIT_NOFILE)    {    struct rlimit lim;    long tmp;    if(!getrlimit(RLIMIT_NOFILE, &lim))    {   #ifdef RLIM_INFINITY    if(lim.rlim_max == RLIM_INFINITY)    lim.rlim_max=MAX_OPEN_FILEDESCRIPTORS;