diff --git a/include/malloc.h b/include/malloc.h index 0862df9b1b..0d993b933d 100644 --- a/include/malloc.h +++ b/include/malloc.h @@ -25,6 +25,8 @@ * Included Files ****************************************************************************/ +#include + /**************************************************************************** * Pre-processor Definitions ****************************************************************************/ @@ -55,6 +57,7 @@ extern "C" #endif struct mallinfo mallinfo(void); +size_t malloc_usable_size(FAR void *ptr); #if defined(__cplusplus) } diff --git a/mm/mm_heap/Make.defs b/mm/mm_heap/Make.defs index 0dd77306b5..7cd2af981d 100644 --- a/mm/mm_heap/Make.defs +++ b/mm/mm_heap/Make.defs @@ -36,7 +36,7 @@ # Core heap allocator logic CSRCS += mm_initialize.c mm_sem.c mm_addfreechunk.c mm_size2ndx.c -CSRCS += mm_shrinkchunk.c +CSRCS += mm_malloc_usable_size.c mm_shrinkchunk.c CSRCS += mm_brkaddr.c mm_calloc.c mm_extend.c mm_free.c mm_mallinfo.c CSRCS += mm_malloc.c mm_memalign.c mm_realloc.c mm_zalloc.c mm_heapmember.c diff --git a/mm/mm_heap/mm_malloc_usable_size.c b/mm/mm_heap/mm_malloc_usable_size.c new file mode 100644 index 0000000000..24ba37be96 --- /dev/null +++ b/mm/mm_heap/mm_malloc_usable_size.c @@ -0,0 +1,57 @@ +/**************************************************************************** + * mm/mm_heap/mm_malloc_usable_size.c + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. The + * ASF licenses this file to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the + * License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + ****************************************************************************/ + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include + +#include +#include +#include + +#include + +/**************************************************************************** + * Public Functions + ****************************************************************************/ + +size_t malloc_usable_size(FAR void *mem) +{ + FAR struct mm_freenode_s *node; + + /* Protect against attempts to query a NULL reference */ + + if (!mem) + { + return 0; + } + + /* Map the memory chunk into a free node */ + + node = (FAR struct mm_freenode_s *)((FAR char *)mem - SIZEOF_MM_ALLOCNODE); + + /* Sanity check against double-frees */ + + DEBUGASSERT(node->preceding & MM_ALLOC_BIT); + + return node->size - SIZEOF_MM_ALLOCNODE; +}