mm/mm_heap: fix mm_heap not support BUILD_FLAT

1. change ifdef __KERNEL__ to:
   if defined(CONFIG_BUILD_FLAT) || defined(__KERNEL__)

2. change mm_delaylist to *mm_delaylist

3. change FAR struct mm_delaynode_s *new to:
   FAR struct mm_delaynode_s *tmp

4. should check mm_trysemaphore() return values

Change-Id: I57ba991f13c3eaf56dc2d71ac946c11669e32dfa
Signed-off-by: ligd <liguiding@fishsemi.com>
This commit is contained in:
ligd
2020-04-10 12:32:32 +08:00
committed by patacongo
parent cbf31bca5c
commit ef360394c7
4 changed files with 23 additions and 18 deletions
+3 -3
View File
@@ -227,7 +227,7 @@ struct mm_freenode_s
FAR struct mm_freenode_s *blink; FAR struct mm_freenode_s *blink;
}; };
#ifdef __KERNEL__ #if defined(CONFIG_BUILD_FLAT) || defined(__KERNEL__)
struct mm_delaynode_s struct mm_delaynode_s
{ {
struct mm_delaynode_s *flink; struct mm_delaynode_s *flink;
@@ -274,10 +274,10 @@ struct mm_heap_s
struct mm_freenode_s mm_nodelist[MM_NNODES]; struct mm_freenode_s mm_nodelist[MM_NNODES];
#ifdef __KERNEL__ #if defined(CONFIG_BUILD_FLAT) || defined(__KERNEL__)
/* Free delay list, for some situation can't do free immdiately */ /* Free delay list, for some situation can't do free immdiately */
struct mm_delaynode_s mm_delaylist; struct mm_delaynode_s *mm_delaylist;
#endif #endif
}; };
+14 -9
View File
@@ -43,25 +43,24 @@
#include <debug.h> #include <debug.h>
#include <nuttx/arch.h> #include <nuttx/arch.h>
#include <nuttx/irq.h>
#include <nuttx/mm/mm.h> #include <nuttx/mm/mm.h>
/**************************************************************************** /****************************************************************************
* Private Functions * Private Functions
****************************************************************************/ ****************************************************************************/
#ifdef __KERNEL__ #if defined(CONFIG_BUILD_FLAT) || defined(__KERNEL__)
static void mm_add_delaylist(FAR struct mm_heap_s *heap, FAR void *mem) static void mm_add_delaylist(FAR struct mm_heap_s *heap, FAR void *mem)
{ {
FAR struct mm_delaynode_s *new = mem; FAR struct mm_delaynode_s *tmp = mem;
irqstate_t flags; irqstate_t flags;
/* Delay the deallocation until a more appropriate time. */ /* Delay the deallocation until a more appropriate time. */
flags = enter_critical_section(); flags = enter_critical_section();
new->flink = heap->mm_delaylist.flink; tmp->flink = heap->mm_delaylist;
heap->mm_delaylist.flink = new; heap->mm_delaylist = tmp;
leave_critical_section(flags); leave_critical_section(flags);
} }
@@ -85,6 +84,9 @@ void mm_free(FAR struct mm_heap_s *heap, FAR void *mem)
FAR struct mm_freenode_s *node; FAR struct mm_freenode_s *node;
FAR struct mm_freenode_s *prev; FAR struct mm_freenode_s *prev;
FAR struct mm_freenode_s *next; FAR struct mm_freenode_s *next;
#if defined(CONFIG_BUILD_FLAT) || defined(__KERNEL__)
int ret;
#endif
minfo("Freeing %p\n", mem); minfo("Freeing %p\n", mem);
@@ -95,7 +97,7 @@ void mm_free(FAR struct mm_heap_s *heap, FAR void *mem)
return; return;
} }
#ifdef __KERNEL__ #if defined(CONFIG_BUILD_FLAT) || defined(__KERNEL__)
/* Check current environment */ /* Check current environment */
if (up_interrupt_context()) if (up_interrupt_context())
@@ -105,13 +107,16 @@ void mm_free(FAR struct mm_heap_s *heap, FAR void *mem)
mm_add_delaylist(heap, mem); mm_add_delaylist(heap, mem);
return; return;
} }
else if (mm_trysemaphore(heap) == 0) else if ((ret = mm_trysemaphore(heap)) == 0)
{ {
/* Got the sem, do free immediately */ /* Got the sem, do free immediately */
} }
else if (sched_idletask()) else if (ret == -ESRCH || sched_idletask())
{ {
/* We are in IDLE task & can't get sem, add to mm_delaylist */ /* We are in IDLE task & can't get sem, or meet -ESRCH return,
* which means we are in situations during context switching(See
* mm_trysemaphore() & getpid()). Then add to mm_delaylist.
*/
mm_add_delaylist(heap, mem); mm_add_delaylist(heap, mem);
return; return;
+2 -2
View File
@@ -175,10 +175,10 @@ void mm_initialize(FAR struct mm_heap_s *heap, FAR void *heapstart,
heap->mm_nregions = 0; heap->mm_nregions = 0;
#endif #endif
#ifdef __KERNEL__ #if defined(CONFIG_BUILD_FLAT) || defined(__KERNEL__)
/* Initialize mm_delaylist */ /* Initialize mm_delaylist */
heap->mm_delaylist.flink = NULL; heap->mm_delaylist = NULL;
#endif #endif
/* Initialize the node array */ /* Initialize the node array */
+4 -4
View File
@@ -59,7 +59,7 @@
* Private Functions * Private Functions
****************************************************************************/ ****************************************************************************/
#ifdef __KERNEL__ #if defined(CONFIG_BUILD_FLAT) || defined(__KERNEL__)
static void mm_free_delaylist(FAR struct mm_heap_s *heap) static void mm_free_delaylist(FAR struct mm_heap_s *heap)
{ {
FAR struct mm_delaynode_s *tmp; FAR struct mm_delaynode_s *tmp;
@@ -69,8 +69,8 @@ static void mm_free_delaylist(FAR struct mm_heap_s *heap)
flags = enter_critical_section(); flags = enter_critical_section();
tmp = heap->mm_delaylist.flink; tmp = heap->mm_delaylist;
heap->mm_delaylist.flink = NULL; heap->mm_delaylist = NULL;
leave_critical_section(flags); leave_critical_section(flags);
@@ -116,7 +116,7 @@ FAR void *mm_malloc(FAR struct mm_heap_s *heap, size_t size)
void *ret = NULL; void *ret = NULL;
int ndx; int ndx;
#ifdef __KERNEL__ #if defined(CONFIG_BUILD_FLAT) || defined(__KERNEL__)
/* Firstly, free mm_delaylist */ /* Firstly, free mm_delaylist */
mm_free_delaylist(heap); mm_free_delaylist(heap);