An instance of type allocator_t is responsible for the maintenance of a linked list of instances of equal size m_allocator objects:
---- ---- ---- ---- ---- ----
...-->|id=1|data|next|-->|id=0|data|next|-->null()
---- ---- ---- ---- ---- ----
the last block's next
pointer being non associated.
User code can request access to a memory block by using the type bound procedure get_block. If the list is not empty, a pointer to the first block on the list is returned and the block is detached from the list. If the list is empty (i.e. all initially allocated blocks are currently referenced to) then a new block is allocated before a pointer to it is returned.
In order to reuse memory it is important that user code release blocks when they are not needed anymore. This is done by calling the type bound procedure release_block. The released block is then pushed in front of the block list.
Type | Visibility | Attributes | Name | Initial | |||
---|---|---|---|---|---|---|---|
integer, | public | :: | ngrid | ||||
integer, | public | :: | next_id | = | 0 |
The id for the next allocated block. This counter is incremented each time a new block is allocated. |
|
class(mesh_t), | public, | pointer | :: | mesh |
The pointer to the first block on the list. Non associated if the list is empty |
||
class(field_t), | public, | pointer | :: | first | => | null() |
Type | Intent | Optional | Attributes | Name | ||
---|---|---|---|---|---|---|
type(mesh_t), | intent(inout), | target | :: | mesh | ||
integer, | intent(in) | :: | sz |
Return a pointer to the first available memory block, i.e. the current head of the block list. If the list is empty, allocate a new block with create_block first.
Type | Intent | Optional | Attributes | Name | ||
---|---|---|---|---|---|---|
class(allocator_t), | intent(inout) | :: | self | |||
integer, | intent(in) | :: | dir | |||
integer, | intent(in), | optional | :: | data_loc |
Release memory block pointed to by HANDLE to the block list. It is pushed to the front of the block list, in other words it is made the head block.
Type | Intent | Optional | Attributes | Name | ||
---|---|---|---|---|---|---|
class(allocator_t), | intent(inout) | :: | self | |||
class(field_t), | pointer | :: | handle |
Allocate memory for a new block and return a pointer to a new m_allocator object.
Type | Intent | Optional | Attributes | Name | ||
---|---|---|---|---|---|---|
class(allocator_t), | intent(inout) | :: | self | |||
type(field_t), | intent(in), | pointer | :: | next |
Utility function that returns a array made of the id
of the
block currently in the block list. Return the array [0] if
block list is empty.
Type | Intent | Optional | Attributes | Name | ||
---|---|---|---|---|---|---|
class(allocator_t), | intent(inout) | :: | self |
Go through the block list from head to tail, deallocating each memory block in turn. Deallocation of a m_allocator object automatically deallocates its internal allocatable data array.
Type | Intent | Optional | Attributes | Name | ||
---|---|---|---|---|---|---|
class(allocator_t), | intent(inout) | :: | self |
Type | Intent | Optional | Attributes | Name | ||
---|---|---|---|---|---|---|
class(allocator_t), | intent(inout) | :: | self | |||
integer, | intent(in) | :: | sz |