1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
1.2 +++ b/pages/pages.cc Sun Mar 28 23:16:12 2021 +0200
1.3 @@ -0,0 +1,73 @@
1.4 +#include "memory_incremental.h"
1.5 +#include "pages.h"
1.6 +
1.7 +
1.8 +
1.9 +Pages::Pages(Memory *memory, PageQueue *queue)
1.10 +: _memory(memory), _queue(queue)
1.11 +{
1.12 +}
1.13 +
1.14 +Pages::Pages(PageQueue *queue)
1.15 +: _queue(queue)
1.16 +{
1.17 + _memory = new MemoryIncremental();
1.18 +}
1.19 +
1.20 +Pages::~Pages()
1.21 +{
1.22 + _queue->close(_memory);
1.23 +}
1.24 +
1.25 +/* Remove the first flexpage in the queue. If its owner exists, remove it from
1.26 + the owner (retiring the content). Return the flexpage for reuse. */
1.27 +
1.28 +Flexpage *Pages::remove()
1.29 +{
1.30 + PageOwner *owner;
1.31 + Flexpage *flexpage;
1.32 +
1.33 + _queue->pop(&owner, &flexpage);
1.34 +
1.35 + if (owner != NULL)
1.36 + owner->remove(flexpage);
1.37 +
1.38 + return flexpage;
1.39 +}
1.40 +
1.41 +/* Reserve 'flexpage' by removing it from this collection. */
1.42 +
1.43 +bool Pages::reserve(PageOwner *owner, Flexpage *flexpage)
1.44 +{
1.45 + return _queue->remove(owner, flexpage);
1.46 +}
1.47 +
1.48 +/* Obtain a new flexpage. Return the flexpage or None if no new flexpage could
1.49 + be created. */
1.50 +
1.51 +Flexpage *Pages::flexpage()
1.52 +{
1.53 + Region *region = _memory->region();
1.54 +
1.55 + if (region != NULL)
1.56 + return new Flexpage(region);
1.57 + else
1.58 + return NULL;
1.59 +}
1.60 +
1.61 +/* Queue an entry associating the given 'owner' and 'flexpage'. */
1.62 +
1.63 +void Pages::queue(PageOwner *owner, Flexpage *flexpage)
1.64 +{
1.65 + _queue->push(owner, flexpage);
1.66 +}
1.67 +
1.68 +/* Push an entry for 'flexpage' without owner association for immediate
1.69 + reuse. */
1.70 +
1.71 +void Pages::release(Flexpage *flexpage)
1.72 +{
1.73 + _queue->push_front(NULL, flexpage);
1.74 +}
1.75 +
1.76 +// vim: tabstop=4 expandtab shiftwidth=4