Fix pool buffer size, update free() description, add assertion in MemoryPool.h header file.

Provide fix for pool buffer size: pool block size must be
a multiple of 4 bytes.
Add assertion to forbid creation of MemoryPool object with queue size equal to 0.
Update description of free() function. Add information about
statuses returned by this function.
pull/4941/head
Przemyslaw Stekiel 2017-08-21 09:40:49 +01:00 committed by Przemyslaw Stekiel
parent c72d60a9e6
commit 5abbccb45c
1 changed files with 7 additions and 2 deletions

View File

@ -44,6 +44,7 @@ namespace rtos {
*/ */
template<typename T, uint32_t pool_sz> template<typename T, uint32_t pool_sz>
class MemoryPool : private mbed::NonCopyable<MemoryPool<T, pool_sz> > { class MemoryPool : private mbed::NonCopyable<MemoryPool<T, pool_sz> > {
MBED_STATIC_ASSERT(pool_sz > 0, "Invalid memory pool size. Must be greater than 0.");
public: public:
/** Create and Initialize a memory pool. */ /** Create and Initialize a memory pool. */
MemoryPool() { MemoryPool() {
@ -83,7 +84,10 @@ public:
/** Free a memory block. /** Free a memory block.
@param block address of the allocated memory block to be freed. @param block address of the allocated memory block to be freed.
@return status code that indicates the execution status of the function. @return osOK on successful deallocation, osErrorParameter if given memory block id
is NULL or invalid, or osErrorResource if given memory block is in an
invalid memory pool state.
*/ */
osStatus free(T *block) { osStatus free(T *block) {
return osMemoryPoolFree(_id, (void*)block); return osMemoryPoolFree(_id, (void*)block);
@ -92,7 +96,8 @@ public:
private: private:
osMemoryPoolId_t _id; osMemoryPoolId_t _id;
osMemoryPoolAttr_t _attr; osMemoryPoolAttr_t _attr;
char _pool_mem[sizeof(T) * pool_sz]; /* osMemoryPoolNew requires that pool block size is a multiple of 4 bytes. */
char _pool_mem[((sizeof(T) + 3) & ~3) * pool_sz];
mbed_rtos_storage_mem_pool_t _obj_mem; mbed_rtos_storage_mem_pool_t _obj_mem;
}; };