paul@74 | 1 | #include "page_queue.h" |
paul@74 | 2 | |
paul@74 | 3 | |
paul@74 | 4 | |
paul@74 | 5 | void PageQueue::discard(Queue &queue, Memory *memory) |
paul@74 | 6 | { |
paul@74 | 7 | while (!queue.empty()) |
paul@74 | 8 | { |
paul@74 | 9 | Flexpage *flexpage = queue.front().flexpage; |
paul@74 | 10 | |
paul@74 | 11 | queue.pop_front(); |
paul@74 | 12 | memory->release(flexpage->region); |
paul@74 | 13 | delete flexpage; |
paul@74 | 14 | } |
paul@74 | 15 | } |
paul@74 | 16 | |
paul@74 | 17 | bool PageQueue::remove(Queue &queue, Positions &positions, PageOwner *owner, Flexpage *flexpage) |
paul@74 | 18 | { |
paul@74 | 19 | Positions::iterator position = positions.find(flexpage); |
paul@74 | 20 | |
paul@74 | 21 | if (position == positions.end()) |
paul@74 | 22 | return false; |
paul@74 | 23 | |
paul@74 | 24 | /* The found owner may be different from the requesting owner or even NULL |
paul@74 | 25 | if another owner has acquired and then purged its pages. Such a purged |
paul@74 | 26 | flexpage is not immediately usable, however. */ |
paul@74 | 27 | |
paul@74 | 28 | Queue::iterator entry = position->second; |
paul@74 | 29 | |
paul@74 | 30 | if ((entry->owner == NULL) || (entry->owner != owner)) |
paul@74 | 31 | return false; |
paul@74 | 32 | |
paul@74 | 33 | queue.erase(entry); |
paul@74 | 34 | positions.erase(position); |
paul@74 | 35 | |
paul@74 | 36 | return true; |
paul@74 | 37 | } |
paul@74 | 38 | |
paul@74 | 39 | // vim: tabstop=4 expandtab shiftwidth=4 |