1.1 --- a/accessor.h Wed Mar 31 01:06:22 2021 +0200
1.2 +++ b/accessor.h Wed Mar 31 23:54:51 2021 +0200
1.3 @@ -20,6 +20,10 @@
1.4
1.5 explicit Accessor(fileid_t fileid, offset_t size=0);
1.6
1.7 + virtual ~Accessor()
1.8 + {
1.9 + }
1.10 +
1.11 virtual offset_t get_size();
1.12
1.13 virtual void set_size(offset_t size);
2.1 --- a/dstest_block_server.cc Wed Mar 31 01:06:22 2021 +0200
2.2 +++ b/dstest_block_server.cc Wed Mar 31 23:54:51 2021 +0200
2.3 @@ -30,7 +30,6 @@
2.4 #include "memory_utils.h"
2.5 #include "page_queue_shared.h"
2.6 #include "pages.h"
2.7 -#include "paging.h"
2.8 #include "resource_server.h"
2.9 #include "block_file_opener.h"
2.10
2.11 @@ -43,10 +42,9 @@
2.12 /* Some memory plus infrastructure. */
2.13
2.14 MemoryIncremental mem(MEMORY_PAGES);
2.15 - Paging paging;
2.16 PageQueueShared queue;
2.17 Pages pages(&mem, &queue);
2.18 - BlockFileOpener opener(&paging, &pages);
2.19 + BlockFileOpener opener(&pages);
2.20
2.21 /* Register a server associating it with the given object. */
2.22
3.1 --- a/dstest_host_server.cc Wed Mar 31 01:06:22 2021 +0200
3.2 +++ b/dstest_host_server.cc Wed Mar 31 23:54:51 2021 +0200
3.3 @@ -30,7 +30,6 @@
3.4 #include "memory_utils.h"
3.5 #include "page_queue_shared.h"
3.6 #include "pages.h"
3.7 -#include "paging.h"
3.8 #include "resource_server.h"
3.9 #include "host_file_opener.h"
3.10
3.11 @@ -43,10 +42,9 @@
3.12 /* Some memory plus infrastructure. */
3.13
3.14 MemoryIncremental mem(MEMORY_PAGES);
3.15 - Paging paging;
3.16 PageQueueShared queue;
3.17 Pages pages(&mem, &queue);
3.18 - HostFileOpener opener(&paging, &pages);
3.19 + HostFileOpener opener(&pages);
3.20
3.21 /* Register a server associating it with the given object. */
3.22
4.1 --- a/dstest_test_server.cc Wed Mar 31 01:06:22 2021 +0200
4.2 +++ b/dstest_test_server.cc Wed Mar 31 23:54:51 2021 +0200
4.3 @@ -32,7 +32,6 @@
4.4 #include "memory_utils.h"
4.5 #include "page_queue_shared.h"
4.6 #include "pages.h"
4.7 -#include "paging.h"
4.8 #include "resource_server.h"
4.9 #include "test_file_opener.h"
4.10
4.11 @@ -66,10 +65,9 @@
4.12 /* Some memory plus infrastructure. */
4.13
4.14 MemoryIncremental mem(memory_pages, page(REGION_PAGES));
4.15 - Paging paging;
4.16 PageQueueShared queue;
4.17 Pages pages(&mem, &queue);
4.18 - TestFileOpener opener(&paging, &pages, page(FILE_PAGES));
4.19 + TestFileOpener opener(&pages, page(FILE_PAGES));
4.20
4.21 /* Register a server associating it with the given object. */
4.22
5.1 --- a/files/block_file_opener.h Wed Mar 31 01:06:22 2021 +0200
5.2 +++ b/files/block_file_opener.h Wed Mar 31 23:54:51 2021 +0200
5.3 @@ -14,8 +14,8 @@
5.4 virtual Accessor *make_accessor(fileid_t fileid);
5.5
5.6 public:
5.7 - explicit BlockFileOpener(Paging *paging, Pages *pages)
5.8 - : HostFileOpener(paging, pages)
5.9 + explicit BlockFileOpener(Pages *pages)
5.10 + : HostFileOpener(pages)
5.11 {
5.12 }
5.13 };
6.1 --- a/files/file_pager.cc Wed Mar 31 01:06:22 2021 +0200
6.2 +++ b/files/file_pager.cc Wed Mar 31 23:54:51 2021 +0200
6.3 @@ -4,8 +4,9 @@
6.4 /* Initialise a pager for a file with a unique file identifier and shared page
6.5 mapper for moderating access to loaded pages. */
6.6
6.7 -FilePager::FilePager(fileid_t fileid, PageMapper *mapper, flags_t flags)
6.8 -: Pager(mapper, flags), fileid(fileid)
6.9 +FilePager::FilePager(fileid_t fileid, PageMapper *mapper, flags_t flags,
6.10 + Paging *paging)
6.11 +: Pager(mapper, flags), _paging(paging), fileid(fileid)
6.12 {
6.13 }
6.14
6.15 @@ -21,6 +22,16 @@
6.16
6.17
6.18
6.19 +/* Close the pager, removing the mapper from the paging registry if
6.20 + appropriate. */
6.21 +
6.22 +void FilePager::close()
6.23 +{
6.24 + _paging->detach_pager(fileid, _mapper);
6.25 +}
6.26 +
6.27 +
6.28 +
6.29 /* File-specific operations. */
6.30
6.31 long FilePager::flush(offset_t populated_size, offset_t *size)
7.1 --- a/files/file_pager.h Wed Mar 31 01:06:22 2021 +0200
7.2 +++ b/files/file_pager.h Wed Mar 31 23:54:51 2021 +0200
7.3 @@ -2,15 +2,22 @@
7.4
7.5 #include "mapped_file_object_interface.h"
7.6 #include "pager.h"
7.7 +#include "paging.h"
7.8
7.9 /* A pager abstraction for a file. */
7.10
7.11 class FilePager : public Pager, public MappedFileObject
7.12 {
7.13 +protected:
7.14 + Paging *_paging;
7.15 +
7.16 public:
7.17 fileid_t fileid;
7.18
7.19 - explicit FilePager(fileid_t fileid, PageMapper *mapper, flags_t flags);
7.20 + explicit FilePager(fileid_t fileid, PageMapper *mapper, flags_t flags,
7.21 + Paging *paging);
7.22 +
7.23 + virtual void close();
7.24
7.25 /* Server details. */
7.26
8.1 --- a/files/host_file_opener.h Wed Mar 31 01:06:22 2021 +0200
8.2 +++ b/files/host_file_opener.h Wed Mar 31 23:54:51 2021 +0200
8.3 @@ -27,8 +27,8 @@
8.4 virtual Accessor *make_accessor(fileid_t fileid);
8.5
8.6 public:
8.7 - explicit HostFileOpener(Paging *paging, Pages *pages)
8.8 - : OpenerResource(paging, pages)
8.9 + explicit HostFileOpener(Pages *pages)
8.10 + : OpenerResource(pages)
8.11 {
8.12 }
8.13 };
9.1 --- a/files/opener_context_resource.cc Wed Mar 31 01:06:22 2021 +0200
9.2 +++ b/files/opener_context_resource.cc Wed Mar 31 23:54:51 2021 +0200
9.3 @@ -52,7 +52,7 @@
9.4 if (path == NULL)
9.5 return -L4_EINVAL;
9.6
9.7 - FilePager *pager = _opener->open(path, flags);
9.8 + Pager *pager = _opener->open(path, flags);
9.9
9.10 /* Complete the initialisation and start a server in a new thread.
9.11 If the thread does not start, the resource should be finalised. */
10.1 --- a/files/opener_resource.cc Wed Mar 31 01:06:22 2021 +0200
10.2 +++ b/files/opener_resource.cc Wed Mar 31 23:54:51 2021 +0200
10.3 @@ -4,8 +4,8 @@
10.4
10.5 /* Support for providing access to files. */
10.6
10.7 -OpenerResource::OpenerResource(Paging *paging, Pages *pages)
10.8 -: _paging(paging), _pages(pages)
10.9 +OpenerResource::OpenerResource(Pages *pages)
10.10 +: Paging(pages)
10.11 {
10.12 }
10.13
10.14 @@ -23,34 +23,14 @@
10.15
10.16 /* Return a pager object for the given path and flags. */
10.17
10.18 -FilePager *OpenerResource::open(const char *path, flags_t flags)
10.19 +Pager *OpenerResource::open(const char *path, flags_t flags)
10.20 {
10.21 fileid_t fileid = get_fileid(path);
10.22
10.23 if (fileid == FILEID_INVALID)
10.24 return NULL;
10.25
10.26 - PageMapper *mapper = get_mapper(fileid);
10.27 - return new FilePager(fileid, mapper, flags);
10.28 -}
10.29 -
10.30 -/* Obtain a page mapper for the 'fileid' or register a new one in the
10.31 - paging object. */
10.32 -
10.33 -PageMapper *OpenerResource::get_mapper(fileid_t fileid)
10.34 -{
10.35 - PageMapper *mapper;
10.36 -
10.37 - if (_paging->reserve(fileid))
10.38 - mapper = _paging->get(fileid);
10.39 - else
10.40 - {
10.41 - Accessor *accessor = make_accessor(fileid);
10.42 - mapper = new PageMapper(accessor, _pages);
10.43 - _paging->set(fileid, mapper);
10.44 - }
10.45 -
10.46 - return mapper;
10.47 + return get_pager(fileid, flags);
10.48 }
10.49
10.50
11.1 --- a/files/opener_resource.h Wed Mar 31 01:06:22 2021 +0200
11.2 +++ b/files/opener_resource.h Wed Mar 31 23:54:51 2021 +0200
11.3 @@ -2,34 +2,18 @@
11.4
11.5 #include <l4/sys/ipc.h>
11.6
11.7 -#include "file_pager.h"
11.8 #include "opener_context_resource.h"
11.9 #include "opener_interface.h"
11.10 -#include "pager.h"
11.11 #include "paging.h"
11.12 #include "pages.h"
11.13 #include "resource.h"
11.14
11.15 /* Support for providing access to files. */
11.16
11.17 -class OpenerResource : public Resource, public Opener
11.18 +class OpenerResource : public Resource, public Paging, public Opener
11.19 {
11.20 -protected:
11.21 - Paging *_paging;
11.22 - Pages *_pages;
11.23 -
11.24 - /* Convenience methods. */
11.25 -
11.26 - PageMapper *get_mapper(fileid_t fileid);
11.27 -
11.28 - /* Configurable methods. */
11.29 -
11.30 - virtual fileid_t get_fileid(const char *path) = 0;
11.31 -
11.32 - virtual Accessor *make_accessor(fileid_t fileid) = 0;
11.33 -
11.34 public:
11.35 - explicit OpenerResource(Paging *paging, Pages *pages);
11.36 + explicit OpenerResource(Pages *pages);
11.37
11.38 /* Server details. */
11.39
11.40 @@ -42,7 +26,7 @@
11.41
11.42 /* Direct access methods. */
11.43
11.44 - FilePager *open(const char *path, flags_t flags);
11.45 + Pager *open(const char *path, flags_t flags);
11.46
11.47 /* Opener interface methods. */
11.48
12.1 --- a/files/test_file_opener.cc Wed Mar 31 01:06:22 2021 +0200
12.2 +++ b/files/test_file_opener.cc Wed Mar 31 23:54:51 2021 +0200
12.3 @@ -5,9 +5,8 @@
12.4
12.5 /* Support for providing access to files. */
12.6
12.7 -TestFileOpener::TestFileOpener(Paging *paging, Pages *pages,
12.8 - offset_t file_size)
12.9 -: OpenerResource(paging, pages), _file_size(file_size)
12.10 +TestFileOpener::TestFileOpener(Pages *pages, offset_t file_size)
12.11 +: OpenerResource(pages), _file_size(file_size)
12.12 {
12.13 }
12.14
13.1 --- a/files/test_file_opener.h Wed Mar 31 01:06:22 2021 +0200
13.2 +++ b/files/test_file_opener.h Wed Mar 31 23:54:51 2021 +0200
13.3 @@ -16,7 +16,7 @@
13.4 virtual Accessor *make_accessor(fileid_t fileid);
13.5
13.6 public:
13.7 - explicit TestFileOpener(Paging *paging, Pages *pages, offset_t file_size=0);
13.8 + explicit TestFileOpener(Pages *pages, offset_t file_size=0);
13.9 };
13.10
13.11 // vim: tabstop=4 expandtab shiftwidth=4
14.1 --- a/pager.cc Wed Mar 31 01:06:22 2021 +0200
14.2 +++ b/pager.cc Wed Mar 31 23:54:51 2021 +0200
14.3 @@ -13,6 +13,8 @@
14.4 _mapper->attach();
14.5 }
14.6
14.7 +/* Close the pager. */
14.8 +
14.9 void Pager::close()
14.10 {
14.11 if (_mapper != NULL)
15.1 --- a/paging.cc Wed Mar 31 01:06:22 2021 +0200
15.2 +++ b/paging.cc Wed Mar 31 23:54:51 2021 +0200
15.3 @@ -1,11 +1,15 @@
15.4 +#include "file_pager.h"
15.5 #include "paging.h"
15.6
15.7 -bool Paging::reserve(fileid_t fileid)
15.8 +
15.9 +
15.10 +Paging::Paging(Pages *pages)
15.11 +: _pages(pages)
15.12 {
15.13 - _lock.lock();
15.14 +}
15.15
15.16 - return _mappers.find(fileid) != _mappers.end();
15.17 -}
15.18 +/* Return any registered page mapper for the given 'fileid' or NULL if no such
15.19 + mapper is registered. */
15.20
15.21 PageMapper *Paging::get(fileid_t fileid)
15.22 {
15.23 @@ -17,18 +21,68 @@
15.24 else
15.25 mapper = entry->second;
15.26
15.27 - _lock.unlock();
15.28 return mapper;
15.29 }
15.30
15.31 +/* Register a page 'mapper' for the given 'fileid'. */
15.32 +
15.33 void Paging::set(fileid_t fileid, PageMapper *mapper)
15.34 {
15.35 FileMapping::iterator entry = _mappers.find(fileid);
15.36
15.37 if (entry == _mappers.end())
15.38 _mappers[fileid] = mapper;
15.39 +}
15.40
15.41 - _lock.unlock();
15.42 +/* Obtain a page mapper for the 'fileid' or register a new one in the
15.43 + paging object. */
15.44 +
15.45 +PageMapper *Paging::get_mapper(fileid_t fileid)
15.46 +{
15.47 + /* Obtain any registered page mapper. */
15.48 +
15.49 + PageMapper *mapper = get(fileid);
15.50 +
15.51 + if (mapper != NULL)
15.52 + return mapper;
15.53 +
15.54 + /* Make an accessor and page mapper, registering the mapper. */
15.55 +
15.56 + Accessor *accessor = make_accessor(fileid);
15.57 + mapper = new PageMapper(accessor, _pages);
15.58 +
15.59 + set(fileid, mapper);
15.60 +
15.61 + return mapper;
15.62 +}
15.63 +
15.64 +
15.65 +
15.66 +/* Return a pager initialised with a page mapper. */
15.67 +
15.68 +Pager *Paging::get_pager(fileid_t fileid, flags_t flags)
15.69 +{
15.70 + std::lock_guard<std::mutex> guard(_lock);
15.71 +
15.72 + /* Initialise the pager with the mapper and a reference to this object for
15.73 + closing the mapper and accessor. */
15.74 +
15.75 + PageMapper *mapper = get_mapper(fileid);
15.76 + return new FilePager(fileid, mapper, flags, this);
15.77 +}
15.78 +
15.79 +/* Detach a pager, potentially removing its resources. */
15.80 +
15.81 +void Paging::detach_pager(fileid_t fileid, PageMapper *mapper)
15.82 +{
15.83 + std::lock_guard<std::mutex> guard(_lock);
15.84 +
15.85 + if (!mapper->detach())
15.86 + {
15.87 + _mappers.erase(fileid);
15.88 + delete mapper->accessor();
15.89 + delete mapper;
15.90 + }
15.91 }
15.92
15.93 // vim: tabstop=4 expandtab shiftwidth=4