forked from xuos/xiuos
Fix multicore byte_manager illegal parallel execution, fix w5500 pbuf creation failed checking.
This commit is contained in:
parent
efba3f3bf3
commit
aefe92d67d
|
@ -168,6 +168,9 @@ static struct pbuf* wiz_read_receive_pbuf(struct pbuf* buf)
|
|||
int32_t data_len = wiz_sock_recvfrom(0, rx_frame, RX_FRAME_SIZE, addr, &port);
|
||||
if (data_len > 0 && data_len <= RX_FRAME_SIZE) {
|
||||
buf = pbuf_alloc(PBUF_RAW, data_len, PBUF_POOL);
|
||||
if (buf == NULL) {
|
||||
return NULL;
|
||||
}
|
||||
memcpy(buf->payload, rx_frame, data_len);
|
||||
} else {
|
||||
return NULL;
|
||||
|
|
|
@ -61,6 +61,9 @@ enum SmallSizeAllocSize {
|
|||
#define SMALL_SIZE_32B(ITEMSIZE) ((ITEMSIZE + SIZEOF_DYNAMICALLOCNODE_MEM) * SMALL_NUMBER_32B) /* Calculate the total size for SIZEOF_32B blocks*/
|
||||
#define SMALL_SIZE_64B(ITEMSIZE) ((ITEMSIZE + SIZEOF_DYNAMICALLOCNODE_MEM) * SMALL_NUMBER_64B) /* Calculate the total size for SIZEOF_64B blocks*/
|
||||
|
||||
#define FREE_LIST_LOCK() DISABLE_INTERRUPT()
|
||||
#define FREE_LIST_UNLOCK(lock) ENABLE_INTERRUPT(lock)
|
||||
|
||||
/**
|
||||
* The structure describes an allocated memory block from dynamic buddy memory.
|
||||
*/
|
||||
|
@ -632,7 +635,7 @@ void *x_malloc(x_size_t size)
|
|||
register x_base lock = 0;
|
||||
|
||||
/* hold lock before allocation */
|
||||
lock = CriticalAreaLock();
|
||||
lock = FREE_LIST_LOCK();
|
||||
|
||||
/* alignment */
|
||||
size = ALIGN_MEN_UP(size, MEM_ALIGN_SIZE);
|
||||
|
@ -641,7 +644,7 @@ void *x_malloc(x_size_t size)
|
|||
#ifdef MEM_EXTERN_SRAM
|
||||
/* parameter detection */
|
||||
if (size == 0) {
|
||||
CriticalAreaUnLock(lock);
|
||||
FREE_LIST_UNLOCK(lock);
|
||||
return NONE;
|
||||
}
|
||||
if ((size > ByteManager.dynamic_buddy_manager.dynamic_buddy_end - ByteManager.dynamic_buddy_manager.dynamic_buddy_start - ByteManager.dynamic_buddy_manager.active_memory)) {
|
||||
|
@ -652,7 +655,7 @@ void *x_malloc(x_size_t size)
|
|||
#else
|
||||
/* parameter detection */
|
||||
if ((size == 0) || (size > ByteManager.dynamic_buddy_manager.dynamic_buddy_end - ByteManager.dynamic_buddy_manager.dynamic_buddy_start - ByteManager.dynamic_buddy_manager.active_memory)) {
|
||||
CriticalAreaUnLock(lock);
|
||||
FREE_LIST_UNLOCK(lock);
|
||||
return NONE;
|
||||
}
|
||||
#endif
|
||||
|
@ -682,7 +685,6 @@ try_extmem:
|
|||
CHECK(ExtByteManager[i].dynamic_buddy_manager.done->JudgeLegal(&ExtByteManager[i].dynamic_buddy_manager, ret - SIZEOF_DYNAMICALLOCNODE_MEM));
|
||||
break;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -690,7 +692,7 @@ try_extmem:
|
|||
}
|
||||
|
||||
/* release lock */
|
||||
CriticalAreaUnLock(lock);
|
||||
FREE_LIST_UNLOCK(lock);
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
@ -789,10 +791,10 @@ void x_free(void *pointer)
|
|||
}
|
||||
|
||||
/* hold lock before release */
|
||||
lock = CriticalAreaLock();
|
||||
lock = FREE_LIST_LOCK();
|
||||
|
||||
if (!ByteManager.dynamic_buddy_manager.done->JudgeLegal(&ByteManager.dynamic_buddy_manager, pointer)) {
|
||||
CriticalAreaUnLock(lock);
|
||||
FREE_LIST_UNLOCK(lock);
|
||||
SYS_ERR("[%s] Freeing a unallocated address.\n", __func__);
|
||||
return;
|
||||
}
|
||||
|
@ -823,7 +825,7 @@ void x_free(void *pointer)
|
|||
}
|
||||
|
||||
/* release the lock */
|
||||
CriticalAreaUnLock(lock);
|
||||
FREE_LIST_UNLOCK(lock);
|
||||
}
|
||||
|
||||
#ifdef MEM_EXTERN_SRAM
|
||||
|
@ -868,7 +870,6 @@ void ExtSramInitBoardMemory(void *start_phy_address, void *end_phy_address, uint
|
|||
ExtByteManager[extsram_idx].dynamic_buddy_manager.done = &DynamicDone;
|
||||
ExtByteManager[extsram_idx].done = &NodeDone;
|
||||
|
||||
|
||||
/* dynamic buddy memory initialization */
|
||||
ExtByteManager[extsram_idx].dynamic_buddy_manager.done->init(&ExtByteManager[extsram_idx].dynamic_buddy_manager, ExtByteManager[extsram_idx].dynamic_buddy_manager.dynamic_buddy_start, ExtByteManager[extsram_idx].dynamic_buddy_manager.dynamic_buddy_end - ExtByteManager[extsram_idx].dynamic_buddy_manager.dynamic_buddy_start);
|
||||
}
|
||||
|
@ -916,7 +917,6 @@ void InitBoardMemory(void *start_phy_address, void *end_phy_address)
|
|||
ByteManager.static_manager[MM_SEGMENT_64B].done = &StaticDone;
|
||||
ByteManager.done = &NodeDone;
|
||||
|
||||
|
||||
/* dynamic buddy memory initialization */
|
||||
ByteManager.dynamic_buddy_manager.done->init(&ByteManager.dynamic_buddy_manager, ByteManager.dynamic_buddy_manager.dynamic_buddy_start, ByteManager.dynamic_buddy_manager.dynamic_buddy_end - ByteManager.dynamic_buddy_manager.dynamic_buddy_start);
|
||||
|
||||
|
@ -941,14 +941,13 @@ void *x_umalloc(x_size_t size)
|
|||
void* ret = NONE;
|
||||
register x_base lock = 0;
|
||||
|
||||
|
||||
#ifdef MEM_EXTERN_SRAM
|
||||
/* parameter detection */
|
||||
if (size == 0) {
|
||||
return NONE;
|
||||
}
|
||||
if ((size > ByteManager.dynamic_buddy_manager.dynamic_buddy_end - ByteManager.dynamic_buddy_manager.dynamic_buddy_start - ByteManager.dynamic_buddy_manager.active_memory)) {
|
||||
lock = CriticalAreaLock();
|
||||
lock = FREE_LIST_LOCK();
|
||||
/* alignment */
|
||||
size = ALIGN_MEN_UP(size, MEM_ALIGN_SIZE);
|
||||
goto try_extmem;
|
||||
|
@ -961,14 +960,13 @@ void *x_umalloc(x_size_t size)
|
|||
#endif
|
||||
|
||||
/* hold lock before allocation */
|
||||
lock = CriticalAreaLock();
|
||||
lock = FREE_LIST_LOCK();
|
||||
/* alignment */
|
||||
size = ALIGN_MEN_UP(size, MEM_ALIGN_SIZE);
|
||||
ret = UserByteManager.dynamic_buddy_manager.done->malloc(&UserByteManager.dynamic_buddy_manager, size, DYNAMIC_BLOCK_NO_EXTMEM_MASK);
|
||||
if (ret != NONE)
|
||||
CHECK(UserByteManager.dynamic_buddy_manager.done->JudgeLegal(&UserByteManager.dynamic_buddy_manager, ret - SIZEOF_DYNAMICALLOCNODE_MEM));
|
||||
|
||||
|
||||
#ifdef MEM_EXTERN_SRAM
|
||||
try_extmem:
|
||||
if (NONE == ret) {
|
||||
|
@ -984,7 +982,7 @@ try_extmem:
|
|||
}
|
||||
#endif
|
||||
/* release lock */
|
||||
CriticalAreaUnLock(lock);
|
||||
FREE_LIST_UNLOCK(lock);
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
@ -1083,7 +1081,7 @@ void x_ufree(void *pointer)
|
|||
CHECK(UserByteManager.dynamic_buddy_manager.done->JudgeLegal(&UserByteManager.dynamic_buddy_manager, pointer));
|
||||
|
||||
/* hold lock before release */
|
||||
lock = CriticalAreaLock();
|
||||
lock = FREE_LIST_LOCK();
|
||||
node = PTR2ALLOCNODE((char*)pointer - SIZEOF_DYNAMICALLOCNODE_MEM);
|
||||
CHECK(UserByteManager.done->JudgeAllocated(node));
|
||||
|
||||
|
@ -1102,7 +1100,7 @@ void x_ufree(void *pointer)
|
|||
UserByteManager.dynamic_buddy_manager.done->release(&UserByteManager, pointer);
|
||||
#endif
|
||||
/* release the lock */
|
||||
CriticalAreaUnLock(lock);
|
||||
FREE_LIST_UNLOCK(lock);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -1213,7 +1211,7 @@ void ShowBuddy(void)
|
|||
int lock = 0;
|
||||
struct DynamicFreeNode *debug = NONE;
|
||||
|
||||
lock = CriticalAreaLock();
|
||||
lock = FREE_LIST_LOCK();
|
||||
KPrintf("\n\033[41;1mlist memory information\033[0m\n", __func__);
|
||||
for(int level = 0; level < MEM_LINKNRS; level++) {
|
||||
KPrintf("%s level [%d],memory size[2^%d] \n",__func__, level,level +6);
|
||||
|
@ -1258,7 +1256,7 @@ void ShowBuddy(void)
|
|||
}
|
||||
|
||||
#endif
|
||||
CriticalAreaUnLock(lock);
|
||||
FREE_LIST_UNLOCK(lock);
|
||||
}
|
||||
SHELL_EXPORT_CMD(SHELL_CMD_PERMISSION(0)|SHELL_CMD_TYPE(SHELL_TYPE_CMD_FUNC)|SHELL_CMD_PARAM_NUM(0),
|
||||
ShowBuddy,ShowBuddy,list memory usage information);
|
||||
|
|
Loading…
Reference in New Issue