1.1 --- a/Makefile Sun Mar 28 22:38:45 2021 +0200
1.2 +++ b/Makefile Sun Mar 28 22:41:12 2021 +0200
1.3 @@ -57,7 +57,7 @@
1.4 memory/memory_incremental.cc memory/memory_preallocated.cc \
1.5 opener_resource.cc opener_context_resource.cc \
1.6 page_mapper.cc \
1.7 - page_queue_partitioned.cc page_queue_shared.cc \
1.8 + page_queue.cc page_queue_partitioned.cc page_queue_shared.cc \
1.9 pager.cc paging.cc pages.cc \
1.10 region.cc resource_server.cc simple_pager.cc
1.11
2.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
2.2 +++ b/page_queue.cc Sun Mar 28 22:41:12 2021 +0200
2.3 @@ -0,0 +1,39 @@
2.4 +#include "page_queue.h"
2.5 +
2.6 +
2.7 +
2.8 +void PageQueue::discard(Queue &queue, Memory *memory)
2.9 +{
2.10 + while (!queue.empty())
2.11 + {
2.12 + Flexpage *flexpage = queue.front().flexpage;
2.13 +
2.14 + queue.pop_front();
2.15 + memory->release(flexpage->region);
2.16 + delete flexpage;
2.17 + }
2.18 +}
2.19 +
2.20 +bool PageQueue::remove(Queue &queue, Positions &positions, PageOwner *owner, Flexpage *flexpage)
2.21 +{
2.22 + Positions::iterator position = positions.find(flexpage);
2.23 +
2.24 + if (position == positions.end())
2.25 + return false;
2.26 +
2.27 + /* The found owner may be different from the requesting owner or even NULL
2.28 + if another owner has acquired and then purged its pages. Such a purged
2.29 + flexpage is not immediately usable, however. */
2.30 +
2.31 + Queue::iterator entry = position->second;
2.32 +
2.33 + if ((entry->owner == NULL) || (entry->owner != owner))
2.34 + return false;
2.35 +
2.36 + queue.erase(entry);
2.37 + positions.erase(position);
2.38 +
2.39 + return true;
2.40 +}
2.41 +
2.42 +// vim: tabstop=4 expandtab shiftwidth=4
3.1 --- a/page_queue.h Sun Mar 28 22:38:45 2021 +0200
3.2 +++ b/page_queue.h Sun Mar 28 22:41:12 2021 +0200
3.3 @@ -4,6 +4,7 @@
3.4 #include <map>
3.5
3.6 #include "flexpage.h"
3.7 +#include "memory.h"
3.8 #include "page_owner.h"
3.9
3.10
3.11 @@ -22,11 +23,21 @@
3.12
3.13 class PageQueue
3.14 {
3.15 +protected:
3.16 +
3.17 + /* Helper methods. */
3.18 +
3.19 + virtual void discard(Queue &queue, Memory *memory);
3.20 +
3.21 + virtual bool remove(Queue &queue, Positions &positions, PageOwner *owner, Flexpage *flexpage);
3.22 +
3.23 public:
3.24 virtual ~PageQueue()
3.25 {
3.26 }
3.27
3.28 + virtual void close(Memory *memory) = 0;
3.29 +
3.30 virtual void pop(PageOwner **owner, Flexpage **flexpage) = 0;
3.31
3.32 virtual void push(PageOwner *owner, Flexpage *flexpage) = 0;
4.1 --- a/page_queue_partitioned.cc Sun Mar 28 22:38:45 2021 +0200
4.2 +++ b/page_queue_partitioned.cc Sun Mar 28 22:41:12 2021 +0200
4.3 @@ -1,5 +1,15 @@
4.4 #include "page_queue_partitioned.h"
4.5
4.6 +
4.7 +
4.8 +/* Discard all queued flexpages. */
4.9 +
4.10 +void PageQueuePartitioned::close(Memory *memory)
4.11 +{
4.12 + discard(_available, memory);
4.13 + discard(_issued, memory);
4.14 +}
4.15 +
4.16 /* Keep waiting for a potential queue non-empty condition.
4.17 Then, attempt to pop an entry from the queue. */
4.18
4.19 @@ -96,8 +106,7 @@
4.20
4.21 bool PageQueuePartitioned::remove(PageOwner *owner, Flexpage *flexpage)
4.22 {
4.23 - (void) owner; (void) flexpage;
4.24 - return true;
4.25 + return PageQueue::remove(_issued, _positions, owner, flexpage);
4.26 }
4.27
4.28 // vim: tabstop=4 expandtab shiftwidth=4
5.1 --- a/page_queue_partitioned.h Sun Mar 28 22:38:45 2021 +0200
5.2 +++ b/page_queue_partitioned.h Sun Mar 28 22:41:12 2021 +0200
5.3 @@ -21,6 +21,8 @@
5.4 virtual bool _pop(QueueEntry *entry);
5.5
5.6 public:
5.7 + virtual void close(Memory *memory);
5.8 +
5.9 virtual void pop(PageOwner **owner, Flexpage **flexpage);
5.10
5.11 virtual void push(PageOwner *owner, Flexpage *flexpage);
6.1 --- a/page_queue_shared.cc Sun Mar 28 22:38:45 2021 +0200
6.2 +++ b/page_queue_shared.cc Sun Mar 28 22:41:12 2021 +0200
6.3 @@ -1,5 +1,14 @@
6.4 #include "page_queue_shared.h"
6.5
6.6 +
6.7 +
6.8 +/* Discard all queued flexpages. */
6.9 +
6.10 +void PageQueueShared::close(Memory *memory)
6.11 +{
6.12 + discard(_queue, memory);
6.13 +}
6.14 +
6.15 /* Keep waiting for a potential queue non-empty condition.
6.16 Then, attempt to pop an entry from the queue. */
6.17
6.18 @@ -76,26 +85,7 @@
6.19
6.20 bool PageQueueShared::remove(PageOwner *owner, Flexpage *flexpage)
6.21 {
6.22 - std::lock_guard<std::mutex> guard(_lock);
6.23 -
6.24 - Positions::iterator position = _positions.find(flexpage);
6.25 -
6.26 - if (position == _positions.end())
6.27 - return false;
6.28 -
6.29 - /* The found owner may be different from the requesting owner or even NULL
6.30 - if another owner has acquired and then purged its pages. Such a purged
6.31 - flexpage is not immediately usable, however. */
6.32 -
6.33 - Queue::iterator entry = position->second;
6.34 -
6.35 - if ((entry->owner == NULL) || (entry->owner != owner))
6.36 - return false;
6.37 -
6.38 - _queue.erase(entry);
6.39 - _positions.erase(position);
6.40 -
6.41 - return true;
6.42 + return PageQueue::remove(_queue, _positions, owner, flexpage);
6.43 }
6.44
6.45 // vim: tabstop=4 expandtab shiftwidth=4
7.1 --- a/page_queue_shared.h Sun Mar 28 22:38:45 2021 +0200
7.2 +++ b/page_queue_shared.h Sun Mar 28 22:41:12 2021 +0200
7.3 @@ -21,6 +21,8 @@
7.4 virtual bool _pop(QueueEntry *entry);
7.5
7.6 public:
7.7 + virtual void close(Memory *memory);
7.8 +
7.9 virtual void pop(PageOwner **owner, Flexpage **flexpage);
7.10
7.11 virtual void push(PageOwner *owner, Flexpage *flexpage);
8.1 --- a/pages.cc Sun Mar 28 22:38:45 2021 +0200
8.2 +++ b/pages.cc Sun Mar 28 22:41:12 2021 +0200
8.3 @@ -14,6 +14,11 @@
8.4 _memory = new MemoryIncremental();
8.5 }
8.6
8.7 +Pages::~Pages()
8.8 +{
8.9 + _queue->close(_memory);
8.10 +}
8.11 +
8.12 /* Remove the first flexpage in the queue. If its owner exists, remove it from
8.13 the owner (retiring the content). Return the flexpage for reuse. */
8.14
9.1 --- a/pages.h Sun Mar 28 22:38:45 2021 +0200
9.2 +++ b/pages.h Sun Mar 28 22:41:12 2021 +0200
9.3 @@ -20,9 +20,7 @@
9.4
9.5 explicit Pages(PageQueue *queue);
9.6
9.7 - virtual ~Pages()
9.8 - {
9.9 - }
9.10 + virtual ~Pages();
9.11
9.12 virtual Flexpage *remove();
9.13