This class tracks the bookkeeping of chip allocation while leaving the corresponding memory management to someone else. The implementation requires that chip allocation be single-threaded (presumably by some owner thread), but is thread-safe with respect to deallocation.
A given "chip" may be in one of three states:
Allocation is double-buffered in a sense: at the beginning of each allocation round, the owning thread unions the current set of zombie chips into the usable set; in-use chips are ignored.
The class has two members to support higher-level functionality:
_owner: an opaque pointer which is used to verify that blocks are being released properly It is set by the block_list but never inspected. It is used by derived classes.
_next: an embedded linked list node for use by the owner and otherwise ignored by the implementation
Definition at line 128 of file mem_block.h.
Public Member Functions
|NORET||block_bits (size_t chip_count)|
|Construct bitmaps for chip_count chips. Used by block_of_chips. |
|size_t||acquire_contiguous (size_t chip_count)|
|acquire chip_count contiguous chips by finding adjacent bits in _usable_chips |
|void||release_contiguous (size_t idx, size_t chip_count)|
|release chip_count contiguous chips by setting the adjacent bits in _zombie_chips |
|size_t||zombie_count () const|
|Return number of released-but-as-yet-unusable blocks. |
|size_t||usable_count () const|
|Return number of usable blocks. |
|Make the zombied (released but not yet reusable) chips available. |
|Make the block advertise that it has nothing to give. This is an optimization; used in block_list::block_list (q.v.). |