bool runTest(int * line, const char ** file) { bool tests_pass = true; do { uintptr_t init_sbrk_ptr = (uintptr_t)mbed_sbrk(0); uintptr_t ptr; ptr = (uintptr_t) mbed_sbrk(TEST_SMALL); if(!CHECK_EQ(ptr, (uintptr_t) init_sbrk_ptr, tests_pass, *file, *line)) { break; } ptr = (uintptr_t) mbed_sbrk(TEST_SMALL); if(!CHECK_EQ(ptr, init_sbrk_ptr + TEST_SMALL, tests_pass, *file, *line)) { break; } ptr = (uintptr_t) mbed_krbs(TEST_SMALL); if(!CHECK_EQ(ptr, (uintptr_t) &__mbed_krbs_start - TEST_SMALL, tests_pass, *file, *line)) { break; } if(!CHECK_EQ(mbed_sbrk_diff, (ptrdiff_t)&__heap_size - 3*TEST_SMALL - (init_sbrk_ptr - (uintptr_t)&__mbed_sbrk_start), tests_pass, *file, *line)) { break; } // Test small increments for (unsigned int i = 0; tests_pass && i < TEST_SMALL; i++) { ptr = (uintptr_t) mbed_krbs(i); if(!CHECK_EQ(0, ptr & (TEST_SMALL - 1), tests_pass, *file, *line)) { break; } } for (unsigned int i = 0; tests_pass && i < TEST_SMALL; i++) { ptr = (uintptr_t) mbed_sbrk(i); if(!CHECK_EQ(0, (uintptr_t) mbed_sbrk_ptr & (TEST_SMALL - 1), tests_pass, *file, *line)) { break; } } // Allocate a big block ptr = (uintptr_t) mbed_sbrk((ptrdiff_t)&__heap_size); if(!CHECK_EQ((intptr_t)ptr, -1, tests_pass, *file, *line)) { break; } ptr = (uintptr_t) mbed_krbs((ptrdiff_t)&__heap_size); if(!CHECK_EQ((intptr_t)ptr, -1, tests_pass, *file, *line)) { break; } break; } while (0); return tests_pass; }
void * mbed_ualloc(size_t bytes, UAllocTraits_t traits) { void * ptr = NULL; void * caller = (void*) caller_addr(); if (UALLOC_TEST_TRAITS(traits.flags, UALLOC_TRAITS_NEVER_FREE)) { ptr = mbed_krbs(bytes); // krbs uses the same semantics as sbrk, so translate a -1 to NULL. if (ptr == (void*)-1) { ptr = NULL; } if ((ptr != NULL) && UALLOC_TEST_TRAITS(traits.flags, UALLOC_TRAITS_ZERO_FILL)) { memset(ptr, 0, bytes); } } else if (UALLOC_TEST_TRAITS(traits.flags, UALLOC_TRAITS_ZERO_FILL)) { ptr = dlcalloc(1, bytes); } else if (!(traits.flags & ~UALLOC_TRAITS_BITMASK)) { ptr = dlmalloc(bytes); } else if (traits.flags & UALLOC_RESERVED_MASK) { ualloc_debug(UALLOC_DEBUG_ERROR, "ua c:%p reserved: %lx\n", caller, traits.flags & UALLOC_RESERVED_MASK); } if(ptr == NULL) { ualloc_debug(UALLOC_DEBUG_WARNING, "ua c:%p fail\n", caller); } else { ualloc_debug(UALLOC_DEBUG_LOG, "ua c:%p m:%p\n", caller, ptr); } return ptr; }