1 #pragma once 2 3 #include "access_map.h" 4 #include "accessor.h" 5 #include "page_owner.h" 6 7 #include <mutex> 8 9 /* A file mapper, associating flexpages with file regions. */ 10 11 class PageMapper : public PageOwner 12 { 13 protected: 14 AccessMap _map; 15 Accessor *_accessor; 16 Pages *_pages; 17 unsigned int _attached; 18 19 /* Serialisation of accesses. */ 20 21 std::mutex _lock; 22 23 /* Internal flexpage retrieval methods. */ 24 25 Flexpage *find(offset_t offset); 26 27 Flexpage *flexpage(offset_t offset); 28 29 public: 30 explicit PageMapper(Accessor *accessor, Pages *pages); 31 32 /* Accounting methods. */ 33 34 void attach(); 35 36 unsigned int detach(); 37 38 /* Interface for the pager. */ 39 40 Accessor *accessor() 41 { return _accessor; } 42 43 Flexpage *get(offset_t offset, flags_t flags); 44 45 void queue(Flexpage *flexpage); 46 47 void flush_all(offset_t start, offset_t size); 48 49 offset_t get_data_size(); 50 51 void set_data_size(offset_t size); 52 53 /* Data transfer methods, implementing PageOwner. */ 54 55 void fill(Flexpage *flexpage); 56 57 void flush(Flexpage *flexpage, bool purge); 58 59 /* Interface for the page collection, implementing PageOwner. */ 60 61 void remove(Flexpage *flexpage); 62 }; 63 64 // vim: tabstop=4 expandtab shiftwidth=4