/// Return an allocated memory block back to a Memory Pool. /// \param[in] mem pointer to memory pool. /// \param[in] block memory block to be returned to the memory pool. /// \return 1 - success, 0 - failure. __WEAK uint32_t osRtxMemoryFree (void *mem, void *block) { const mem_block_t *ptr; mem_block_t *p, *p_prev; // Check parameters if ((mem == NULL) || (block == NULL)) { EvrRtxMemoryFree(mem, block, 0U); //lint -e{904} "Return statement before end of function" [MISRA Note 1] return 0U; } // Memory block header ptr = MemBlockPtr(block, 0U); ptr--; // Search for block header p_prev = NULL; p = MemBlockPtr(mem, sizeof(mem_head_t)); while (p != ptr) { p_prev = p; p = p->next; if (p == NULL) { // Not found EvrRtxMemoryFree(mem, block, 0U); //lint -e{904} "Return statement before end of function" [MISRA Note 1] return 0U; } } // Update used memory (MemHeadPtr(mem))->used -= p->info & MB_INFO_LEN_MASK; // Free block if (p_prev == NULL) { // Release first block, only set info to 0 p->info = 0U; } else { // Discard block from chained list p_prev->next = p->next; } EvrRtxMemoryFree(mem, block, 1U); return 1U; }
/// Return an allocated memory block back to a Memory Pool. /// \param[in] mem pointer to memory pool. /// \param[in] block memory block to be returned to the memory pool. /// \return 1 - success, 0 - failure. __WEAK uint32_t osRtxMemoryFree (void *mem, void *block) { mem_block_t *p, *p_prev, *ptr; if ((mem == NULL) || (block == NULL)) { EvrRtxMemoryFree(mem, block, 0U); return 0U; } ptr = (mem_block_t *)((uint32_t)block - sizeof(mem_block_t)); // Search for header p_prev = NULL; p = (mem_block_t *)((uint32_t)mem + sizeof(mem_head_t)); while (p != ptr) { p_prev = p; p = p->next; if (p == NULL) { // Not found EvrRtxMemoryFree(mem, block, 0U); return 0U; } } ((mem_head_t *)mem)->used -= p->info & MB_INFO_LEN_MASK; if (p_prev == NULL) { // Release first block, only set info to 0 p->info = 0U; } else { // Discard block from chained list p_prev->next = p->next; } EvrRtxMemoryFree(mem, block, 1U); return 1U; }