Update mallocx() OOM test to deal with smaller hugemax.

Depending on virtual memory resource limits, it is necessary to attempt
allocating three maximally sized objects to trigger OOM rather than just
two, since the maximum supported size is slightly less than half the
total virtual memory address space.

This fixes a test failure that was introduced by
0c516a00c4 (Make *allocx() size class
overflow behavior defined.).

This resolves #379.
This commit is contained in:
Jason Evans 2016-05-03 09:37:54 -07:00
parent 21e33ed317
commit 44d12d435a

View File

@ -70,22 +70,27 @@ TEST_END
TEST_BEGIN(test_oom) TEST_BEGIN(test_oom)
{ {
size_t hugemax, size, alignment; size_t hugemax, size, alignment;
bool oom;
hugemax = get_huge_size(get_nhuge()-1); void *ptrs[3];
unsigned i;
/* /*
* It should be impossible to allocate two objects that each consume * It should be impossible to allocate three objects that each consume
* more than half the virtual address space. * nearly half the virtual address space.
*/ */
{ hugemax = get_huge_size(get_nhuge()-1);
void *p; oom = false;
for (i = 0; i < sizeof(ptrs) / sizeof(void *); i++) {
p = mallocx(hugemax, 0); ptrs[i] = mallocx(hugemax, 0);
if (p != NULL) { if (ptrs[i] == NULL)
assert_ptr_null(mallocx(hugemax, 0), oom = true;
"Expected OOM for mallocx(size=%#zx, 0)", hugemax); }
dallocx(p, 0); assert_true(oom,
} "Expected OOM during series of calls to mallocx(size=%zu, 0)",
hugemax);
for (i = 0; i < sizeof(ptrs) / sizeof(void *); i++) {
if (ptrs[i] != NULL)
dallocx(ptrs[i], 0);
} }
#if LG_SIZEOF_PTR == 3 #if LG_SIZEOF_PTR == 3