Better document MemoryPool behaviour

Make explicit that `MemoryPool` is a raw allocator, and users need to
take care of object construction and destruction.
pull/14537/head
Kevin Bracey 2021-04-13 13:12:39 +03:00
parent 35b8e558e9
commit 537bee9f4c
1 changed files with 26 additions and 0 deletions

View File

@ -97,6 +97,19 @@ public:
} }
/** Allocate a memory block from a memory pool, without blocking. /** Allocate a memory block from a memory pool, without blocking.
This method works like `std::malloc` or `std::allocator<T>::allocate` in that the
returned memory block is not initialized. For types with a non-trivial constructor
placement new must be used to construct an object in the returned storage.
Example:
@code
MyObject *obj = pool.alloc();
if (obj) {
new (obj) MyObject(1, 2);
}
@endcode
@return address of the allocated memory block or nullptr in case of no memory available. @return address of the allocated memory block or nullptr in case of no memory available.
@note You may call this function from ISR context. @note You may call this function from ISR context.
@ -120,6 +133,7 @@ public:
} }
/** Allocate a memory block from a memory pool, optionally blocking. /** Allocate a memory block from a memory pool, optionally blocking.
@see MemoryPool::try_alloc
@param rel_time timeout value (Kernel::wait_for_u32_forever to wait forever) @param rel_time timeout value (Kernel::wait_for_u32_forever to wait forever)
@return address of the allocated memory block or nullptr in case of no memory available. @return address of the allocated memory block or nullptr in case of no memory available.
@ -149,6 +163,7 @@ public:
} }
/** Allocate a memory block from a memory pool, blocking. /** Allocate a memory block from a memory pool, blocking.
@see MemoryPool::try_alloc
@param abs_time absolute timeout time, referenced to Kernel::Clock. @param abs_time absolute timeout time, referenced to Kernel::Clock.
@return address of the allocated memory block or nullptr in case of no memory available. @return address of the allocated memory block or nullptr in case of no memory available.
@ -264,6 +279,17 @@ public:
} }
/** Free a memory block. /** Free a memory block.
This method works like `std::free` or `std::allocator<T>::deallocate` in that any
object in the memory is not destroyed. For types with a non-trivial destructor
that destructor must be called manually before freeing the memory.
Example:
@code
obj->~MyObject();
pool.free(obj);
@endcode
@param block address of the allocated memory block to be freed. @param block address of the allocated memory block to be freed.
@return osOK on successful deallocation, osErrorParameter if given memory block id @return osOK on successful deallocation, osErrorParameter if given memory block id
is nullptr or invalid, or osErrorResource if given memory block is in an is nullptr or invalid, or osErrorResource if given memory block is in an