# HG changeset patch # User Karl Heuer # Date 881214821 0 # Node ID 31468445f5181d83daac3d8ba0d1f554aa7b0b02 # Parent 089ca3e66e6dbfaad4788a4232d88e7d84aec315 (main): Fix the stack-limit code to calculate the ratio for re_max_failures accurately and leave some extra slack. diff -r 089ca3e66e6d -r 31468445f518 src/emacs.c --- a/src/emacs.c Thu Dec 04 05:49:21 1997 +0000 +++ b/src/emacs.c Thu Dec 04 05:53:41 1997 +0000 @@ -595,8 +595,14 @@ { long newlim; extern int re_max_failures; - /* Approximate the amount regex.c needs, plus some more. */ - newlim = re_max_failures * 2 * 20 * sizeof (char *); + /* Approximate the amount regex.c needs per unit of re_max_failures. */ + int ratio = 20 * sizeof (char *); + /* Then add 33% to cover the size of the smaller stacks that regex.c + successively allocates and discards, on its way to the maximum. */ + ratio += ratio / 3; + /* Add in some extra to cover + what we're likely to use for other reasons. */ + newlim = re_max_failures * ratio + 200000; #ifdef __NetBSD__ /* NetBSD (at least NetBSD 1.2G and former) has a bug in its stack allocation routine for new process that the allocation @@ -607,8 +613,8 @@ if (newlim > rlim.rlim_max) { newlim = rlim.rlim_max; - /* Don't let regex.c overflow the stack. */ - re_max_failures = newlim / (2 * 20 * sizeof (char *)); + /* Don't let regex.c overflow the stack we have. */ + re_max_failures = (newlim - 200000) / ratio; } if (rlim.rlim_cur < newlim) rlim.rlim_cur = newlim;