# HG changeset patch # User Paul Boddie # Date 1612134621 -3600 # Node ID 54182479d4bdb0a68500f383a2e8482c50cea76e # Parent ebe5228f5056e1b73f69f6dfc987bdb6ef827425 Made the opener, opener context and file pager resources, introducing the resource server functionality as a wrapper around server configurations. Introduced testing of the opener-related abstractions. diff -r ebe5228f5056 -r 54182479d4bd Makefile --- a/Makefile Sun Jan 24 19:29:07 2021 +0100 +++ b/Makefile Mon Feb 01 00:10:21 2021 +0100 @@ -15,16 +15,19 @@ # Compound interfaces. -mapped_file_object_NAME = MappedFileObject -mapped_file_object_INTERFACES = dataspace mapped_file +mapped_file_object_NAME = MappedFileObject +mapped_file_object_INTERFACES = dataspace mapped_file -COMP_INTERFACES_CC = mapped_file_object +opener_context_object_NAME = OpenerContextObject +opener_context_object_INTERFACES = dataspace opener_context + +COMP_INTERFACES_CC = mapped_file_object opener_context_object # Individual interfaces. -CLIENT_INTERFACES_CC = mapped_file +CLIENT_INTERFACES_CC = dataspace mapped_file opener opener_context -SERVER_INTERFACES_CC = $(call common_interfaces,$(COMP_INTERFACES_CC)) +SERVER_INTERFACES_CC = opener $(call common_interfaces,$(COMP_INTERFACES_CC)) # Generated and plain source files. @@ -32,27 +35,30 @@ SERVER_INTERFACES_SRC_CC = $(call interfaces_to_server_cc,$(SERVER_INTERFACES_CC) $(COMP_INTERFACES_CC)) -PLAIN_SRC_CC_dstest_client = \ - dstest_client.cc memory_utils.cc +COMMON_SRC_CC = memory_utils.cc + +PLAIN_SRC_CC_dstest_client = dstest_client.cc PLAIN_SRC_CC_dstest_server = \ access_map.cc accessing.cc accessor.cc \ dstest_server.cc flexpage.cc file_pager.cc \ - ipc.cc memory.cc memory_map.cc memory_utils.cc \ - opener.cc opener_context.cc \ + ipc.cc memory.cc memory_map.cc \ + opener_resource.cc opener_context_resource.cc \ page_mapper.cc page_queue.cc pager.cc pages.cc paging.cc \ - region.cc resource.cc simple_pager.cc \ - test_file_accessor.cc test_file_opener.cc + region.cc resource_server.cc simple_pager.cc \ + test_file_accessor.cc test_file_opener.cc \ # Normal definitions. SRC_CC_dstest_client = \ $(CLIENT_INTERFACES_SRC_CC) \ - $(PLAIN_SRC_CC_dstest_client) + $(PLAIN_SRC_CC_dstest_client) \ + $(COMMON_SRC_CC) SRC_CC_dstest_server = \ $(SERVER_INTERFACES_SRC_CC) \ - $(PLAIN_SRC_CC_dstest_server) + $(PLAIN_SRC_CC_dstest_server) \ + $(COMMON_SRC_CC) REQUIRES_LIBS = l4re_c-util libipc libstdc++ diff -r ebe5228f5056 -r 54182479d4bd dstest_client.cc --- a/dstest_client.cc Sun Jan 24 19:29:07 2021 +0100 +++ b/dstest_client.cc Mon Feb 01 00:10:21 2021 +0100 @@ -28,6 +28,9 @@ #include +#include "dataspace_client.h" +#include "opener_client.h" +#include "opener_context_client.h" #include "mapped_file_client.h" #include "memory_utils.h" @@ -36,8 +39,62 @@ int main(void) { l4_cap_idx_t server = l4re_env_get_cap("server"); + l4_cap_idx_t context_ref; + client_Opener opener(server); - client_MappedFile obj(server); + long err = opener.context(&context_ref); + + if (err) + { + printf("Could not obtain context: %s\n", l4sys_errtostr(err)); + return 1; + } + + client_OpenerContext context(context_ref); + client_Dataspace context_ds(context_ref); + unsigned long size, flags; + + err = context_ds.info(&size, &flags); + + if (err) + { + printf("Could not obtain context info: %s\n", l4sys_errtostr(err)); + return 1; + } + + /* Map context memory to write the filename. */ + + char *memory; + + printf("Attach region of size %ld...\n", size); + + err = ipc_attach_dataspace(context_ref, size, (void **) &memory); + + if (err) + { + printf("Could not map memory: %s\n", l4sys_errtostr(err)); + return 1; + } + + printf("Mapped memory at %p\n", memory); + + /* Write the filename. */ + + strcpy(memory, "123"); + + /* Invoke the open method to receive the file reference. */ + + l4_cap_idx_t file; + + err = context.open(L4_FPAGE_RW, &size, &file); + + if (err) + { + printf("Could not obtain file: %s\n", l4sys_errtostr(err)); + return 1; + } + + client_MappedFile obj(file); /* Some memory to be mapped. */ @@ -45,7 +102,7 @@ printf("Map region from %ld to %ld...\n", 0L, page(10)); - long err = obj.mmap(0, page(10), &start_pos, &end_pos, &data_end); + err = obj.mmap(0, page(10), &start_pos, &end_pos, &data_end); if (err) { @@ -53,12 +110,11 @@ return 1; } - char *memory; - unsigned long size = end_pos - start_pos; + size = end_pos - start_pos; printf("Attach region of size %ld...\n", size); - err = ipc_attach_dataspace(server, size, (void **) &memory); + err = ipc_attach_dataspace(file, size, (void **) &memory); if (err) { diff -r ebe5228f5056 -r 54182479d4bd dstest_server.cc --- a/dstest_server.cc Sun Jan 24 19:29:07 2021 +0100 +++ b/dstest_server.cc Mon Feb 01 00:10:21 2021 +0100 @@ -26,14 +26,12 @@ #include #include -#include - #include "accessing.h" -#include "mapped_file_object_server.h" +#include "memory.h" #include "memory_utils.h" -#include "file_pager.h" #include "pages.h" #include "paging.h" +#include "resource_server.h" #include "test_file_opener.h" @@ -50,15 +48,11 @@ Paging paging; Pages pages(&mem); TestFileOpener opener(&accessing, &paging, &pages, page(FILE_PAGES)); - FilePager *obj = opener.open("123"); - - /* Server capability. */ - - l4_cap_idx_t server; /* Register a server associating it with the given object. */ - long err = ipc_server_bind("server", (l4_umword_t) obj, &server); + ResourceServer server(&opener); + long err = server.bind("server"); if (err) { @@ -66,9 +60,7 @@ return 1; } - /* Wait for messages, dispatching to the handler. */ - - ipc_server_loop_for(MappedFileObject, obj); - + printf("Starting server...\n"); + server.start(); return 0; } diff -r ebe5228f5056 -r 54182479d4bd file_pager.cc --- a/file_pager.cc Sun Jan 24 19:29:07 2021 +0100 +++ b/file_pager.cc Mon Feb 01 00:10:21 2021 +0100 @@ -1,4 +1,5 @@ #include "file_pager.h" +#include "mapped_file_object_server.h" /* Initialise a pager for a file with a unique file identifier and shared page mapper for moderating access to loaded pages. */ @@ -8,6 +9,16 @@ { } +int FilePager::expected_items() +{ + return MappedFileObject_expected_items; +} + +ipc_server_handler_type FilePager::handler() +{ + return (ipc_server_handler_type) handle_MappedFileObject; +} + long FilePager::mmap(size_t position, size_t length, size_t *start_pos, size_t *end_pos, size_t *data_end) { /* Set the limits of the paged region. */ diff -r ebe5228f5056 -r 54182479d4bd file_pager.h --- a/file_pager.h Sun Jan 24 19:29:07 2021 +0100 +++ b/file_pager.h Mon Feb 01 00:10:21 2021 +0100 @@ -12,6 +12,17 @@ explicit FilePager(fileid_t fileid, PageMapper *mapper); + /* Server details. */ + + int expected_items(); + + ipc_server_handler_type handler(); + + void *interface() + { return static_cast(this); } + + /* Pager and mapped file methods. */ + virtual long map(unsigned long offset, l4_addr_t hot_spot, unsigned long flags, l4_snd_fpage_t *region) { return Pager::map(offset, hot_spot, flags, region); } diff -r ebe5228f5056 -r 54182479d4bd ipc.cc --- a/ipc.cc Sun Jan 24 19:29:07 2021 +0100 +++ b/ipc.cc Mon Feb 01 00:10:21 2021 +0100 @@ -9,12 +9,10 @@ /* Make an L4 representation of the given flexpage. */ -static l4_fpage_t ipc_get_fpage(SendFlexpage *send_flexpage) +static l4_fpage_t ipc_get_fpage(SendFlexpage *send_flexpage, unsigned long flags) { // NOTE: To introduce flags properly in the flexpage abstractions. - unsigned long flags = L4_FPAGE_RW; - return l4_fpage(send_flexpage->base_addr, send_flexpage->order, (flags & L4RE_DS_MAP_FLAG_RW) ? L4_FPAGE_RW : L4_FPAGE_RO); } @@ -30,7 +28,7 @@ if (!send_flexpage.order) return -L4_ERANGE; - region->fpage = ipc_get_fpage(&send_flexpage); + region->fpage = ipc_get_fpage(&send_flexpage, flags); region->snd_base = hot_spot; return L4_EOK; @@ -42,7 +40,9 @@ { SendFlexpage send_flexpage = flexpage->to_unmap(); - l4_task_unmap(L4RE_THIS_TASK_CAP, ipc_get_fpage(&send_flexpage), L4_FP_OTHER_SPACES); + // NOTE: To introduce flags properly in the flexpage abstractions. + + l4_task_unmap(L4RE_THIS_TASK_CAP, ipc_get_fpage(&send_flexpage, L4_FPAGE_RW), L4_FP_OTHER_SPACES); } // vim: tabstop=4 expandtab shiftwidth=4 diff -r ebe5228f5056 -r 54182479d4bd opener.cc --- a/opener.cc Sun Jan 24 19:29:07 2021 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,63 +0,0 @@ -#include "opener.h" - -/* Support for providing access to files. */ - -Opener::Opener(Accessing *accessing, Paging *paging, Pages *pages) -: _accessing(accessing), _paging(paging), _pages(pages) -{ -} - -OpenerContext *Opener::context() -{ - return new OpenerContext(this); -} - -FilePager *Opener::open(const char *path) -{ - fileid_t fileid = get_fileid(path); - - if (fileid == FILEID_INVALID) - return NULL; - - Accessor *accessor = get_accessor(fileid); - PageMapper *mapper = get_mapper(accessor); - return new FilePager(fileid, mapper); -} - -/* Obtain an accessor for the 'fileid' or register a new one in the accessing - object. */ - -Accessor *Opener::get_accessor(fileid_t fileid) -{ - Accessor *accessor; - - if (_accessing->reserve(fileid)) - accessor = _accessing->get(fileid); - else - { - accessor = make_accessor(fileid); - _accessing->set(fileid, accessor); - } - - return accessor; -} - -/* Obtain a page mapper for the 'accessor' or register a new one in the - paging object. */ - -PageMapper *Opener::get_mapper(Accessor *accessor) -{ - PageMapper *mapper; - - if (_paging->reserve(accessor)) - mapper = _paging->get(accessor); - else - { - mapper = new PageMapper(accessor, _pages); - _paging->set(accessor, mapper); - } - - return mapper; -} - -// vim: tabstop=4 expandtab shiftwidth=4 diff -r ebe5228f5056 -r 54182479d4bd opener.h --- a/opener.h Sun Jan 24 19:29:07 2021 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,39 +0,0 @@ -#pragma once - -#include "accessing.h" -#include "file_pager.h" -#include "opener_context.h" -#include "pager.h" -#include "paging.h" -#include "pages.h" - -/* Support for providing access to files. */ - -class Opener -{ -protected: - Accessing *_accessing; - Paging *_paging; - Pages *_pages; - - /* Convenience methods. */ - - Accessor *get_accessor(fileid_t fileid); - - PageMapper *get_mapper(Accessor *accessor); - - /* Configurable methods. */ - - virtual fileid_t get_fileid(const char *path) = 0; - - virtual Accessor *make_accessor(fileid_t fileid) = 0; - -public: - explicit Opener(Accessing *accessing, Paging *paging, Pages *pages); - - OpenerContext *context(); - - FilePager *open(const char *path); -}; - -// vim: tabstop=4 expandtab shiftwidth=4 diff -r ebe5228f5056 -r 54182479d4bd opener_context.cc --- a/opener_context.cc Sun Jan 24 19:29:07 2021 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,21 +0,0 @@ -#include "opener.h" -#include "opener_context.h" - -/* Support for providing access to files. */ - -OpenerContext::OpenerContext(Opener *opener, Memory *memory) -: SimplePager(memory), _opener(opener) -{ -} - -FilePager *OpenerContext::open() -{ - return _opener->open(get_path()); -} - -char *OpenerContext::get_path() -{ - return _region->read(); -} - -// vim: tabstop=4 expandtab shiftwidth=4 diff -r ebe5228f5056 -r 54182479d4bd opener_context.h --- a/opener_context.h Sun Jan 24 19:29:07 2021 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,29 +0,0 @@ -#pragma once - -#include "file_pager.h" -#include "simple_pager.h" - - - -/* Forward declaration. */ - -class Opener; - - - -/* Support for indicating files to be opened. */ - -class OpenerContext : public SimplePager -{ -protected: - Opener *_opener; - -public: - explicit OpenerContext(Opener *opener, Memory *memory=NULL); - - FilePager *open(); - - char *get_path(); -}; - -// vim: tabstop=4 expandtab shiftwidth=4 diff -r ebe5228f5056 -r 54182479d4bd opener_context_resource.cc --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/opener_context_resource.cc Mon Feb 01 00:10:21 2021 +0100 @@ -0,0 +1,55 @@ +#include "opener_context_resource.h" +#include "opener_context_object_server.h" +#include "opener_resource.h" +#include "resource_server.h" + +/* Support for providing access to files. */ + +OpenerContextResource::OpenerContextResource(OpenerResource *opener, Memory *memory) +: SimplePager(memory), _opener(opener) +{ +} + +int OpenerContextResource::expected_items() +{ + return OpenerContextObject_expected_items; +} + +ipc_server_handler_type OpenerContextResource::handler() +{ + return (ipc_server_handler_type) handle_OpenerContextObject; +} + + + +/* Data access methods. */ + +char *OpenerContextResource::get_path() +{ + return _region->read(); +} + + + +/* Opener context interface methods. */ + +long OpenerContextResource::open(int flags, size_t *size, l4_cap_idx_t *file) +{ + /* NOTE: Support flags in the file pager method and obtain the file size. */ + + FilePager *pager = _opener->open(get_path()); + + /* Complete the initialisation and start a server in a new thread. */ + + ResourceServer server(pager); + long err = server.start_thread(); + + /* Return the file size. */ + /* Return the server capability to the caller. */ + + *size = pager->get_data_size(); + *file = server.config()->server; + return err; +} + +// vim: tabstop=4 expandtab shiftwidth=4 diff -r ebe5228f5056 -r 54182479d4bd opener_context_resource.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/opener_context_resource.h Mon Feb 01 00:10:21 2021 +0100 @@ -0,0 +1,51 @@ +#pragma once + +#include "opener_context_object_interface.h" +#include "simple_pager.h" + + + +/* Forward declaration. */ + +class OpenerResource; + + + +/* Support for indicating files to be opened. */ + +class OpenerContextResource : public SimplePager, public OpenerContextObject +{ +protected: + OpenerResource *_opener; + +public: + explicit OpenerContextResource(OpenerResource *opener, Memory *memory=NULL); + + /* Server details. */ + + int expected_items(); + + ipc_server_handler_type handler(); + + void *interface() + { return static_cast(this); } + + /* Data access methods. */ + + char *get_path(); + + /* Opener context interface methods. */ + + long open(int flags, size_t *size, l4_cap_idx_t *file); + + /* Pager/dataspace methods. */ + + long map(unsigned long offset, l4_addr_t hot_spot, unsigned long flags, + l4_snd_fpage_t *region) + { return SimplePager::map(offset, hot_spot, flags, region); } + + long info(unsigned long *size, unsigned long *flags) + { return SimplePager::info(size, flags); } +}; + +// vim: tabstop=4 expandtab shiftwidth=4 diff -r ebe5228f5056 -r 54182479d4bd opener_resource.cc --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/opener_resource.cc Mon Feb 01 00:10:21 2021 +0100 @@ -0,0 +1,93 @@ +#include "opener_server.h" +#include "opener_resource.h" +#include "resource_server.h" + +/* Support for providing access to files. */ + +OpenerResource::OpenerResource(Accessing *accessing, Paging *paging, Pages *pages) +: _accessing(accessing), _paging(paging), _pages(pages) +{ +} + +int OpenerResource::expected_items() +{ + return Opener_expected_items; +} + +ipc_server_handler_type OpenerResource::handler() +{ + return (ipc_server_handler_type) handle_Opener; +} + + + +/* Return a pager object for the given path. */ + +FilePager *OpenerResource::open(const char *path) +{ + fileid_t fileid = get_fileid(path); + + if (fileid == FILEID_INVALID) + return NULL; + + Accessor *accessor = get_accessor(fileid); + PageMapper *mapper = get_mapper(accessor); + return new FilePager(fileid, mapper); +} + +/* Obtain an accessor for the 'fileid' or register a new one in the accessing + object. */ + +Accessor *OpenerResource::get_accessor(fileid_t fileid) +{ + Accessor *accessor; + + if (_accessing->reserve(fileid)) + accessor = _accessing->get(fileid); + else + { + accessor = make_accessor(fileid); + _accessing->set(fileid, accessor); + } + + return accessor; +} + +/* Obtain a page mapper for the 'accessor' or register a new one in the + paging object. */ + +PageMapper *OpenerResource::get_mapper(Accessor *accessor) +{ + PageMapper *mapper; + + if (_paging->reserve(accessor)) + mapper = _paging->get(accessor); + else + { + mapper = new PageMapper(accessor, _pages); + _paging->set(accessor, mapper); + } + + return mapper; +} + + + +/* Opener interface methods. */ + +long OpenerResource::context(l4_cap_idx_t *context) +{ + OpenerContextResource *resource = new OpenerContextResource(this); + + /* Complete the initialisation and start a server in a new thread. */ + + ResourceServer server(resource); + long err = server.start_thread(); + + /* Return the server capability to the caller. */ + + *context = server.config()->server; + return err; +} + +// vim: tabstop=4 expandtab shiftwidth=4 diff -r ebe5228f5056 -r 54182479d4bd opener_resource.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/opener_resource.h Mon Feb 01 00:10:21 2021 +0100 @@ -0,0 +1,56 @@ +#pragma once + +#include + +#include "accessing.h" +#include "file_pager.h" +#include "opener_context_resource.h" +#include "opener_interface.h" +#include "pager.h" +#include "paging.h" +#include "pages.h" +#include "resource.h" + +/* Support for providing access to files. */ + +class OpenerResource : public Resource, public Opener +{ +protected: + Accessing *_accessing; + Paging *_paging; + Pages *_pages; + + /* Convenience methods. */ + + Accessor *get_accessor(fileid_t fileid); + + PageMapper *get_mapper(Accessor *accessor); + + /* Configurable methods. */ + + virtual fileid_t get_fileid(const char *path) = 0; + + virtual Accessor *make_accessor(fileid_t fileid) = 0; + +public: + explicit OpenerResource(Accessing *accessing, Paging *paging, Pages *pages); + + /* Server details. */ + + int expected_items(); + + ipc_server_handler_type handler(); + + void *interface() + { return static_cast(this); } + + /* Direct access methods. */ + + FilePager *open(const char *path); + + /* Opener interface methods. */ + + long context(l4_cap_idx_t *context); +}; + +// vim: tabstop=4 expandtab shiftwidth=4 diff -r ebe5228f5056 -r 54182479d4bd resource.cc --- a/resource.cc Sun Jan 24 19:29:07 2021 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,12 +0,0 @@ -#include "resource.h" - - -Resource::~Resource() -{ -} - -void Resource::close() -{ -} - -// vim: tabstop=4 expandtab shiftwidth=4 diff -r ebe5228f5056 -r 54182479d4bd resource.h --- a/resource.h Sun Jan 24 19:29:07 2021 +0100 +++ b/resource.h Mon Feb 01 00:10:21 2021 +0100 @@ -1,15 +1,56 @@ +/* + * Common resource classes and functions. + * + * Copyright (C) 2018, 2019, 2020 Paul Boddie + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 2 of + * the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, + * Boston, MA 02110-1301, USA + */ + #pragma once +#include + -/* A resource interface. */ +/* A generic class for an object potentially needing to be closed after use. */ class Resource { public: - virtual ~Resource(); + virtual ~Resource() + { + } + + /* Server details. */ + + virtual int expected_items() = 0; + + virtual ipc_server_handler_type handler() = 0; + + virtual void *interface() = 0; - virtual void close(); + /* Deallocation of resources. */ + + virtual void close() + { + } + + /* Activation. */ + + virtual void activate() + { + } }; - -// vim: tabstop=4 expandtab shiftwidth=4 diff -r ebe5228f5056 -r 54182479d4bd resource_server.cc --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/resource_server.cc Mon Feb 01 00:10:21 2021 +0100 @@ -0,0 +1,115 @@ +/* + * Resource server functionality. + * + * Copyright (C) 2018, 2019, 2020 Paul Boddie + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 2 of + * the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, + * Boston, MA 02110-1301, USA + */ + +#include +#include + +#include +#include + +#include "resource_server.h" + + + +/* Convenience server methods. */ + +/* Bind to a named IPC gate capability. */ + +long ResourceServer::bind(const char *name) +{ + return ipc_server_bind(name, (l4_umword_t) _resource, &_config->server); +} + +/* Start in the same thread with no deletion notifications or finalisation. */ + +long ResourceServer::start() +{ + resource_init_config(_config, _resource); + _config->thread = pthread_l4_cap(pthread_self()); + return resource_start_config(_config, _resource); +} + +/* Start a new thread with deletion notifications and finalisation. */ + +long ResourceServer::start_thread() +{ + pthread_t thread; + pthread_attr_t attr; + + pthread_attr_init(&attr); + pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED); + + resource_init_config(_config, _resource); + pthread_create(&thread, &attr, ipc_server_start_mainloop, _config); + resource_set_config_threaded(_config, pthread_l4_cap(thread), 1); + + return resource_start_config(_config, _resource); +} + + + +/* Initialise a server configuration for a resource. */ + +void resource_init_config(ipc_server_config_type *config, Resource *resource) +{ + config->handler_obj = resource->interface(); + config->finaliser_obj = resource; + config->expected_items = resource->expected_items(); + config->handler = resource->handler(); +} + +/* Set a configuration to be threaded. */ + +void resource_set_config_threaded(ipc_server_config_type *config, + l4_cap_idx_t thread, int new_thread) +{ + config->finaliser = resource_thread_finaliser; + config->new_thread = new_thread; + config->thread = thread; + config->notifications = 1; +} + +/* Activate a resource and start a server for it. */ + +long resource_start_config(ipc_server_config_type *config, Resource *resource) +{ + resource->activate(); + return ipc_server_start_config(config); +} + + + +/* A finaliser for exposed resources. */ + +void resource_thread_finaliser(ipc_server_config_type *config) +{ + Resource *resource = reinterpret_cast(config->finaliser_obj); + + /* Close and delete the resource. */ + + resource->close(); + delete resource; + + /* Release the capabilities. */ + + ipc_server_finalise_config(config); + delete config; +} diff -r ebe5228f5056 -r 54182479d4bd resource_server.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/resource_server.h Mon Feb 01 00:10:21 2021 +0100 @@ -0,0 +1,76 @@ +/* + * Common resource server functions. + * + * Copyright (C) 2018, 2019, 2020 Paul Boddie + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 2 of + * the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, + * Boston, MA 02110-1301, USA + */ + +#pragma once + +#include "resource.h" +#include + + + +/* Convenience abstraction for blocking servers. */ + +class ResourceServer +{ +protected: + Resource *_resource; + ipc_server_config_type *_config; + +public: + explicit ResourceServer(Resource *resource) + : _resource(resource) + { + _config = new ipc_server_config_type; + ipc_server_init_config(_config); + } + + /* Access to configuration. */ + + ipc_server_config_type *config() + { return _config; } + + /* Server IPC gate allocation. */ + + long bind(const char *name); + + /* Server initiation. */ + + long start(); + + long start_thread(); +}; + + + +/* Server initialisation. */ + +void resource_init_config(ipc_server_config_type *config, Resource *resource); + +void resource_set_config_threaded(ipc_server_config_type *config, + l4_cap_idx_t thread, int new_thread); + +/* Server initiation. */ + +long resource_start_config(ipc_server_config_type *config, Resource *resource); + +/* Server finalisation. */ + +void resource_thread_finaliser(ipc_server_config_type *config); diff -r ebe5228f5056 -r 54182479d4bd simple_pager.cc --- a/simple_pager.cc Sun Jan 24 19:29:07 2021 +0100 +++ b/simple_pager.cc Mon Feb 01 00:10:21 2021 +0100 @@ -36,17 +36,25 @@ /* Send the flexpage explicitly. */ - long err = ipc_prepare_flexpage(&flexpage, offset, PAGE_SIZE, hot_spot, flags, region); + long err = ipc_prepare_flexpage(&flexpage, offset, _region->size(), hot_spot, flags, region); if (err) - return err; + return err; err = complete_Dataspace_map(*region); if (err) - return err; + return err; return IPC_MESSAGE_SENT; } +long SimplePager::info(unsigned long *size, unsigned long *flags) +{ + *size = _region->size(); + *flags = L4_FPAGE_RW; + + return L4_EOK; +} + // vim: tabstop=4 expandtab shiftwidth=4 diff -r ebe5228f5056 -r 54182479d4bd simple_pager.h --- a/simple_pager.h Sun Jan 24 19:29:07 2021 +0100 +++ b/simple_pager.h Mon Feb 01 00:10:21 2021 +0100 @@ -23,6 +23,8 @@ /* Paging methods. */ long map(unsigned long offset, l4_addr_t hot_spot, unsigned long flags, l4_snd_fpage_t *region); + + long info(unsigned long *size, unsigned long *flags); }; // vim: tabstop=4 expandtab shiftwidth=4 diff -r ebe5228f5056 -r 54182479d4bd test_file_opener.cc --- a/test_file_opener.cc Sun Jan 24 19:29:07 2021 +0100 +++ b/test_file_opener.cc Mon Feb 01 00:10:21 2021 +0100 @@ -6,8 +6,8 @@ /* Support for providing access to files. */ TestFileOpener::TestFileOpener(Accessing *accessing, Paging *paging, Pages *pages, - offset_t file_size) -: Opener(accessing, paging, pages), _file_size(file_size) + offset_t file_size) +: OpenerResource(accessing, paging, pages), _file_size(file_size) { } diff -r ebe5228f5056 -r 54182479d4bd test_file_opener.h --- a/test_file_opener.h Sun Jan 24 19:29:07 2021 +0100 +++ b/test_file_opener.h Mon Feb 01 00:10:21 2021 +0100 @@ -1,10 +1,10 @@ #pragma once -#include "opener.h" +#include "opener_resource.h" /* Support for providing access to files. */ -class TestFileOpener : public Opener +class TestFileOpener : public OpenerResource { protected: offset_t _file_size; @@ -17,7 +17,7 @@ public: explicit TestFileOpener(Accessing *accessing, Paging *paging, Pages *pages, - offset_t file_size=0); + offset_t file_size=0); }; // vim: tabstop=4 expandtab shiftwidth=4