- Introduction
- ------------
- _`.intro`: This is the design of the ABQ module, which implements a
- fixed-length queue of small objects.
- _`.readership`: This document is intended for any MM developer.
- _`.name`: The name ABQ originally stood for "Available Block Queue" as
- the module is used by the MVT pool.
- Requirements
- ------------
- _`.req.push`: Clients can efficiently push new elements onto the queue.
- _`.req.pop`: Clients can efficiently pop elements from the queue.
- _`.req.empty`: Clients can efficiently test whether the queue is empty.
- _`.req.abstract`: The ABQ module does not know anything about the
- elements in the queue other than their size.
- _`.req.delete`: Clients can delete elements from the queue. (Note: not necessarily efficiently.)
- _`.req.iterate`: Clients can iterate over elements in the queue.
- Interface
- ---------
- ``typedef ABQStruct *ABQ``
- ``ABQ`` is the type of a queue. It is an alias for ``ABQStruct *``.
- ``ABQStruct`` is defined in the header so that it can be inlined in
- client structures: clients must not depend on its implementation
- details.
- ``void ABQInit(Arena arena, ABQ abq, void *owner, Count elements, Size elementSize)``
- Initialize the queue ``abq``. The parameter ``arena`` is the arena
- whose control pool should be used to allocate the memory for the
- queue; ``owner`` is passed to ``MeterInit()`` for the statistics;
- ``elements`` is the maximum number of elements that can be stored in
- the queue; and ``elementSize`` is the size of each element.
- ``void ABQFinish(Arena arena, ABQ abq)``
- Finish ``abq`` and free all resources associated with it.
- ``Bool ABQPush(ABQ abq, void *element)``
- If the queue is full, leave it unchanged and return ``FALSE``.
- Otherwise, push ``element`` on to the queue and return ``TRUE``.
- ``Bool ABQPop(ABQ abq, void *elementReturn)``
- If the queue is empty, return ``FALSE``. Otherwise, copy the first
- element on the queue into the memory pointed to by ``elementReturn``,
- remove the element from the queue, and return ``TRUE``.
- ``Bool ABQPeek(ABQ abq, void *elementReturn)``
- If the queue is empty, return ``FALSE``. Otherwise, copy the first
- element on the queue into the memory pointed to by ``elementReturn``
- and return ``TRUE``. (This is the same as ``ABQPop()`` except that
- the queue is unchanged.)
- ``Bool ABQIsEmpty(ABQ abq)``
- If the queue is empty, return ``TRUE``, otherwise return ``FALSE``.
- ``Bool ABQIsFull(ABQ abq)``
- If the queue is full, return ``TRUE``, otherwise return ``FALSE``.
- ``Count ABQDepth(ABQ abq)``
- Return the number of elements in the queue.
- ``typedef Bool (*ABQVisitor)(Bool *deleteReturn, void *element, void *closure)``
- A callback function for ``ABQIterate()``. The parameter ``element`` is
- an element in the queue, and ``closure`` is the value originally
- passed to ``ABQIterate()``. This function must set ``*deleteReturn``
- to ``FALSE`` if ``element`` must be kept in the queue, or ``TRUE`` if
- ``element`` must be deleted from the queue. It must return ``TRUE``
- if the iteration must continue, or ``FALSE`` if the iteration must
- stop after processing ``element``.
- ``void ABQIterate(ABQ abq, ABQVisitor visitor, void *closure)``
- Call ``visitor`` for each element in the queue, passing the element
- and ``closure``. See ``ABQVisitor`` for details.
Raw Paste