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