/* * tlsf wrapper for barebox * * Copyright (C) 2011 Antony Pavlov * * This file is part of barebox. * See file CREDITS for list of people who contributed to this project. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 * as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * */ #include #include #include #include #include extern tlsf_pool tlsf_mem_pool; void *malloc(size_t bytes) { void *mem; /* * tlsf_malloc returns NULL for zero bytes, we instead want * to have a valid pointer. */ if (!bytes) bytes = 1; mem = tlsf_malloc(tlsf_mem_pool, bytes); if (!mem) errno = ENOMEM; return mem; } EXPORT_SYMBOL(malloc); void free(void *mem) { tlsf_free(tlsf_mem_pool, mem); } EXPORT_SYMBOL(free); void *realloc(void *oldmem, size_t bytes) { void *mem = tlsf_realloc(tlsf_mem_pool, oldmem, bytes); if (!mem) errno = ENOMEM; return mem; } EXPORT_SYMBOL(realloc); void *memalign(size_t alignment, size_t bytes) { void *mem = tlsf_memalign(tlsf_mem_pool, alignment, bytes); if (!mem) errno = ENOMEM; return mem; } EXPORT_SYMBOL(memalign); struct malloc_stats { size_t free; size_t used; }; static void malloc_walker(void* ptr, size_t size, int used, void *user) { struct malloc_stats *s = user; if (used) s->used += size; else s->free += size; } void malloc_stats(void) { struct malloc_stats s; s.used = 0; s.free = 0; tlsf_walk_heap(tlsf_mem_pool, malloc_walker, &s); printf("used: %zu\nfree: %zu\n", s.used, s.free); }