Files
Cesarus85--ringfall-mjolnir-vr/source/memory/stack_memory_pool.c
T

1234 lines
31 KiB
C

/*
STACK_MEMORY_POOL.C
symbols in this file:
0010E1E0 0090:
_stack_memory_pool_reset (0000)
0010E270 0040:
_code_0010e270 (0000)
0010E2B0 0030:
_code_0010e2b0 (0000)
0010E2E0 0050:
_code_0010e2e0 (0000)
0010E330 0030:
_code_0010e330 (0000)
0010E360 0080:
_code_0010e360 (0000)
0010E3E0 0050:
_code_0010e3e0 (0000)
0010E430 0060:
_code_0010e430 (0000)
0010E490 0080:
_code_0010e490 (0000)
0010E510 00a0:
_code_0010e510 (0000)
0010E5B0 0040:
_code_0010e5b0 (0000)
0010E5F0 0040:
_code_0010e5f0 (0000)
0010E630 0040:
_code_0010e630 (0000)
0010E670 0030:
_code_0010e670 (0000)
0010E6A0 00d0:
_code_0010e6a0 (0000)
0010E770 0080:
_code_0010e770 (0000)
0010E7F0 00a0:
_code_0010e7f0 (0000)
0010E890 00d0:
_code_0010e890 (0000)
0010E960 00a0:
_code_0010e960 (0000)
0010EA00 0280:
_code_0010ea00 (0000)
0010EC80 0080:
_dispose_handle (0000)
0010ED00 0070:
_lock_handle (0000)
0010ED70 00d0:
_unlock_handle (0000)
0010EE40 00b0:
_dispose_pointer (0000)
0010EEF0 0020:
_code_0010eef0 (0000)
0010EF10 0060:
_code_0010ef10 (0000)
0010EF70 00c0:
_code_0010ef70 (0000)
0010F030 0070:
_pool_new_handle (0000)
0010F0A0 00b0:
_pool_new_handle_clear (0000)
0010F150 0110:
_pool_resize_handle (0000)
0010F260 00b0:
_pool_new_pointer (0000)
0010F310 00f0:
_pool_new_pointer_clear (0000)
0010F400 0130:
_pool_resize_pointer (0000)
0027E6B4 0005:
??_C@_04CJIJKHMO@pool?$AA@ (0000)
0027E6BC 002a:
??_C@_0CK@POCGLLGP@c?3?2halo?2SOURCE?2memory?2stack_memo@ (0000)
0027E6E8 0006:
??_C@_05PIBOEKAB@block?$AA@ (0000)
0027E6F0 001b:
??_C@_0BL@DBFCIPGG@pool?5?$CG?$CG?5pool?9?$DObase_address?$AA@ (0000)
0027E70C 0037:
??_C@_0DH@EDIODODK@?$CB?$CCwrote?5beyond?5the?5valid?5address@ (0000)
0027E744 0022:
??_C@_0CC@ECLAPKCC@?$CB?$CCthis?5memory?5has?5been?5corrupted@ (0000)
0027E768 001c:
??_C@_0BM@JILEAMIL@?$CB?$CCpointer?5has?5invalid?5size?$CC?$AA@ (0000)
0027E784 001a:
??_C@_0BK@LDONEMGA@memory_block_valid?$CIblock?$CJ?$AA@ (0000)
0027E7A0 002b:
??_C@_0CL@HLEBFHCG@pool?5?$CG?$CG?5pool?9?$DObase_address?5?$CG?$CG?5po@ (0000)
0027E7CC 002f:
??_C@_0CP@BNFGAJLL@stack_memory_pool_valid_block?$CIpo@ (0000)
0027E800 0055:
??_C@_0FF@JCHHGMKP@stack_memory_pool_valid_block?$CIpo@ (0000)
0027E858 0054:
??_C@_0FE@NGEIOJCH@stack_memory_pool_valid_block?$CIpo@ (0000)
0027E8AC 000d:
??_C@_0N@CECKNFDB@invalid?5size?$AA@ (0000)
0027E8BC 001c:
??_C@_0BM@OEEFEPIM@free_space_in_pool_previous?$AA@ (0000)
0027E8D8 003c:
??_C@_0DM@JDDKECPN@?$CIpool?9?$DOlast_block?5?$DN?$DN?5NULL?$CJ?5?$CG?$CG?5?$CIp@ (0000)
0027E914 0011:
??_C@_0BB@LKLKPKKP@pool?9?$DOlast_block?$AA@ (0000)
0027E928 0053:
??_C@_0FD@KNOHBMJO@the?5memory?5pool?5has?5no?5more?5unsu@ (0000)
0027E980 0050:
??_C@_0FA@LKCLAHNE@allocation?5from?5memory?5pool?5fail@ (0000)
0027E9D0 0028:
??_C@_0CI@IMGJKFFB@not?5a?5valid?5handle?0?5or?5handle?5is@ (0000)
0027E9F8 0030:
??_C@_0DA@KBONCLF@not?5a?5valid?5handle?0?5or?5handle?5is@ (0000)
0027EA28 0002:
??_C@_01BDACAMKP@h?$AA@ (0000)
0027EA2C 0029:
??_C@_0CJ@NEONIHNA@invalid?5handle?0?5or?5handle?5was?5no@ (0000)
0027EA58 0010:
??_C@_0BA@KKNICBIG@invalid?5pointer?$AA@ (0000)
0027EA68 0038:
??_C@_0DI@NCMLNKNJ@not?5a?5valid?5handle?0?5or?5trying?5to@ (0000)
*/
/* ---------- headers */
#include "cseries.h"
/* ---------- constants */
/* ---------- macros */
/* ---------- structures */
struct stack_memory_pool_block
{
unsigned long size_and_flags;
long slot_index;
struct stack_memory_pool_block *previous;
struct stack_memory_pool_block *next;
void **handle;
long lock_count;
unsigned long header_signature;
byte data[1];
};
struct stack_memory_pool
{
char const *name;
byte *base_address;
long size;
long maximum_block_count;
long next_block_index;
long bytes_used;
long maximum_bytes_used;
unsigned long block_count;
unsigned long maximum_block_count_used;
long largest_block_size;
boolean disable_compaction;
byte unused29[3];
struct stack_memory_pool_block *first_block;
struct stack_memory_pool_block *last_block;
struct stack_memory_pool_block *blocks[1];
};
/* ---------- prototypes */
static void code_0010e270(
long slot_index,
struct stack_memory_pool_block *block,
long block_size);
static unsigned long code_0010e2b0(
struct stack_memory_pool_block *block);
static unsigned long code_0010e2e0(
struct stack_memory_pool_block *block);
static long code_0010e330(
struct stack_memory_pool_block *block);
static unsigned long code_0010e360(
struct stack_memory_pool *pool);
static long code_0010e3e0(
struct stack_memory_pool *pool);
static void code_0010e430(
struct stack_memory_pool *pool);
static void *code_0010e490(
struct stack_memory_pool *pool,
long allocation_size,
struct stack_memory_pool_block **previous_block);
static boolean code_0010e510(
struct stack_memory_pool_block *block);
static void code_0010e5b0(
struct stack_memory_pool_block *block);
static void code_0010e5f0(
struct stack_memory_pool_block *block);
static boolean code_0010e630(
struct stack_memory_pool_block *block);
static void *code_0010e670(
struct stack_memory_pool_block *block);
static void code_0010e6a0(
struct stack_memory_pool *pool);
static boolean code_0010e770(
struct stack_memory_pool_block *block,
struct stack_memory_pool *pool);
static void code_0010e7f0(
struct stack_memory_pool_block *block,
struct stack_memory_pool *pool);
static void *code_0010e890(
struct stack_memory_pool_block *block,
struct stack_memory_pool *pool);
static void code_0010e960(
struct stack_memory_pool_block *block,
struct stack_memory_pool *pool);
static struct stack_memory_pool_block *code_0010ea00(
long allocation_size,
struct stack_memory_pool *pool,
char const *file,
unsigned long line);
static struct stack_memory_pool_block *code_0010eef0(
long allocation_size,
struct stack_memory_pool *pool,
char const *file,
unsigned long line);
static struct stack_memory_pool_block *code_0010ef10(
long allocation_size,
struct stack_memory_pool *pool,
char const *file,
unsigned long line);
static struct stack_memory_pool_block *code_0010ef70(
struct stack_memory_pool *pool,
long allocation_size,
struct stack_memory_pool_block *block,
char const *file,
unsigned long line);
/* ---------- globals */
/* ---------- public code */
void stack_memory_pool_reset(
struct stack_memory_pool *pool)
{
unsigned long *pool_data = (unsigned long *)pool;
unsigned long saved_name;
unsigned long saved_base_address;
unsigned long saved_size;
unsigned long saved_maximum_block_count;
unsigned long *blocks;
unsigned long blocks_address;
if (!pool)
{
display_assert("pool", "c:\\halo\\SOURCE\\memory\\stack_memory_pool.c", 0x1B0, TRUE);
system_exit(-1);
}
saved_name = pool_data[0];
saved_base_address = pool_data[1];
saved_maximum_block_count = pool_data[3];
blocks = pool_data + 13;
blocks_address = (unsigned long)blocks;
saved_size = pool_data[2];
csmemset(blocks, 0, saved_maximum_block_count * sizeof(*blocks));
csmemset(pool, 0, 0x34);
pool_data[0] = saved_name;
pool_data[1] = saved_base_address;
pool_data[3] = saved_maximum_block_count;
pool_data[2] = saved_size;
csmemcpy(blocks, &blocks_address, sizeof(blocks_address));
/* Retain the private block-header helpers until their allocator callers land. */
if (FALSE)
{
struct stack_memory_pool_block *block = pool->first_block;
code_0010e270(0, block, sizeof(*block));
code_0010e2b0(block);
code_0010e2e0(block);
code_0010e330(block);
code_0010e360(pool);
code_0010e3e0(pool);
code_0010e430(pool);
code_0010e490(pool, sizeof(*block), &block);
code_0010e510(block);
code_0010e5b0(block);
code_0010e5f0(block);
code_0010e630(block);
code_0010e670(block);
code_0010e6a0(pool);
code_0010e770(block, pool);
code_0010e7f0(block, pool);
code_0010e890(block, pool);
code_0010e960(block, pool);
code_0010ea00(sizeof(*block), pool, __FILE__, __LINE__);
code_0010eef0(sizeof(*block), pool, __FILE__, __LINE__);
code_0010ef10(sizeof(*block), pool, __FILE__, __LINE__);
code_0010ef70(pool, sizeof(*block), block, __FILE__, __LINE__);
}
return;
}
void dispose_handle(
struct stack_memory_pool *pool,
struct stack_memory_pool_block *block)
{
unsigned long block_size;
if (!code_0010e770(block, pool))
{
display_assert(
"not a valid handle, or handle is locked",
"c:\\halo\\SOURCE\\memory\\stack_memory_pool.c",
0xE8,
TRUE);
system_exit(-1);
}
match_assert("c:\\halo\\SOURCE\\memory\\stack_memory_pool.c", 0x22F, block);
block_size = block->size_and_flags&0x7FFFFFFF;
code_0010e7f0(block, pool);
pool->bytes_used -= block_size;
pool->block_count--;
return;
}
void lock_handle(
struct stack_memory_pool *pool,
void **h)
{
struct stack_memory_pool_block *block;
match_assert("c:\\halo\\SOURCE\\memory\\stack_memory_pool.c", 0xF7, h);
block = *h;
if (!code_0010e770(block, pool))
{
display_assert(
"not a valid handle, or handle is already locked",
"c:\\halo\\SOURCE\\memory\\stack_memory_pool.c",
0xFA,
TRUE);
system_exit(-1);
}
*h = code_0010e890(block, pool);
return;
}
void unlock_handle(
struct stack_memory_pool *pool,
void *h)
{
struct stack_memory_pool_block *block = NULL;
long block_index;
match_assert("c:\\halo\\SOURCE\\memory\\stack_memory_pool.c", 0x107, h);
for (block_index = 0; block_index < pool->maximum_block_count; block_index++)
{
block = pool->blocks[block_index];
if (block)
{
if (!code_0010e510(block))
{
display_assert(
"memory_block_valid(block)",
"c:\\halo\\SOURCE\\memory\\stack_memory_pool.c",
0x23F,
TRUE);
system_exit(-1);
}
if (block->data == h)
{
block = pool->blocks[block_index];
break;
}
}
}
if (!block)
{
display_assert(
"invalid handle, or handle was not locked",
"c:\\halo\\SOURCE\\memory\\stack_memory_pool.c",
0x111,
TRUE);
system_exit(-1);
}
code_0010e960(block, pool);
return;
}
void dispose_pointer(
struct stack_memory_pool *pool,
void *p)
{
struct stack_memory_pool_block *block;
unsigned long block_size;
match_assert("c:\\halo\\SOURCE\\memory\\stack_memory_pool.c", 0x197, p);
block = (struct stack_memory_pool_block *)((byte *)p-0x1C);
if (!code_0010e770(block, pool))
{
display_assert(
"invalid pointer",
"c:\\halo\\SOURCE\\memory\\stack_memory_pool.c",
0x19D,
TRUE);
system_exit(-1);
}
match_assert("c:\\halo\\SOURCE\\memory\\stack_memory_pool.c", 0x22F, block);
block_size = block->size_and_flags&0x7FFFFFFF;
code_0010e7f0(block, pool);
pool->bytes_used -= block_size;
pool->block_count--;
return;
}
/* Exact January reconstruction: 0x70 padded bytes and one relocation. */
struct stack_memory_pool_block *pool_new_handle(
struct stack_memory_pool *pool,
long allocation_size,
char const *file,
unsigned long line)
{
struct stack_memory_pool_block *block;
block = code_0010ea00(allocation_size, pool, file, line);
if (block)
{
pool->bytes_used += block->size_and_flags&0x7FFFFFFF;
pool->block_count++;
if (pool->bytes_used > pool->maximum_bytes_used)
pool->maximum_bytes_used = pool->bytes_used;
if (pool->block_count > pool->maximum_block_count_used)
pool->maximum_block_count_used = pool->block_count;
if ((block->size_and_flags&0x7FFFFFFF) > (unsigned long)pool->largest_block_size)
pool->largest_block_size = block->size_and_flags&0x7FFFFFFF;
return block;
}
return NULL;
}
/* Exact January reconstruction: 0xB0 padded bytes and seven relocations. */
struct stack_memory_pool_block *pool_new_handle_clear(
struct stack_memory_pool *pool,
long allocation_size,
char const *file,
unsigned long line)
{
struct stack_memory_pool_block *block;
block = code_0010ea00(allocation_size, pool, file, line);
if (block)
{
match_vassert(
"c:\\halo\\SOURCE\\memory\\stack_memory_pool.c",
0x23F,
code_0010e510(block),
"memory_block_valid(block)");
csmemset(block->data, 0, allocation_size);
pool->bytes_used += block->size_and_flags&0x7FFFFFFF;
pool->block_count++;
if (pool->bytes_used > pool->maximum_bytes_used)
pool->maximum_bytes_used = pool->bytes_used;
if (pool->block_count > pool->maximum_block_count_used)
pool->maximum_block_count_used = pool->block_count;
if ((block->size_and_flags&0x7FFFFFFF) > (unsigned long)pool->largest_block_size)
pool->largest_block_size = block->size_and_flags&0x7FFFFFFF;
return block;
}
return NULL;
}
/* NonMatching foundation: all fifteen relocation identities recovered;
target/candidate padded sizes are 0x110/0x100. */
boolean pool_resize_handle(
struct stack_memory_pool *pool,
struct stack_memory_pool_block **handle,
long allocation_size,
char const *file,
unsigned long line)
{
struct stack_memory_pool_block *block;
struct stack_memory_pool_block *new_block;
unsigned long old_block_size;
unsigned long new_block_size;
boolean result;
match_assert("c:\\halo\\SOURCE\\memory\\stack_memory_pool.c", 0xC1, handle);
block = *handle;
result = code_0010e770(block, pool);
if (!result)
{
display_assert(
"not a valid handle, or trying to resize while locked",
"c:\\halo\\SOURCE\\memory\\stack_memory_pool.c",
0xC5,
TRUE);
system_exit(-1);
}
else
{
match_assert("c:\\halo\\SOURCE\\memory\\stack_memory_pool.c", 0x22F, block);
old_block_size = block->size_and_flags&0x7FFFFFFF;
new_block = code_0010ef70(pool, allocation_size, block, file, line);
if (!new_block)
{
result = FALSE;
}
else
{
*handle = new_block;
new_block_size = new_block->size_and_flags&0x7FFFFFFF;
pool->bytes_used += new_block_size-old_block_size;
if (pool->bytes_used > pool->maximum_bytes_used)
pool->maximum_bytes_used = pool->bytes_used;
if (new_block_size > (unsigned long)pool->largest_block_size)
pool->largest_block_size = code_0010e2b0(new_block);
}
}
return result;
}
/* NonMatching foundation: all seven relocation identities recovered;
target/candidate padded sizes are 0xB0/0x90. */
void *pool_new_pointer(
struct stack_memory_pool *pool,
long allocation_size,
char const *file,
unsigned long line)
{
struct stack_memory_pool_block *block;
void *pointer = NULL;
block = code_0010ea00(allocation_size, pool, file, line);
if (block)
{
pointer = code_0010e890(block, pool);
match_vassert(
"c:\\halo\\SOURCE\\memory\\stack_memory_pool.c",
0x23F,
code_0010e510(block),
"memory_block_valid(block)");
pool->bytes_used += block->size_and_flags&0x7FFFFFFF;
pool->block_count++;
if (pool->bytes_used > pool->maximum_bytes_used)
pool->maximum_bytes_used = pool->bytes_used;
if (pool->block_count > pool->maximum_block_count_used)
pool->maximum_block_count_used = pool->block_count;
if ((block->size_and_flags&0x7FFFFFFF) > (unsigned long)pool->largest_block_size)
pool->largest_block_size = block->size_and_flags&0x7FFFFFFF;
}
return pointer;
}
/* NonMatching foundation: all thirteen relocation identities recovered;
target/candidate padded sizes are 0xF0/0xE0. */
void *pool_new_pointer_clear(
struct stack_memory_pool *pool,
long allocation_size,
char const *file,
unsigned long line)
{
struct stack_memory_pool_block *block;
void *pointer = NULL;
block = code_0010ea00(allocation_size, pool, file, line);
if (block)
{
match_vassert(
"c:\\halo\\SOURCE\\memory\\stack_memory_pool.c",
0x23F,
code_0010e510(block),
"memory_block_valid(block)");
pointer = block->data;
csmemset(pointer, 0, allocation_size);
code_0010e890(block, pool);
match_vassert(
"c:\\halo\\SOURCE\\memory\\stack_memory_pool.c",
0x23F,
code_0010e510(block),
"memory_block_valid(block)");
pool->bytes_used += block->size_and_flags&0x7FFFFFFF;
pool->block_count++;
if (pool->bytes_used > pool->maximum_bytes_used)
pool->maximum_bytes_used = pool->bytes_used;
if (pool->block_count > pool->maximum_block_count_used)
pool->maximum_block_count_used = pool->block_count;
if ((block->size_and_flags&0x7FFFFFFF) > (unsigned long)pool->largest_block_size)
pool->largest_block_size = block->size_and_flags&0x7FFFFFFF;
}
return pointer;
}
/* NonMatching foundation: target/candidate padded sizes are 0x130/0xF0;
four assertion relocations remain absent from the first grounded shape. */
void *pool_resize_pointer(
struct stack_memory_pool *pool,
void *pointer,
long allocation_size,
char const *file,
unsigned long line)
{
struct stack_memory_pool_block *block = NULL;
struct stack_memory_pool_block *new_block;
unsigned long old_block_size = 0;
unsigned long new_block_size;
if (pointer)
block = (struct stack_memory_pool_block *)((byte *)pointer-0x1C);
if (block)
{
match_assert("c:\\halo\\SOURCE\\memory\\stack_memory_pool.c", 0x22F, block);
old_block_size = block->size_and_flags&0x7FFFFFFF;
}
new_block = code_0010ef70(pool, allocation_size, block, file, line);
if (!new_block)
return NULL;
match_vassert(
"c:\\halo\\SOURCE\\memory\\stack_memory_pool.c",
0x215,
code_0010e510(new_block),
"memory_block_valid(block)");
if (!((new_block->size_and_flags>>31)&1))
code_0010e890(new_block, pool);
match_vassert(
"c:\\halo\\SOURCE\\memory\\stack_memory_pool.c",
0x23F,
code_0010e510(new_block),
"memory_block_valid(block)");
new_block_size = new_block->size_and_flags&0x7FFFFFFF;
pool->bytes_used += new_block_size-old_block_size;
pool->block_count += old_block_size == 0;
if (pool->bytes_used > pool->maximum_bytes_used)
pool->maximum_bytes_used = pool->bytes_used;
if (pool->block_count > pool->maximum_block_count_used)
pool->maximum_block_count_used = pool->block_count;
if (new_block_size > (unsigned long)pool->largest_block_size)
pool->largest_block_size = new_block_size;
return new_block->data;
}
/* ---------- private code */
static void code_0010e270(
long slot_index,
struct stack_memory_pool_block *block,
long block_size)
{
match_assert("c:\\halo\\SOURCE\\memory\\stack_memory_pool.c", 0x21F, block);
block->size_and_flags = block_size;
block->slot_index = slot_index;
block->header_signature = 'fryd';
*(unsigned long *)((byte *)block+block_size-sizeof(unsigned long)) = 'chkn';
return;
}
static unsigned long code_0010e2b0(
struct stack_memory_pool_block *block)
{
match_assert("c:\\halo\\SOURCE\\memory\\stack_memory_pool.c", 0x22F, block);
return block->size_and_flags&0x7FFFFFFF;
}
static unsigned long code_0010e2e0(
struct stack_memory_pool_block *block)
{
match_assert("c:\\halo\\SOURCE\\memory\\stack_memory_pool.c", 0x237, block);
return code_0010e2b0(block)-sizeof(*block);
}
static long code_0010e330(
struct stack_memory_pool_block *block)
{
match_assert("c:\\halo\\SOURCE\\memory\\stack_memory_pool.c", 0x24A, block);
return block->slot_index;
}
static unsigned long code_0010e360(
struct stack_memory_pool *pool)
{
struct stack_memory_pool_block *block;
match_assert(
"c:\\halo\\SOURCE\\memory\\stack_memory_pool.c",
0x2FC,
pool && pool->base_address);
if (!pool->first_block)
return pool->size;
block = pool->last_block;
match_assert("c:\\halo\\SOURCE\\memory\\stack_memory_pool.c", 0x22F, block);
return pool->size-(block->size_and_flags&0x7FFFFFFF)+(unsigned long)pool->base_address-(unsigned long)block;
}
static long code_0010e3e0(
struct stack_memory_pool *pool)
{
long block_index;
match_assert("c:\\halo\\SOURCE\\memory\\stack_memory_pool.c", 0x310, pool);
for (block_index = 0; block_index < pool->maximum_block_count; block_index++)
{
if (!pool->blocks[block_index])
return block_index;
}
return NONE;
}
static void code_0010e430(
struct stack_memory_pool *pool)
{
long block_index;
match_assert("c:\\halo\\SOURCE\\memory\\stack_memory_pool.c", 0x321, pool);
block_index = pool->next_block_index;
if (block_index != NONE)
{
pool->next_block_index = NONE;
for (block_index++; block_index < pool->maximum_block_count; block_index++)
{
if (!pool->blocks[block_index])
{
pool->next_block_index = block_index;
break;
}
}
}
return;
}
static void *code_0010e490(
struct stack_memory_pool *pool,
long allocation_size,
struct stack_memory_pool_block **previous_block)
{
struct stack_memory_pool_block *block;
struct stack_memory_pool_block *next_block;
block = pool->first_block;
if (!block)
return NULL;
if (allocation_size <= (byte *)block-pool->base_address)
return pool->base_address;
next_block = block->next;
while (next_block)
{
match_assert("c:\\halo\\SOURCE\\memory\\stack_memory_pool.c", 0x22F, block);
if (allocation_size <= (byte *)next_block-((byte *)block+(block->size_and_flags&0x7FFFFFFF)))
{
*previous_block = block;
return (byte *)block+(block->size_and_flags&0x7FFFFFFF);
}
block = next_block;
next_block = next_block->next;
}
return NULL;
}
static boolean code_0010e510(
struct stack_memory_pool_block *block)
{
unsigned long block_size;
if (!block)
return FALSE;
block_size = block->size_and_flags&0x7FFFFFFF;
if (!(block_size-sizeof(*block)))
{
display_assert(
"!\"pointer has invalid size\"",
"c:\\halo\\SOURCE\\memory\\stack_memory_pool.c",
0x1E4,
TRUE);
system_exit(-1);
return FALSE;
}
if (block->header_signature != 'fryd')
{
display_assert(
"!\"this memory has been corrupted\"",
"c:\\halo\\SOURCE\\memory\\stack_memory_pool.c",
0x1E9,
TRUE);
system_exit(-1);
return FALSE;
}
if (*(unsigned long *)((byte *)block+block_size-sizeof(unsigned long)) != 'chkn')
{
display_assert(
"!\"wrote beyond the valid address space for this block\"",
"c:\\halo\\SOURCE\\memory\\stack_memory_pool.c",
0x1EE,
TRUE);
system_exit(-1);
return FALSE;
}
return TRUE;
}
static void code_0010e5b0(
struct stack_memory_pool_block *block)
{
match_vassert(
"c:\\halo\\SOURCE\\memory\\stack_memory_pool.c",
0x203,
code_0010e510(block),
"memory_block_valid(block)");
block->size_and_flags |= 0x80000000;
return;
}
static void code_0010e5f0(
struct stack_memory_pool_block *block)
{
match_vassert(
"c:\\halo\\SOURCE\\memory\\stack_memory_pool.c",
0x20C,
code_0010e510(block),
"memory_block_valid(block)");
block->size_and_flags &= 0x7FFFFFFF;
return;
}
static boolean code_0010e630(
struct stack_memory_pool_block *block)
{
match_vassert(
"c:\\halo\\SOURCE\\memory\\stack_memory_pool.c",
0x215,
code_0010e510(block),
"memory_block_valid(block)");
return (block->size_and_flags>>31)&1;
}
static void *code_0010e670(
struct stack_memory_pool_block *block)
{
match_vassert(
"c:\\halo\\SOURCE\\memory\\stack_memory_pool.c",
0x23F,
code_0010e510(block),
"memory_block_valid(block)");
return block->data;
}
static void code_0010e6a0(
struct stack_memory_pool *pool)
{
struct stack_memory_pool_block *block;
byte *previous_block;
unsigned long previous_size;
match_assert(
"c:\\halo\\SOURCE\\memory\\stack_memory_pool.c",
0x3AD,
pool && pool->base_address && pool->blocks);
block = pool->first_block;
if (!block || pool->disable_compaction)
return;
previous_block = pool->base_address;
previous_size = 0;
do
{
if (!code_0010e510(block))
{
display_assert(
"memory_block_valid(block)",
"c:\\halo\\SOURCE\\memory\\stack_memory_pool.c",
0x215,
TRUE);
system_exit(-1);
}
if (!((block->size_and_flags>>31)&1))
{
long gap = (byte *)block-previous_size-previous_block;
if (gap > 0)
{
unsigned long block_size = block->size_and_flags&0x7FFFFFFF;
struct stack_memory_pool_block *moved =
(struct stack_memory_pool_block *)(previous_block+previous_size);
csmemmove(moved, block, block_size);
block = moved;
if (block->previous)
block->previous->next = block;
}
}
previous_size = block->size_and_flags&0x7FFFFFFF;
previous_block = (byte *)block;
block = block->next;
} while (block);
return;
}
static boolean code_0010e770(
struct stack_memory_pool_block *block,
struct stack_memory_pool *pool)
{
struct stack_memory_pool_block *pool_block;
long block_index;
boolean valid = FALSE;
match_assert(
"c:\\halo\\SOURCE\\memory\\stack_memory_pool.c",
0x3D7,
pool && pool->base_address);
if (
(byte *)block >= pool->base_address &&
(byte *)block < pool->base_address+pool->size &&
code_0010e510(block))
{
block_index = code_0010e330(block);
if (block_index < pool->maximum_block_count)
{
pool_block = pool->blocks[block_index];
if (
pool_block &&
pool_block->size_and_flags == block->size_and_flags &&
pool_block->previous == block->previous &&
pool_block->next == block->next)
{
valid = TRUE;
}
}
}
return valid;
}
static void code_0010e7f0(
struct stack_memory_pool_block *block,
struct stack_memory_pool *pool)
{
long block_index;
match_assert(
"c:\\halo\\SOURCE\\memory\\stack_memory_pool.c",
0x2D3,
code_0010e770(block, pool));
match_assert("c:\\halo\\SOURCE\\memory\\stack_memory_pool.c", 0x24A, block);
block_index = block->slot_index;
if (block->previous)
block->previous->next = block->next;
if (block->next)
block->next->previous = block->previous;
if (pool->first_block == block)
pool->first_block = block->next;
if (pool->last_block == block)
pool->last_block = block->previous;
pool->blocks[block_index] = NULL;
pool->next_block_index = pool->first_block ? block_index : 0;
return;
}
static void *code_0010e890(
struct stack_memory_pool_block *block,
struct stack_memory_pool *pool)
{
if (code_0010e770(block, pool))
{
match_assert(
"c:\\halo\\SOURCE\\memory\\stack_memory_pool.c",
0x215,
code_0010e510(block));
if (!(block->size_and_flags&0x80000000))
goto mark_block;
}
match_assert(
"c:\\halo\\SOURCE\\memory\\stack_memory_pool.c",
0x2E5,
code_0010e770(block, pool) && !(block->size_and_flags&0x80000000));
mark_block:
match_assert(
"c:\\halo\\SOURCE\\memory\\stack_memory_pool.c",
0x203,
code_0010e510(block));
block->size_and_flags |= 0x80000000;
match_assert(
"c:\\halo\\SOURCE\\memory\\stack_memory_pool.c",
0x23F,
code_0010e510(block));
return block->data;
}
static void code_0010e960(
struct stack_memory_pool_block *block,
struct stack_memory_pool *pool)
{
boolean locked;
if (code_0010e770(block, pool))
{
if (!code_0010e510(block))
{
display_assert(
"memory_block_valid(block)",
"c:\\halo\\SOURCE\\memory\\stack_memory_pool.c",
0x215,
TRUE);
system_exit(-1);
}
locked = (block->size_and_flags>>31)&1;
if (locked)
goto unlock_block;
}
display_assert(
"stack_memory_pool_valid_block(pool, reference) && memory_block_is_locked(reference)",
"c:\\halo\\SOURCE\\memory\\stack_memory_pool.c",
0x2F0,
TRUE);
system_exit(-1);
unlock_block:
if (!code_0010e510(block))
{
display_assert(
"memory_block_valid(block)",
"c:\\halo\\SOURCE\\memory\\stack_memory_pool.c",
0x20C,
TRUE);
system_exit(-1);
}
block->size_and_flags &= 0x7FFFFFFF;
return;
}
static struct stack_memory_pool_block *code_0010ea00(
long allocation_size,
struct stack_memory_pool *pool,
char const *file,
unsigned long line)
{
struct stack_memory_pool_block *previous_block = NULL;
struct stack_memory_pool_block *block;
unsigned long aligned_block_size;
long block_index;
void *free_space = NULL;
match_assert(
"c:\\halo\\SOURCE\\memory\\stack_memory_pool.c",
0x342,
pool && pool->base_address);
if (
allocation_size <= 0 ||
(unsigned long)allocation_size > 0x7FFFFFFF ||
pool->size <= allocation_size)
{
display_assert(
"invalid size",
"c:\\halo\\SOURCE\\memory\\stack_memory_pool.c",
0x3A4,
FALSE);
return NULL;
}
aligned_block_size = allocation_size+sizeof(*block);
while (aligned_block_size&3)
aligned_block_size++;
if (code_0010e360(pool) < aligned_block_size)
{
code_0010e6a0(pool);
if (code_0010e360(pool) < aligned_block_size)
{
free_space = code_0010e490(pool, aligned_block_size, &previous_block);
if (!free_space)
{
display_assert(
"allocation from memory pool failed; unable to find sufficient space in the pool",
"c:\\halo\\SOURCE\\memory\\stack_memory_pool.c",
0x39F,
FALSE);
return NULL;
}
}
}
if (pool->next_block_index == NONE)
{
block_index = code_0010e3e0(pool);
pool->next_block_index = block_index;
if (block_index == NONE)
{
display_assert(
"the memory pool has no more unsused master pointers; you need to use a bigger pool",
"c:\\halo\\SOURCE\\memory\\stack_memory_pool.c",
0x35F,
FALSE);
}
}
block_index = pool->next_block_index;
if (block_index == NONE)
return NULL;
if (free_space)
{
pool->blocks[block_index] = free_space;
}
else if (!pool->first_block)
{
pool->blocks[block_index] = (struct stack_memory_pool_block *)pool->base_address;
}
else
{
match_assert(
"c:\\halo\\SOURCE\\memory\\stack_memory_pool.c",
0x370,
pool->last_block);
pool->blocks[block_index] =
(struct stack_memory_pool_block *)((byte *)pool->last_block+code_0010e2b0(pool->last_block));
}
block = pool->blocks[pool->next_block_index];
code_0010e270(pool->next_block_index, block, aligned_block_size);
block->handle = (void **)file;
block->lock_count = line;
if (!pool->first_block)
{
match_assert(
"c:\\halo\\SOURCE\\memory\\stack_memory_pool.c",
0x37D,
(pool->last_block == NULL) && (pool->next_block_index == 0));
pool->last_block = block;
pool->first_block = block;
block->previous = NULL;
block->next = NULL;
}
else if (block < pool->first_block)
{
block->previous = NULL;
block->next = pool->first_block;
pool->first_block->previous = block;
pool->first_block = block;
}
else if (block > pool->last_block)
{
block->next = NULL;
block->previous = pool->last_block;
pool->last_block->next = block;
pool->last_block = block;
}
else
{
match_assert(
"c:\\halo\\SOURCE\\memory\\stack_memory_pool.c",
0x394,
previous_block);
block->previous = previous_block;
block->next = previous_block->next;
previous_block->next = block;
if (block->next)
block->next->previous = block;
}
code_0010e430(pool);
return block;
}
static struct stack_memory_pool_block *code_0010eef0(
long allocation_size,
struct stack_memory_pool *pool,
char const *file,
unsigned long line)
{
return code_0010ea00(allocation_size, pool, file, line);
}
static struct stack_memory_pool_block *code_0010ef10(
long allocation_size,
struct stack_memory_pool *pool,
char const *file,
unsigned long line)
{
struct stack_memory_pool_block *block;
block = code_0010ea00(allocation_size, pool, file, line);
if (block)
{
match_vassert(
"c:\\halo\\SOURCE\\memory\\stack_memory_pool.c",
0x23F,
code_0010e510(block),
"memory_block_valid(block)");
csmemset(block->data, 0, allocation_size);
}
return block;
}
/* NonMatching foundation: target/candidate padded sizes are both 0xC0;
one assertion relocation is absent from the first grounded shape. */
static struct stack_memory_pool_block *code_0010ef70(
struct stack_memory_pool *pool,
long allocation_size,
struct stack_memory_pool_block *block,
char const *file,
unsigned long line)
{
struct stack_memory_pool_block *new_block = NULL;
if (allocation_size > 0)
{
if (!block)
{
new_block = code_0010ea00(allocation_size, pool, file, line);
}
else
{
match_vassert(
"c:\\halo\\SOURCE\\memory\\stack_memory_pool.c",
0x2B4,
code_0010e770(block, pool),
"stack_memory_pool_valid_block(pool, reference)");
if ((unsigned long)allocation_size <= code_0010e2e0(block))
{
new_block = block;
}
else
{
new_block = code_0010ea00(allocation_size, pool, file, line);
if (new_block)
{
csmemcpy(
code_0010e670(new_block),
code_0010e670(block),
code_0010e2e0(block));
code_0010e7f0(block, pool);
}
}
}
}
return new_block;
}