1.1 --- a/paging.cc Wed Mar 31 01:06:22 2021 +0200
1.2 +++ b/paging.cc Wed Mar 31 23:54:51 2021 +0200
1.3 @@ -1,11 +1,15 @@
1.4 +#include "file_pager.h"
1.5 #include "paging.h"
1.6
1.7 -bool Paging::reserve(fileid_t fileid)
1.8 +
1.9 +
1.10 +Paging::Paging(Pages *pages)
1.11 +: _pages(pages)
1.12 {
1.13 - _lock.lock();
1.14 +}
1.15
1.16 - return _mappers.find(fileid) != _mappers.end();
1.17 -}
1.18 +/* Return any registered page mapper for the given 'fileid' or NULL if no such
1.19 + mapper is registered. */
1.20
1.21 PageMapper *Paging::get(fileid_t fileid)
1.22 {
1.23 @@ -17,18 +21,68 @@
1.24 else
1.25 mapper = entry->second;
1.26
1.27 - _lock.unlock();
1.28 return mapper;
1.29 }
1.30
1.31 +/* Register a page 'mapper' for the given 'fileid'. */
1.32 +
1.33 void Paging::set(fileid_t fileid, PageMapper *mapper)
1.34 {
1.35 FileMapping::iterator entry = _mappers.find(fileid);
1.36
1.37 if (entry == _mappers.end())
1.38 _mappers[fileid] = mapper;
1.39 +}
1.40
1.41 - _lock.unlock();
1.42 +/* Obtain a page mapper for the 'fileid' or register a new one in the
1.43 + paging object. */
1.44 +
1.45 +PageMapper *Paging::get_mapper(fileid_t fileid)
1.46 +{
1.47 + /* Obtain any registered page mapper. */
1.48 +
1.49 + PageMapper *mapper = get(fileid);
1.50 +
1.51 + if (mapper != NULL)
1.52 + return mapper;
1.53 +
1.54 + /* Make an accessor and page mapper, registering the mapper. */
1.55 +
1.56 + Accessor *accessor = make_accessor(fileid);
1.57 + mapper = new PageMapper(accessor, _pages);
1.58 +
1.59 + set(fileid, mapper);
1.60 +
1.61 + return mapper;
1.62 +}
1.63 +
1.64 +
1.65 +
1.66 +/* Return a pager initialised with a page mapper. */
1.67 +
1.68 +Pager *Paging::get_pager(fileid_t fileid, flags_t flags)
1.69 +{
1.70 + std::lock_guard<std::mutex> guard(_lock);
1.71 +
1.72 + /* Initialise the pager with the mapper and a reference to this object for
1.73 + closing the mapper and accessor. */
1.74 +
1.75 + PageMapper *mapper = get_mapper(fileid);
1.76 + return new FilePager(fileid, mapper, flags, this);
1.77 +}
1.78 +
1.79 +/* Detach a pager, potentially removing its resources. */
1.80 +
1.81 +void Paging::detach_pager(fileid_t fileid, PageMapper *mapper)
1.82 +{
1.83 + std::lock_guard<std::mutex> guard(_lock);
1.84 +
1.85 + if (!mapper->detach())
1.86 + {
1.87 + _mappers.erase(fileid);
1.88 + delete mapper->accessor();
1.89 + delete mapper;
1.90 + }
1.91 }
1.92
1.93 // vim: tabstop=4 expandtab shiftwidth=4