paul@72 | 1 | #include "memory_incremental.h" |
paul@70 | 2 | #include "pages.h" |
paul@70 | 3 | |
paul@72 | 4 | |
paul@72 | 5 | |
paul@72 | 6 | Pages::Pages(Memory *memory, PageQueue *queue) |
paul@72 | 7 | : _memory(memory), _queue(queue) |
paul@70 | 8 | { |
paul@70 | 9 | } |
paul@70 | 10 | |
paul@72 | 11 | Pages::Pages(PageQueue *queue) |
paul@72 | 12 | : _queue(queue) |
paul@70 | 13 | { |
paul@72 | 14 | _memory = new MemoryIncremental(); |
paul@70 | 15 | } |
paul@70 | 16 | |
paul@74 | 17 | Pages::~Pages() |
paul@74 | 18 | { |
paul@74 | 19 | _queue->close(_memory); |
paul@74 | 20 | } |
paul@74 | 21 | |
paul@70 | 22 | /* Remove the first flexpage in the queue. If its owner exists, remove it from |
paul@70 | 23 | the owner (retiring the content). Return the flexpage for reuse. */ |
paul@70 | 24 | |
paul@72 | 25 | Flexpage *Pages::remove() |
paul@70 | 26 | { |
paul@70 | 27 | PageOwner *owner; |
paul@70 | 28 | Flexpage *flexpage; |
paul@70 | 29 | |
paul@70 | 30 | _queue->pop(&owner, &flexpage); |
paul@70 | 31 | |
paul@70 | 32 | if (owner != NULL) |
paul@70 | 33 | owner->remove(flexpage); |
paul@70 | 34 | |
paul@70 | 35 | return flexpage; |
paul@70 | 36 | } |
paul@70 | 37 | |
paul@70 | 38 | /* Reserve 'flexpage' by removing it from this collection. */ |
paul@70 | 39 | |
paul@72 | 40 | bool Pages::reserve(PageOwner *owner, Flexpage *flexpage) |
paul@70 | 41 | { |
paul@70 | 42 | return _queue->remove(owner, flexpage); |
paul@70 | 43 | } |
paul@70 | 44 | |
paul@70 | 45 | /* Obtain a new flexpage. Return the flexpage or None if no new flexpage could |
paul@70 | 46 | be created. */ |
paul@70 | 47 | |
paul@72 | 48 | Flexpage *Pages::flexpage() |
paul@70 | 49 | { |
paul@70 | 50 | Region *region = _memory->region(); |
paul@70 | 51 | |
paul@70 | 52 | if (region != NULL) |
paul@70 | 53 | return new Flexpage(region); |
paul@70 | 54 | else |
paul@70 | 55 | return NULL; |
paul@70 | 56 | } |
paul@70 | 57 | |
paul@70 | 58 | /* Queue an entry associating the given 'owner' and 'flexpage'. */ |
paul@70 | 59 | |
paul@72 | 60 | void Pages::queue(PageOwner *owner, Flexpage *flexpage) |
paul@70 | 61 | { |
paul@70 | 62 | _queue->push(owner, flexpage); |
paul@70 | 63 | } |
paul@70 | 64 | |
paul@70 | 65 | /* Push an entry for 'flexpage' without owner association for immediate |
paul@70 | 66 | reuse. */ |
paul@70 | 67 | |
paul@72 | 68 | void Pages::release(Flexpage *flexpage) |
paul@70 | 69 | { |
paul@70 | 70 | _queue->push_front(NULL, flexpage); |
paul@70 | 71 | } |
paul@70 | 72 | |
paul@70 | 73 | // vim: tabstop=4 expandtab shiftwidth=4 |