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