1.1 --- a/pages.cc Sat Mar 27 01:42:25 2021 +0100
1.2 +++ b/pages.cc Sat Mar 27 22:12:12 2021 +0100
1.3 @@ -1,15 +1,68 @@
1.4 +#include "memory_incremental.h"
1.5 #include "pages.h"
1.6
1.7 -Pages::Pages(Memory *memory)
1.8 -: PageCollection(memory)
1.9 +
1.10 +
1.11 +Pages::Pages(Memory *memory, PageQueue *queue)
1.12 +: _memory(memory), _queue(queue)
1.13 +{
1.14 +}
1.15 +
1.16 +Pages::Pages(PageQueue *queue)
1.17 +: _queue(queue)
1.18 {
1.19 - _queue = &_page_queue;
1.20 + _memory = new MemoryIncremental();
1.21 +}
1.22 +
1.23 +/* Remove the first flexpage in the queue. If its owner exists, remove it from
1.24 + the owner (retiring the content). Return the flexpage for reuse. */
1.25 +
1.26 +Flexpage *Pages::remove()
1.27 +{
1.28 + PageOwner *owner;
1.29 + Flexpage *flexpage;
1.30 +
1.31 + _queue->pop(&owner, &flexpage);
1.32 +
1.33 + if (owner != NULL)
1.34 + owner->remove(flexpage);
1.35 +
1.36 + return flexpage;
1.37 }
1.38
1.39 -Pages::Pages()
1.40 -: PageCollection()
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 - _queue = &_page_queue;
1.54 + Region *region = _memory->region();
1.55 +
1.56 + if (region != NULL)
1.57 + return new Flexpage(region);
1.58 + else
1.59 + return NULL;
1.60 +}
1.61 +
1.62 +/* Queue an entry associating the given 'owner' and 'flexpage'. */
1.63 +
1.64 +void Pages::queue(PageOwner *owner, Flexpage *flexpage)
1.65 +{
1.66 + _queue->push(owner, flexpage);
1.67 +}
1.68 +
1.69 +/* Push an entry for 'flexpage' without owner association for immediate
1.70 + reuse. */
1.71 +
1.72 +void Pages::release(Flexpage *flexpage)
1.73 +{
1.74 + _queue->push_front(NULL, flexpage);
1.75 }
1.76
1.77 // vim: tabstop=4 expandtab shiftwidth=4