+#endif /* not HAVE_GETRLIMIT */
+
+ if (!warn_function)
+ return;
+
+ /* What level of warning does current memory usage demand? */
+ if (data_size > five_percent * 19)
+ new_warnlevel = warned_95;
+ else if (data_size > five_percent * 17)
+ new_warnlevel = warned_85;
+ else if (data_size > five_percent * 15)
+ new_warnlevel = warned_75;
+ else
+ new_warnlevel = not_warned;
+
+ /* If we have gone up a level, give the appropriate warning. */
+ if (new_warnlevel > warnlevel || new_warnlevel == warned_95)
+ {
+ warnlevel = new_warnlevel;
+ switch (warnlevel)
+ {
+ case warned_75:
+ (*warn_function) ("Warning: past 75% of memory limit");
+ break;
+
+ case warned_85:
+ (*warn_function) ("Warning: past 85% of memory limit");
+ break;
+
+ case warned_95:
+ (*warn_function) ("Warning: past 95% of memory limit");
+ }
+ }
+ /* Handle going down in usage levels, with some hysteresis. */
+ else
+ {
+ /* If we go down below 70% full, issue another 75% warning
+ when we go up again. */
+ if (data_size < five_percent * 14)
+ warnlevel = not_warned;
+ /* If we go down below 80% full, issue another 85% warning
+ when we go up again. */
+ else if (warnlevel > warned_75 && data_size < five_percent * 16)
+ warnlevel = warned_75;
+ /* If we go down below 90% full, issue another 95% warning
+ when we go up again. */
+ else if (warnlevel > warned_85 && data_size < five_percent * 18)
+ warnlevel = warned_85;
+ }
+
+ if (EXCEEDS_LISP_PTR (cp))
+ (*warn_function) ("Warning: memory in use exceeds lisp pointer size");
+}
+\f
+/* Enable memory usage warnings.
+ START says where the end of pure storage is.
+ WARNFUN specifies the function to call to issue a warning. */