ref: 9d9d55a9d8d56c1044e89d93e85f21ff2348237a
parent: 356cc402cac65af3b617c6fb025cccc335a17251
author: Simon Howard <fraggle@gmail.com>
date: Tue Jun 16 15:47:13 EDT 2009
Automatically allocate a smaller zone size if it was not possible to allocate the default 16 MiB. Subversion-branch: /trunk/chocolate-doom Subversion-revision: 1603
--- a/src/i_system.c
+++ b/src/i_system.c
@@ -59,6 +59,8 @@
#include "w_wad.h"
#include "z_zone.h"
+#define MIN_RAM 4 /* MiB */
+
int mb_used = 16;
int show_endoom = 1;
@@ -68,8 +70,10 @@
{
}
-int I_GetHeapSize (void)
+byte *I_ZoneBase (int *size)
{
+ byte *zonemem;
+ int min_ram = MIN_RAM;
int p;
//!
@@ -79,28 +83,46 @@
//
p = M_CheckParm("-mb");
-
+
if (p > 0)
{
mb_used = atoi(myargv[p+1]);
+ min_ram = mb_used;
}
-
- return mb_used*1024*1024;
-}
-byte *I_ZoneBase (int *size)
-{
- byte *zonemem;
+ // Allocate the zone memory. This loop tries progressively smaller
+ // zone sizes until a size is found that can be allocated.
+ // If we used the -mb command line parameter, only the parameter
+ // provided is accepted.
- *size = I_GetHeapSize();
+ zonemem = NULL;
- zonemem = malloc(*size);
-
- if (zonemem == NULL)
+ while (zonemem == NULL)
{
- I_Error("Failed to allocate %i bytes for zone memory", *size);
+ // We need a reasonable minimum amount of RAM to start.
+
+ if (mb_used < min_ram)
+ {
+ I_Error("Unable to allocate %i MiB of RAM for zone", mb_used);
+ }
+
+ // Try to allocate the zone memory.
+
+ *size = mb_used * 1024 * 1024;
+
+ zonemem = malloc(*size);
+
+ // Failed to allocate? Reduce zone size until we reach a size
+ // that is acceptable. We decrease by 2 MiB at a time to ensure
+ // that there is 1-2 MiB still free on the system (my Windows
+ // Mobile PDA becomes unstable if very low on memory)
+
+ if (zonemem == NULL)
+ {
+ mb_used -= 2;
+ }
}
-
+
printf("zone memory: %p, %x allocated for zone\n",
zonemem, *size);