1 #pragma once 2 3 #include <condition_variable> 4 #include <list> 5 #include <map> 6 #include <mutex> 7 8 #include "flexpage.h" 9 #include "page_owner.h" 10 11 12 13 /* Collection types. */ 14 15 typedef struct { Flexpage *flexpage; PageOwner *owner; } QueueEntry; 16 typedef std::list<QueueEntry> Queue; 17 18 typedef std::pair<Flexpage *, Queue::iterator> Position; 19 typedef std::map<Flexpage *, Queue::iterator> Positions; 20 21 22 23 /* A queue of issued pages. */ 24 25 class PageQueue 26 { 27 protected: 28 Queue _queue; 29 Positions _positions; 30 31 std::mutex _lock; 32 std::condition_variable _counter; 33 34 bool _pop(QueueEntry *entry); 35 36 public: 37 void pop(PageOwner **owner, Flexpage **flexpage); 38 39 void push(PageOwner *owner, Flexpage *flexpage); 40 41 void push_front(PageOwner *owner, Flexpage *flexpage); 42 43 bool remove(PageOwner *owner, Flexpage *flexpage); 44 }; 45 46 // vim: tabstop=4 expandtab shiftwidth=4