# HG changeset patch # User Paul Boddie # Date 1634500537 -7200 # Node ID 5800bd1b5ca5e645c6c6ad0cd25a07c4a36aa55c # Parent 8bf9abc10ae7ac53b083bca481015bce10c1b54b Moved resource instantiation to provider methods. diff -r 8bf9abc10ae7 -r 5800bd1b5ca5 libfsserver/include/fsserver/directory_provider.h --- a/libfsserver/include/fsserver/directory_provider.h Sun Oct 17 18:48:30 2021 +0200 +++ b/libfsserver/include/fsserver/directory_provider.h Sun Oct 17 21:55:37 2021 +0200 @@ -34,11 +34,15 @@ DirectoryAccessor *_accessor; public: - explicit DirectoryProvider(DirectoryAccessor *accessor); + explicit DirectoryProvider(fileid_t fileid, FileRegistry *registry, + DirectoryAccessor *accessor); virtual ~DirectoryProvider(); virtual DirectoryAccessor *accessor(); + + virtual long make_resource(offset_t *size, object_flags_t *object_flags, + Resource **resource); }; // vim: tabstop=4 expandtab shiftwidth=4 diff -r 8bf9abc10ae7 -r 5800bd1b5ca5 libfsserver/include/fsserver/file_object_registry.h --- a/libfsserver/include/fsserver/file_object_registry.h Sun Oct 17 18:48:30 2021 +0200 +++ b/libfsserver/include/fsserver/file_object_registry.h Sun Oct 17 21:55:37 2021 +0200 @@ -53,21 +53,6 @@ flags_t flags, fileid_t fileid, Provider **provider); - /* Resource initialisation methods. */ - - long make_directory_resource(fileid_t fileid, offset_t *size, - object_flags_t *object_flags, - DirectoryProvider *provider, - Resource **resource); - - long make_file_resource(flags_t flags, fileid_t fileid, offset_t *size, - object_flags_t *object_flags, - FileProvider *provider, Resource **resource); - - long make_resource(flags_t flags, fileid_t fileid, offset_t *size, - object_flags_t *object_flags, - Provider *provider, Resource **resource); - public: explicit FileObjectRegistry(Pages *pages); diff -r 8bf9abc10ae7 -r 5800bd1b5ca5 libfsserver/include/fsserver/file_provider.h --- a/libfsserver/include/fsserver/file_provider.h Sun Oct 17 18:48:30 2021 +0200 +++ b/libfsserver/include/fsserver/file_provider.h Sun Oct 17 21:55:37 2021 +0200 @@ -31,14 +31,19 @@ class FileProvider : public Provider { protected: + map_flags_t _flags; PageMapper *_mapper; public: - explicit FileProvider(PageMapper *mapper); + explicit FileProvider(fileid_t fileid, map_flags_t flags, + FileRegistry *registry, PageMapper *mapper); virtual ~FileProvider(); - PageMapper *mapper(); + virtual PageMapper *mapper(); + + virtual long make_resource(offset_t *size, object_flags_t *object_flags, + Resource **resource); }; // vim: tabstop=4 expandtab shiftwidth=4 diff -r 8bf9abc10ae7 -r 5800bd1b5ca5 libfsserver/include/fsserver/provider.h --- a/libfsserver/include/fsserver/provider.h Sun Oct 17 18:48:30 2021 +0200 +++ b/libfsserver/include/fsserver/provider.h Sun Oct 17 21:55:37 2021 +0200 @@ -22,7 +22,9 @@ #pragma once #include +#include #include +#include @@ -30,8 +32,17 @@ class Provider : public NotificationSupport, public Accountable { +protected: + fileid_t _fileid; + FileRegistry *_registry; + public: - explicit Provider(); + explicit Provider(fileid_t fileid, FileRegistry *registry); + + virtual ~Provider(); + + virtual long make_resource(offset_t *size, object_flags_t *object_flags, + Resource **resource) = 0; }; // vim: tabstop=4 expandtab shiftwidth=4 diff -r 8bf9abc10ae7 -r 5800bd1b5ca5 libfsserver/lib/directories/directory_provider.cc --- a/libfsserver/lib/directories/directory_provider.cc Sun Oct 17 18:48:30 2021 +0200 +++ b/libfsserver/lib/directories/directory_provider.cc Sun Oct 17 21:55:37 2021 +0200 @@ -20,13 +20,15 @@ */ #include "directory_provider.h" +#include "directory_resource.h" /* Initialise the provider. */ -DirectoryProvider::DirectoryProvider(DirectoryAccessor *accessor) -: Provider(), _accessor(accessor) +DirectoryProvider::DirectoryProvider(fileid_t fileid, FileRegistry *registry, + DirectoryAccessor *accessor) +: Provider(fileid, registry), _accessor(accessor) { } @@ -43,4 +45,23 @@ return _accessor; } +/* Return a directory resource initialised with this provider. */ + +long DirectoryProvider::make_resource(offset_t *size, + object_flags_t *object_flags, + Resource **resource) +{ + /* Provide non-file values for certain outputs. */ + + *size = 0; + *object_flags = 0; + + /* Initialise the resource with the provider and a reference to the registry + for detaching from the provider. */ + + this->attach(); + *resource = new DirectoryResource(_fileid, this, _registry); + return L4_EOK; +} + // vim: tabstop=4 expandtab shiftwidth=4 diff -r 8bf9abc10ae7 -r 5800bd1b5ca5 libfsserver/lib/files/file_object_registry.cc --- a/libfsserver/lib/files/file_object_registry.cc Sun Oct 17 18:48:30 2021 +0200 +++ b/libfsserver/lib/files/file_object_registry.cc Sun Oct 17 21:55:37 2021 +0200 @@ -61,7 +61,7 @@ if (err) return err; - *provider = new DirectoryProvider(accessor); + *provider = new DirectoryProvider(fileid, this, accessor); /* Register the provider. */ @@ -85,7 +85,7 @@ return err; PageMapper *mapper = new PageMapper(accessor, _pages); - *provider = new FileProvider(mapper); + *provider = new FileProvider(fileid, get_flags(flags), this, mapper); /* Register the provider. */ @@ -110,72 +110,6 @@ -/* Return a directory resource initialised with a provider. */ - -long FileObjectRegistry::make_directory_resource(fileid_t fileid, offset_t *size, - object_flags_t *object_flags, - DirectoryProvider *provider, - Resource **resource) -{ - /* Provide non-file values for certain outputs. */ - - *size = 0; - *object_flags = 0; - - /* Initialise the resource with the provider and a reference to this object - for detaching from the provider. */ - - provider->attach(); - *resource = new DirectoryResource(fileid, provider, this); - return L4_EOK; -} - -/* Return a file pager initialised with a provider, page mapper and accessor. */ - -long FileObjectRegistry::make_file_resource(flags_t flags, fileid_t fileid, - offset_t *size, - object_flags_t *object_flags, - FileProvider *provider, - Resource **resource) -{ - /* Initialise the pager with the provider and a reference to this object for - detaching from the provider. */ - - FilePager *pager = new FilePager(fileid, provider, get_flags(flags), this); - - /* Obtain the size details from the pager, also providing appropriate - flags. */ - - *size = pager->get_data_size(); - *object_flags = OBJECT_SUPPORTS_MMAP | OBJECT_HAS_SIZE; - - provider->attach(); - *resource = pager; - return L4_EOK; -} - -/* Make a resource of the appropriate type. */ - -long FileObjectRegistry::make_resource(flags_t flags, fileid_t fileid, - offset_t *size, - object_flags_t *object_flags, - Provider *provider, Resource **resource) -{ - DirectoryProvider *dp = dynamic_cast(provider); - - if (dp != NULL) - return make_directory_resource(fileid, size, object_flags, dp, resource); - - FileProvider *fp = dynamic_cast(provider); - - if (fp != NULL) - return make_file_resource(flags, fileid, size, object_flags, fp, resource); - - return -L4_EIO; -} - - - /* Return a resource for a filesystem object. */ long FileObjectRegistry::get_resource(FileOpening *opening, const char *path, @@ -209,7 +143,7 @@ /* Make a resource for the provider. */ - return make_resource(flags, fileid, size, object_flags, provider, resource); + return provider->make_resource(size, object_flags, resource); } diff -r 8bf9abc10ae7 -r 5800bd1b5ca5 libfsserver/lib/files/file_provider.cc --- a/libfsserver/lib/files/file_provider.cc Sun Oct 17 18:48:30 2021 +0200 +++ b/libfsserver/lib/files/file_provider.cc Sun Oct 17 21:55:37 2021 +0200 @@ -19,14 +19,16 @@ * Boston, MA 02110-1301, USA */ +#include "file_pager.h" #include "file_provider.h" /* Initialise the provider with a page 'mapper' for the file's contents. */ -FileProvider::FileProvider(PageMapper *mapper) -: Provider(), _mapper(mapper) +FileProvider::FileProvider(fileid_t fileid, map_flags_t flags, + FileRegistry *registry, PageMapper *mapper) +: Provider(fileid, registry), _flags(flags), _mapper(mapper) { } @@ -50,4 +52,25 @@ return _mapper; } +/* Return a file pager initialised with a provider, page mapper and accessor. */ + +long FileProvider::make_resource(offset_t *size, object_flags_t *object_flags, + Resource **resource) +{ + /* Initialise the pager with the provider and a reference to this object for + detaching from the provider. */ + + FilePager *pager = new FilePager(_fileid, this, _flags, _registry); + + /* Obtain the size details from the pager, also providing appropriate + flags. */ + + *size = pager->get_data_size(); + *object_flags = OBJECT_SUPPORTS_MMAP | OBJECT_HAS_SIZE; + + this->attach(); + *resource = pager; + return L4_EOK; +} + // vim: tabstop=4 expandtab shiftwidth=4 diff -r 8bf9abc10ae7 -r 5800bd1b5ca5 libfsserver/lib/generic/provider.cc --- a/libfsserver/lib/generic/provider.cc Sun Oct 17 18:48:30 2021 +0200 +++ b/libfsserver/lib/generic/provider.cc Sun Oct 17 21:55:37 2021 +0200 @@ -23,8 +23,12 @@ -Provider::Provider() -: NotificationSupport() +Provider::Provider(fileid_t fileid, FileRegistry *registry) +: NotificationSupport(), _fileid(fileid), _registry(registry) +{ +} + +Provider::~Provider() { }