| Ilya Zakharevich on Thu, 12 Dec 2002 15:17:04 -0800 |
[Date Prev] [Date Next] [Thread Prev] [Thread Next] [Date Index] [Thread Index]
| [PATCH oldish CVS] os2 stacklimit |
The names of the macros would benefit from brushing up, but this would
require changes to Configure.
Enjoy,
Ilya
--- ./src/language/init.c-pre Thu Oct 31 14:12:10 2002
+++ ./src/language/init.c Sat Nov 16 14:19:26 2002
@@ -111,9 +112,15 @@ pop_stack(stack **pts)
/*********************************************************************/
/* adapted from Perl code written by Dominic Dunlop */
-#include <sys/resource.h>
void *PARI_stack_limit = NULL;
+# ifdef __EMX__ /* Emulate */
+extern void* get_stack(double,int);
+# define STACK_CHECK_INIT(b) \
+ ((void)b, PARI_stack_limit = get_stack(1./16, 32*1024))
+# else /* !__EMX__ */
+#include <sys/resource.h>
+
/* Set PARI_stack_limit to (a little above) the lowest safe address that can
* be used on the stack. Leave PARI_stack_limit at its initial value (NULL)
* to show no check should be made [init failed]. Assume stack grows downward.
@@ -128,6 +135,11 @@ pari_init_stackcheck(void *stack_base)
* PARI_stack_limit = stack_base - ((rip.rlim_cur/16)*15); */
PARI_stack_limit = (void*)((long)stack_base - (rip.rlim_cur/16)*15);
}
+# define STACK_CHECK_INIT(b) pari_init_stackcheck(b)
+# endif /* !__EMX__ */
+
+#else
+# define STACK_CHECK_INIT(b) ((void)b)
#endif /* STACK_CHECK */
/*********************************************************************/
@@ -496,9 +508,7 @@ pari_init(size_t parisize, ulong maxprim
{
long i;
-#ifdef STACK_CHECK
- pari_init_stackcheck(&i);
-#endif
+ STACK_CHECK_INIT(&i);
init_defaults(0);
if (INIT_JMP && setjmp(environnement))
{
--- ./src/language/anal.h-pre Thu Oct 24 02:58:06 2002
+++ ./src/language/anal.h Fri Nov 15 23:32:10 2002
@@ -140,6 +140,10 @@ enum { NONE, WARN, OLDFUN, OLDALL };
/* return type for GP functions */
enum { RET_GEN, RET_INT, RET_VOID };
+#ifdef __EMX__
+# define STACK_CHECK
+#endif
+
#ifdef STACK_CHECK
extern void *PARI_stack_limit;
#endif
--- ./src/systems/os2.c-pre Fri Nov 15 23:25:30 2002
+++ ./src/systems/os2.c Sat Nov 16 14:27:26 2002
@@ -3,6 +3,7 @@
#define INCL_BASE
#include <os2.h>
#include <float.h>
+#include <stdlib.h>
static ULONG retcode;
static char fail[300];
@@ -189,4 +190,26 @@ dlclose(void *handle)
retcode = rc;
return 2;
+}
+
+void*
+get_stack(double fraction, int min)
+{
+ int rc;
+ TIB *tib;
+ PIB *pib;
+ char *s, *e;
+ unsigned long d;
+
+ if (!(_emx_env & 0x200)) return 0; /* not OS/2. */
+ rc = DosGetInfoBlocks(&tib, &pib);
+ if (rc) return 0; /* ignore error */
+ s = (char*)tib->tib_pstack;
+ e = (char*)tib->tib_pstacklimit;
+ d = fraction * (e-s);
+ if (min >= 3*(e-s)/4)
+ min = 3*(e-s)/4;
+ if (d < min)
+ d = min;
+ return (void*)(s + d);
}