1 #include "file_pager.h" 2 #include "paging.h" 3 4 5 6 Paging::Paging(Pages *pages) 7 : _pages(pages) 8 { 9 } 10 11 /* Return any registered page mapper for the given 'fileid' or NULL if no such 12 mapper is registered. */ 13 14 PageMapper *Paging::get(fileid_t fileid) 15 { 16 FileMapping::iterator entry = _mappers.find(fileid); 17 PageMapper *mapper; 18 19 if (entry == _mappers.end()) 20 mapper = NULL; 21 else 22 mapper = entry->second; 23 24 return mapper; 25 } 26 27 /* Register a page 'mapper' for the given 'fileid'. */ 28 29 void Paging::set(fileid_t fileid, PageMapper *mapper) 30 { 31 FileMapping::iterator entry = _mappers.find(fileid); 32 33 if (entry == _mappers.end()) 34 _mappers[fileid] = mapper; 35 } 36 37 /* Obtain a page mapper for the 'fileid' or register a new one in the 38 paging object. */ 39 40 PageMapper *Paging::get_mapper(fileid_t fileid) 41 { 42 /* Obtain any registered page mapper. */ 43 44 PageMapper *mapper = get(fileid); 45 46 if (mapper != NULL) 47 return mapper; 48 49 /* Make an accessor and page mapper, registering the mapper. */ 50 51 Accessor *accessor = make_accessor(fileid); 52 mapper = new PageMapper(accessor, _pages); 53 54 set(fileid, mapper); 55 56 return mapper; 57 } 58 59 60 61 /* Return a pager initialised with a page mapper. */ 62 63 Pager *Paging::get_pager(fileid_t fileid, flags_t flags) 64 { 65 std::lock_guard<std::mutex> guard(_lock); 66 67 /* Initialise the pager with the mapper and a reference to this object for 68 closing the mapper and accessor. */ 69 70 PageMapper *mapper = get_mapper(fileid); 71 return new FilePager(fileid, mapper, flags, this); 72 } 73 74 /* Detach a pager, potentially removing its resources. */ 75 76 void Paging::detach_pager(fileid_t fileid, PageMapper *mapper) 77 { 78 std::lock_guard<std::mutex> guard(_lock); 79 80 if (!mapper->detach()) 81 { 82 _mappers.erase(fileid); 83 delete mapper->accessor(); 84 delete mapper; 85 } 86 } 87 88 // vim: tabstop=4 expandtab shiftwidth=4