# HG changeset patch # User Paul Boddie # Date 1679441177 -3600 # Node ID 48a46e7a32e78739bdf2e84ab8fecc17275f8151 # Parent 99ce25bb6908a3d12a10917db5eb2d9eeef9cbbb Introduced a separate library for the resource and resource server abstractions. diff -r 99ce25bb6908 -r 48a46e7a32e7 docs/wiki/Libraries --- a/docs/wiki/Libraries Tue Mar 21 21:49:00 2023 +0100 +++ b/docs/wiki/Libraries Wed Mar 22 00:26:17 2023 +0100 @@ -60,7 +60,6 @@ || '''Header File''' || '''Contents''' || || `fsclient/client.h` || Filesystem client functions || || `fsclient/file.h` || File access convenience functions and types || -|| `fsclient/notifier.h` || File event notification support || == libfsserver == @@ -68,52 +67,50 @@ functionality for filesystem-related [[Components|components]]. || '''Header File''' || '''Contents''' || -|| `fsserver/access_map.h` || An access map providing memory corresponding to file regions. || -|| `fsserver/accessor.h` || Generic accessor functionality. || -|| `fsserver/accountable.h` || Accountable object support. || -|| `fsserver/block_file_accessor.h` || A file accessor employing a rewritable memory area. || -|| `fsserver/block_file_opener.h` || An opener for a file employing a rewritable memory area. || -|| `fsserver/copied_page_mapper.h` || A page mapper providing copied memory pages or deferring to another page mapper to satisfy file accesses. || -|| `fsserver/directory_accessor.h` || An object providing access to a filesystem directory. || -|| `fsserver/directory_provider.h` || An object providing a directory abstraction with notification facilities. || -|| `fsserver/directory_resource.h` || A resource offering support for directory operations. || -|| `fsserver/ext2_directory_accessor.h` || An object for a directory provided by an Ext2-compatible filesystem. || -|| `fsserver/ext2_file_accessor.h` || A file accessor employing a file provided by an Ext2-compatible filesystem. || -|| `fsserver/ext2_file_opener.h` || An opener for a file provided by an Ext2-compatible filesystem. || -|| `fsserver/ext2_file_operations.h` || File operations supporting an Ext2-compatible filesystem. || -|| `fsserver/ext2_filesystem.h` || A resource supporting the creation of user-specific ext2 filesystem opener resources. || -|| `fsserver/file_opening.h` || Generic support for opening files. || -|| `fsserver/file_pager.h` || File-specific pager functionality. || -|| `fsserver/file_provider.h` || An object encapsulating file resources. || -|| `fsserver/filesystem_resource.h` || A resource supporting the creation of user-specific opener resources. || -|| `fsserver/generic_page_mapper.h` || A generic page mapper providing memory pages to satisfy file accesses. || -|| `fsserver/host_directory_accessor.h` || An object for a "host" directory provided via the C library. || -|| `fsserver/host_file_accessor.h` || A file accessor employing a "host" file provided via the C library. || -|| `fsserver/host_file_opener.h` || An opener for a "host" file provided via the C library. || -|| `fsserver/ipc.h` || Interprocess communication utilities. || -|| `fsserver/masked_page_mapper.h` || A page mapper providing memory pages to satisfy file accesses, masking the limits of a visible region of the file's contents. || -|| `fsserver/notification.h` || Notification support. || -|| `fsserver/opener_context_resource.h` || A context resource offering support for opening files. || -|| `fsserver/opener_resource.h` || A resource offering support for creating contexts and opening files. || -|| `fsserver/page_mapper.h` || A page mapper providing memory pages to satisfy file accesses. || -|| `fsserver/page_owner.h` || A page owner abstraction, indicating the current user of a memory region. || -|| `fsserver/page_queue.h` || A page queue abstraction. || -|| `fsserver/page_queue_partitioned.h` || A page queue retaining two internal collections of memory pages. || -|| `fsserver/page_queue_shared.h` || A page queue whose users take turns to access pages. || -|| `fsserver/pager.h` || Generic pager functionality. || -|| `fsserver/pages.h` || A page collection abstraction providing pages from a queue to users. || -|| `fsserver/pipe_accessor.h` || A pipe accessor merely resetting allocated memory for use. || -|| `fsserver/pipe_opener_resource.h` || A pipe opener resource. || -|| `fsserver/pipe_pager.h` || A pipe pager providing access to pipe content and navigation support. || -|| `fsserver/pipe_paging.h` || A pipe paging coordinator, permitting memory sharing pipe endpoints. || -|| `fsserver/provider.h` || Filesystem object provider support. || -|| `fsserver/provider_registry.h` || A registry of filesystem object providers. || -|| `fsserver/resource.h` || Common resource classes and functions. || -|| `fsserver/resource_registry.h` || A registry of filesystem object resources. || -|| `fsserver/resource_server.h` || Common resource server functions. || -|| `fsserver/simple_pager.h` || A simple pager exposing a single memory region. || -|| `fsserver/test_file_accessor.h` || A test accessor producing generated content. || -|| `fsserver/test_file_opener.h` || An opener for a test file containing generated content. || +|| `fsserver/access_map.h` || An access map providing memory corresponding to file regions || +|| `fsserver/accessor.h` || Generic accessor functionality || +|| `fsserver/accountable.h` || Accountable object support || +|| `fsserver/block_file_accessor.h` || A file accessor employing a rewritable memory area || +|| `fsserver/block_file_opener.h` || An opener for a file employing a rewritable memory area || +|| `fsserver/copied_page_mapper.h` || A page mapper providing copied memory pages or deferring to another page mapper to satisfy file accesses || +|| `fsserver/directory_accessor.h` || An object providing access to a filesystem directory || +|| `fsserver/directory_provider.h` || An object providing a directory abstraction with notification facilities || +|| `fsserver/directory_resource.h` || A resource offering support for directory operations || +|| `fsserver/ext2_directory_accessor.h` || An object for a directory provided by an Ext2-compatible filesystem || +|| `fsserver/ext2_file_accessor.h` || A file accessor employing a file provided by an Ext2-compatible filesystem || +|| `fsserver/ext2_file_opener.h` || An opener for a file provided by an Ext2-compatible filesystem || +|| `fsserver/ext2_file_operations.h` || File operations supporting an Ext2-compatible filesystem || +|| `fsserver/ext2_filesystem.h` || A resource supporting the creation of user-specific ext2 filesystem opener resources || +|| `fsserver/file_opening.h` || Generic support for opening files || +|| `fsserver/file_pager.h` || File-specific pager functionality || +|| `fsserver/file_provider.h` || An object encapsulating file resources || +|| `fsserver/filesystem_resource.h` || A resource supporting the creation of user-specific opener resources || +|| `fsserver/generic_page_mapper.h` || A generic page mapper providing memory pages to satisfy file accesses || +|| `fsserver/host_directory_accessor.h` || An object for a "host" directory provided via the C library || +|| `fsserver/host_file_accessor.h` || A file accessor employing a "host" file provided via the C library || +|| `fsserver/host_file_opener.h` || An opener for a "host" file provided via the C library || +|| `fsserver/ipc.h` || Interprocess communication utilities || +|| `fsserver/masked_page_mapper.h` || A page mapper providing memory pages to satisfy file accesses, masking the limits of a visible region of the file's contents || +|| `fsserver/notification.h` || Notification support || +|| `fsserver/opener_context_resource.h` || A context resource offering support for opening files || +|| `fsserver/opener_resource.h` || A resource offering support for creating contexts and opening files || +|| `fsserver/page_mapper.h` || A page mapper providing memory pages to satisfy file accesses || +|| `fsserver/page_owner.h` || A page owner abstraction, indicating the current user of a memory region || +|| `fsserver/page_queue.h` || A page queue abstraction || +|| `fsserver/page_queue_partitioned.h` || A page queue retaining two internal collections of memory pages || +|| `fsserver/page_queue_shared.h` || A page queue whose users take turns to access pages || +|| `fsserver/pager.h` || Generic pager functionality || +|| `fsserver/pages.h` || A page collection abstraction providing pages from a queue to users || +|| `fsserver/pipe_accessor.h` || A pipe accessor merely resetting allocated memory for use || +|| `fsserver/pipe_opener_resource.h` || A pipe opener resource || +|| `fsserver/pipe_pager.h` || A pipe pager providing access to pipe content and navigation support || +|| `fsserver/pipe_paging.h` || A pipe paging coordinator, permitting memory sharing pipe endpoints || +|| `fsserver/provider.h` || Filesystem object provider support || +|| `fsserver/provider_registry.h` || A registry of filesystem object providers || +|| `fsserver/resource_registry.h` || A registry of filesystem object resources || +|| `fsserver/simple_pager.h` || A simple pager exposing a single memory region || +|| `fsserver/test_file_accessor.h` || A test accessor producing generated content || +|| `fsserver/test_file_opener.h` || An opener for a test file containing generated content || == libipc == @@ -148,6 +145,22 @@ || `mem/send_flexpage.h` || A "send" flexpage abstraction for communicating memory mappings || || `mem/types.h` || Miscellaneous types || +== libnotifier == + +A library providing notification support for programs. + +|| '''Header File''' || '''Contents''' || +|| `notifier/notifier.h` || Event notification support || + +== libresource == + +A library providing support for resources, which are managed server +components. + +|| '''Header File''' || '''Contents''' || +|| `resource/resource.h` || Common resource classes and functions || +|| `resource/resource_server.h` || Common resource server functions || + == libsystypes == A repository of fundamental types used by the other libraries. diff -r 99ce25bb6908 -r 48a46e7a32e7 libexec/Control --- a/libexec/Control Tue Mar 21 21:49:00 2023 +0100 +++ b/libexec/Control Wed Mar 22 00:26:17 2023 +0100 @@ -1,3 +1,3 @@ -requires: libstdc++ libc libmem libipc libsystypes libfsclient libfsserver +requires: libstdc++ libc libmem libipc libsystypes libfsclient libfsserver libresource provides: libexec maintainer: paul@boddie.org.uk diff -r 99ce25bb6908 -r 48a46e7a32e7 libexec/include/exec/external_pager.h --- a/libexec/include/exec/external_pager.h Tue Mar 21 21:49:00 2023 +0100 +++ b/libexec/include/exec/external_pager.h Wed Mar 22 00:26:17 2023 +0100 @@ -27,7 +27,7 @@ #include #include #include -#include +#include #include "parent_pager_object_interface.h" diff -r 99ce25bb6908 -r 48a46e7a32e7 libexec/include/exec/internal_pager.h --- a/libexec/include/exec/internal_pager.h Tue Mar 21 21:49:00 2023 +0100 +++ b/libexec/include/exec/internal_pager.h Wed Mar 22 00:26:17 2023 +0100 @@ -22,7 +22,7 @@ #pragma once #include -#include +#include #include "pager_object_interface.h" diff -r 99ce25bb6908 -r 48a46e7a32e7 libexec/include/exec/process_creator_resource.h --- a/libexec/include/exec/process_creator_resource.h Tue Mar 21 21:49:00 2023 +0100 +++ b/libexec/include/exec/process_creator_resource.h Wed Mar 22 00:26:17 2023 +0100 @@ -22,7 +22,7 @@ #pragma once #include -#include +#include #include "opener_interface.h" diff -r 99ce25bb6908 -r 48a46e7a32e7 libexec/lib/src/Makefile --- a/libexec/lib/src/Makefile Tue Mar 21 21:49:00 2023 +0100 +++ b/libexec/lib/src/Makefile Wed Mar 22 00:26:17 2023 +0100 @@ -45,7 +45,7 @@ $(SERVER_INTERFACES_SRC_CC) \ $(PLAIN_SRC_CC) -REQUIRES_LIBS = l4re_c-util libmem libipc libstdc++ libsystypes libfsclient libfsserver +REQUIRES_LIBS = l4re_c-util libmem libipc libstdc++ libsystypes libfsclient libfsserver libresource PRIVATE_INCDIR = $(PKGDIR)/include/exec $(IDL_BUILD_DIR) $(IDL_EXPORT_DIR) diff -r 99ce25bb6908 -r 48a46e7a32e7 libexec/lib/src/process_creating.cc --- a/libexec/lib/src/process_creating.cc Tue Mar 21 21:49:00 2023 +0100 +++ b/libexec/lib/src/process_creating.cc Wed Mar 22 00:26:17 2023 +0100 @@ -23,9 +23,9 @@ #include #include -#include #include #include +#include #include #include diff -r 99ce25bb6908 -r 48a46e7a32e7 libexec/lib/src/process_creator_resource.cc --- a/libexec/lib/src/process_creator_resource.cc Tue Mar 21 21:49:00 2023 +0100 +++ b/libexec/lib/src/process_creator_resource.cc Wed Mar 22 00:26:17 2023 +0100 @@ -19,7 +19,7 @@ * Boston, MA 02110-1301, USA */ -#include +#include #include "opener_server.h" #include "process_creating.h" diff -r 99ce25bb6908 -r 48a46e7a32e7 libexec/rm/region_mapper.cc --- a/libexec/rm/region_mapper.cc Tue Mar 21 21:49:00 2023 +0100 +++ b/libexec/rm/region_mapper.cc Wed Mar 22 00:26:17 2023 +0100 @@ -28,7 +28,7 @@ #include #include #include -#include +#include diff -r 99ce25bb6908 -r 48a46e7a32e7 libfsserver/include/fsserver/directory_resource.h --- a/libfsserver/include/fsserver/directory_resource.h Tue Mar 21 21:49:00 2023 +0100 +++ b/libfsserver/include/fsserver/directory_resource.h Wed Mar 22 00:26:17 2023 +0100 @@ -23,7 +23,7 @@ #include #include -#include +#include diff -r 99ce25bb6908 -r 48a46e7a32e7 libfsserver/include/fsserver/filesystem_resource.h --- a/libfsserver/include/fsserver/filesystem_resource.h Tue Mar 21 21:49:00 2023 +0100 +++ b/libfsserver/include/fsserver/filesystem_resource.h Wed Mar 22 00:26:17 2023 +0100 @@ -22,8 +22,8 @@ #pragma once #include -#include #include +#include diff -r 99ce25bb6908 -r 48a46e7a32e7 libfsserver/include/fsserver/opener_resource.h --- a/libfsserver/include/fsserver/opener_resource.h Tue Mar 21 21:49:00 2023 +0100 +++ b/libfsserver/include/fsserver/opener_resource.h Wed Mar 22 00:26:17 2023 +0100 @@ -24,8 +24,8 @@ #include #include #include -#include #include +#include diff -r 99ce25bb6908 -r 48a46e7a32e7 libfsserver/include/fsserver/pager.h --- a/libfsserver/include/fsserver/pager.h Tue Mar 21 21:49:00 2023 +0100 +++ b/libfsserver/include/fsserver/pager.h Wed Mar 22 00:26:17 2023 +0100 @@ -24,7 +24,7 @@ #include #include -#include +#include diff -r 99ce25bb6908 -r 48a46e7a32e7 libfsserver/include/fsserver/pipe_opener_resource.h --- a/libfsserver/include/fsserver/pipe_opener_resource.h Tue Mar 21 21:49:00 2023 +0100 +++ b/libfsserver/include/fsserver/pipe_opener_resource.h Wed Mar 22 00:26:17 2023 +0100 @@ -24,7 +24,7 @@ #include #include #include -#include +#include diff -r 99ce25bb6908 -r 48a46e7a32e7 libfsserver/include/fsserver/provider.h --- a/libfsserver/include/fsserver/provider.h Tue Mar 21 21:49:00 2023 +0100 +++ b/libfsserver/include/fsserver/provider.h Wed Mar 22 00:26:17 2023 +0100 @@ -24,7 +24,7 @@ #include #include #include -#include +#include diff -r 99ce25bb6908 -r 48a46e7a32e7 libfsserver/include/fsserver/resource.h --- a/libfsserver/include/fsserver/resource.h Tue Mar 21 21:49:00 2023 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,54 +0,0 @@ -/* - * Common resource classes and functions. - * - * Copyright (C) 2018, 2019, 2020, 2022 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 generic class for an object potentially needing to be closed after use. */ - -class Resource -{ -public: - virtual ~Resource() - { - } - - /* Server details. */ - - virtual ipc_server_default_config_type config() = 0; - - virtual void *interface() = 0; - - /* Deallocation of resources. */ - - virtual void close() - { - } - - /* Activation. */ - - virtual void activate() - { - } -}; diff -r 99ce25bb6908 -r 48a46e7a32e7 libfsserver/include/fsserver/resource_server.h --- a/libfsserver/include/fsserver/resource_server.h Tue Mar 21 21:49:00 2023 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,85 +0,0 @@ -/* - * Common resource server functions. - * - * Copyright (C) 2018, 2019, 2020, 2021, 2023 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 -#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(bool finalisation = false); - - long start_in_thread(l4_cap_idx_t thread, bool finalisation = false); - - long start_thread(bool finalisation = true); - - long start_thread(l4_cap_idx_t *server, bool finalisation = true); -}; - - - -/* 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, - int finalisation); - -/* Server initiation. */ - -long resource_start_config(ipc_server_config_type *config, Resource *resource); - -/* Server finalisation. */ - -void resource_same_thread_finaliser(ipc_server_config_type *config); - -void resource_thread_finaliser(ipc_server_config_type *config); - -// vim: tabstop=2 expandtab shiftwidth=2 diff -r 99ce25bb6908 -r 48a46e7a32e7 libfsserver/include/fsserver/simple_pager.h --- a/libfsserver/include/fsserver/simple_pager.h Tue Mar 21 21:49:00 2023 +0100 +++ b/libfsserver/include/fsserver/simple_pager.h Wed Mar 22 00:26:17 2023 +0100 @@ -24,7 +24,7 @@ #include #include #include -#include +#include diff -r 99ce25bb6908 -r 48a46e7a32e7 libfsserver/lib/Makefile --- a/libfsserver/lib/Makefile Tue Mar 21 21:49:00 2023 +0100 +++ b/libfsserver/lib/Makefile Wed Mar 22 00:26:17 2023 +0100 @@ -61,7 +61,6 @@ generic/notification.cc \ generic/pager.cc \ generic/provider.cc \ - generic/resource_server.cc \ generic/simple_pager.cc \ mapping/access_map.cc \ mapping/copied_page_mapper.cc \ @@ -87,7 +86,8 @@ REQUIRES_LIBS = \ l4re_c-util libmem libipc libstdc++ libsystypes libfsclient \ - libext2fs libext2fs_blockserver libe2access libe2access_blockserver + libresource libext2fs libext2fs_blockserver libe2access \ + libe2access_blockserver PRIVATE_INCDIR = $(PKGDIR)/include $(PKGDIR)/include/fsserver \ $(IDL_BUILD_DIR) $(IDL_EXPORT_DIR) diff -r 99ce25bb6908 -r 48a46e7a32e7 libfsserver/lib/files/ext2_file_opener.cc --- a/libfsserver/lib/files/ext2_file_opener.cc Tue Mar 21 21:49:00 2023 +0100 +++ b/libfsserver/lib/files/ext2_file_opener.cc Wed Mar 22 00:26:17 2023 +0100 @@ -23,13 +23,13 @@ #include #include +#include #include #include #include "ext2_directory_accessor.h" #include "ext2_file_accessor.h" #include "ext2_file_opener.h" -#include "resource_server.h" diff -r 99ce25bb6908 -r 48a46e7a32e7 libfsserver/lib/files/ext2_filesystem.cc --- a/libfsserver/lib/files/ext2_filesystem.cc Tue Mar 21 21:49:00 2023 +0100 +++ b/libfsserver/lib/files/ext2_filesystem.cc Wed Mar 22 00:26:17 2023 +0100 @@ -20,9 +20,10 @@ * Boston, MA 02110-1301, USA */ +#include + #include "ext2_file_opener.h" #include "ext2_filesystem.h" -#include "resource_server.h" Ext2Filesystem::Ext2Filesystem(Pages *pages, ext2_filsys fs) : FilesystemResource(pages) diff -r 99ce25bb6908 -r 48a46e7a32e7 libfsserver/lib/files/file_pager.cc --- a/libfsserver/lib/files/file_pager.cc Tue Mar 21 21:49:00 2023 +0100 +++ b/libfsserver/lib/files/file_pager.cc Wed Mar 22 00:26:17 2023 +0100 @@ -20,12 +20,12 @@ */ #include /* file_region_flags */ +#include #include #include "copied_page_mapper.h" #include "file_pager.h" #include "mapped_file_object_server.h" -#include "resource_server.h" diff -r 99ce25bb6908 -r 48a46e7a32e7 libfsserver/lib/files/host_file_opener.cc --- a/libfsserver/lib/files/host_file_opener.cc Tue Mar 21 21:49:00 2023 +0100 +++ b/libfsserver/lib/files/host_file_opener.cc Wed Mar 22 00:26:17 2023 +0100 @@ -26,11 +26,11 @@ #include #include +#include #include "host_directory_accessor.h" #include "host_file_accessor.h" #include "host_file_opener.h" -#include "resource_server.h" diff -r 99ce25bb6908 -r 48a46e7a32e7 libfsserver/lib/files/opener_resource.cc --- a/libfsserver/lib/files/opener_resource.cc Tue Mar 21 21:49:00 2023 +0100 +++ b/libfsserver/lib/files/opener_resource.cc Wed Mar 22 00:26:17 2023 +0100 @@ -19,9 +19,10 @@ * Boston, MA 02110-1301, USA */ +#include + #include "opener_server.h" #include "opener_resource.h" -#include "resource_server.h" /* Support for providing access to files. */ diff -r 99ce25bb6908 -r 48a46e7a32e7 libfsserver/lib/generic/notification.cc --- a/libfsserver/lib/generic/notification.cc Tue Mar 21 21:49:00 2023 +0100 +++ b/libfsserver/lib/generic/notification.cc Wed Mar 22 00:26:17 2023 +0100 @@ -20,12 +20,11 @@ */ #include +#include #include "notification.h" #include "notifier_client.h" -#include "resource_server.h" - /* Initialise endpoints and flags for notifications. */ diff -r 99ce25bb6908 -r 48a46e7a32e7 libfsserver/lib/generic/resource_server.cc --- a/libfsserver/lib/generic/resource_server.cc Tue Mar 21 21:49:00 2023 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,189 +0,0 @@ -/* - * Resource server functionality. - * - * Copyright (C) 2018, 2019, 2020, 2021, 2022 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) _config, &_config->server); -} - -/* Start in the same thread indicating whether deletion notifications and - finalisation are to be used. */ - -long ResourceServer::start(bool finalisation) -{ - resource_init_config(_config, _resource); - _config->thread = pthread_l4_cap(pthread_self()); - - /* NOTE: On MIPS32, at least, in a payload started by libexec, the main thread - is not necessarily returned correctly. */ - - if (l4_is_invalid_cap(_config->thread)) - _config->thread = l4re_env()->main_thread; - - if (finalisation) - { - _config->finaliser = resource_same_thread_finaliser; - _config->notifications = 1; - } - - return resource_start_config(_config, _resource); -} - -/* Start serving a resource in an existing thread. */ - -long ResourceServer::start_in_thread(l4_cap_idx_t thread, bool finalisation) -{ - resource_init_config(_config, _resource); - resource_set_config_threaded(_config, thread, 1, finalisation); - - return resource_start_config(_config, _resource); -} - -/* Start serving a resource in a new thread. */ - -long ResourceServer::start_thread(bool finalisation) -{ - pthread_t thread; - pthread_attr_t attr; - long err; - - pthread_attr_init(&attr); - pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED); - - resource_init_config(_config, _resource); - - err = pthread_create(&thread, &attr, ipc_server_start_mainloop, _config); - if (err) - return err; - - resource_set_config_threaded(_config, pthread_l4_cap(thread), 1, finalisation); - - return resource_start_config(_config, _resource); -} - -/* A convenience method starting a thread and returning the server capability - employed via the given parameter. */ - -long ResourceServer::start_thread(l4_cap_idx_t *server, bool finalisation) -{ - long err = start_thread(finalisation); - - if (!err) - *server = _config->server; - - return err; -} - - - -/* Initialise a server configuration for a resource. */ - -void resource_init_config(ipc_server_config_type *config, Resource *resource) -{ - ipc_server_default_config_type default_config = resource->config(); - - config->handler_obj = resource->interface(); - config->finaliser_obj = resource; - config->expected_items = default_config.expected_items; - config->handler = default_config.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, - int finalisation) -{ - config->finaliser = resource_thread_finaliser; - config->config_thread = new_thread; - config->thread = thread; - config->notifications = finalisation; -} - -/* Activate a resource and start a server for it. */ - -long resource_start_config(ipc_server_config_type *config, Resource *resource) -{ - resource->activate(); - long err = ipc_server_start_config(config); - - /* Discard any server resources if starting it failed. */ - - if (err) - { - ipc_server_finalise_config(config); - ipc_server_discard_thread(config); - } - - return err; -} - - - -/* A finaliser for exposed resources in the same thread. */ - -void resource_same_thread_finaliser(ipc_server_config_type *config) -{ - Resource *resource = reinterpret_cast(config->finaliser_obj); - - /* Close but do not delete the resource since it is assumed that it is being - managed by the thread. */ - - resource->close(); - - /* Release the capabilities. */ - - ipc_server_finalise_config(config); - delete config; -} - -/* A finaliser for exposed resources in a different thread. */ - -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; -} - -// vim: tabstop=2 expandtab shiftwidth=2 diff -r 99ce25bb6908 -r 48a46e7a32e7 libfsserver/lib/pipes/pipe_opener_resource.cc --- a/libfsserver/lib/pipes/pipe_opener_resource.cc Tue Mar 21 21:49:00 2023 +0100 +++ b/libfsserver/lib/pipes/pipe_opener_resource.cc Wed Mar 22 00:26:17 2023 +0100 @@ -20,13 +20,13 @@ */ #include +#include #include #include "pipe_opener_resource.h" #include "pipe_opener_server.h" #include "pipe_pager.h" -#include "resource_server.h" diff -r 99ce25bb6908 -r 48a46e7a32e7 libnotifier/Control --- a/libnotifier/Control Tue Mar 21 21:49:00 2023 +0100 +++ b/libnotifier/Control Wed Mar 22 00:26:17 2023 +0100 @@ -1,3 +1,3 @@ -requires: libstdc++ libc libipc libfsserver +requires: libstdc++ libc libipc libresource provides: libnotifier maintainer: paul@boddie.org.uk diff -r 99ce25bb6908 -r 48a46e7a32e7 libnotifier/include/notifier/notifier.h --- a/libnotifier/include/notifier/notifier.h Tue Mar 21 21:49:00 2023 +0100 +++ b/libnotifier/include/notifier/notifier.h Wed Mar 22 00:26:17 2023 +0100 @@ -26,7 +26,7 @@ #include #include -#include +#include #include #include "notifier_interface.h" diff -r 99ce25bb6908 -r 48a46e7a32e7 libnotifier/lib/src/Makefile --- a/libnotifier/lib/src/Makefile Tue Mar 21 21:49:00 2023 +0100 +++ b/libnotifier/lib/src/Makefile Wed Mar 22 00:26:17 2023 +0100 @@ -34,7 +34,7 @@ $(SERVER_INTERFACES_SRC_CC) \ $(PLAIN_SRC_CC) -REQUIRES_LIBS = l4re_c-util libipc libstdc++ libsystypes libfsserver +REQUIRES_LIBS = l4re_c-util libipc libstdc++ libsystypes libresource PRIVATE_INCDIR = $(PKGDIR)/include/notifier $(IDL_BUILD_DIR) $(IDL_EXPORT_DIR) CONTRIB_INCDIR = libnotifier @@ -42,4 +42,4 @@ include $(L4DIR)/mk/lib.mk include $(IDL_MK_DIR)/interface_rules.mk -$(PLAIN_SRC_CC): $(CLIENT_INTERFACES_SRC_CC) +$(PLAIN_SRC_CC): $(CLIENT_INTERFACES_SRC_CC) $(SERVER_INTERFACES_SRC_CC) diff -r 99ce25bb6908 -r 48a46e7a32e7 libnotifier/lib/src/notifier.cc --- a/libnotifier/lib/src/notifier.cc Tue Mar 21 21:49:00 2023 +0100 +++ b/libnotifier/lib/src/notifier.cc Wed Mar 22 00:26:17 2023 +0100 @@ -22,9 +22,9 @@ #include #include -#include #include #include +#include #include "notification_client.h" #include "notifier.h" diff -r 99ce25bb6908 -r 48a46e7a32e7 libresource/Control --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/libresource/Control Wed Mar 22 00:26:17 2023 +0100 @@ -0,0 +1,3 @@ +requires: libstdc++ libc libipc +provides: libresource +maintainer: paul@boddie.org.uk diff -r 99ce25bb6908 -r 48a46e7a32e7 libresource/Makefile --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/libresource/Makefile Wed Mar 22 00:26:17 2023 +0100 @@ -0,0 +1,4 @@ +PKGDIR ?= . +L4DIR ?= $(PKGDIR)/../../.. + +include $(L4DIR)/mk/subdir.mk diff -r 99ce25bb6908 -r 48a46e7a32e7 libresource/include/Makefile --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/libresource/include/Makefile Wed Mar 22 00:26:17 2023 +0100 @@ -0,0 +1,7 @@ +PKGDIR ?= .. +L4DIR ?= $(PKGDIR)/../../.. + +PKGNAME = libresource +CONTRIB_HEADERS = 1 + +include $(L4DIR)/mk/include.mk diff -r 99ce25bb6908 -r 48a46e7a32e7 libresource/include/resource/resource.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/libresource/include/resource/resource.h Wed Mar 22 00:26:17 2023 +0100 @@ -0,0 +1,54 @@ +/* + * Common resource classes and functions. + * + * Copyright (C) 2018, 2019, 2020, 2022 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 generic class for an object potentially needing to be closed after use. */ + +class Resource +{ +public: + virtual ~Resource() + { + } + + /* Server details. */ + + virtual ipc_server_default_config_type config() = 0; + + virtual void *interface() = 0; + + /* Deallocation of resources. */ + + virtual void close() + { + } + + /* Activation. */ + + virtual void activate() + { + } +}; diff -r 99ce25bb6908 -r 48a46e7a32e7 libresource/include/resource/resource_server.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/libresource/include/resource/resource_server.h Wed Mar 22 00:26:17 2023 +0100 @@ -0,0 +1,85 @@ +/* + * Common resource server functions. + * + * Copyright (C) 2018, 2019, 2020, 2021, 2023 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 +#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(bool finalisation = false); + + long start_in_thread(l4_cap_idx_t thread, bool finalisation = false); + + long start_thread(bool finalisation = true); + + long start_thread(l4_cap_idx_t *server, bool finalisation = true); +}; + + + +/* 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, + int finalisation); + +/* Server initiation. */ + +long resource_start_config(ipc_server_config_type *config, Resource *resource); + +/* Server finalisation. */ + +void resource_same_thread_finaliser(ipc_server_config_type *config); + +void resource_thread_finaliser(ipc_server_config_type *config); + +// vim: tabstop=2 expandtab shiftwidth=2 diff -r 99ce25bb6908 -r 48a46e7a32e7 libresource/lib/Makefile --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/libresource/lib/Makefile Wed Mar 22 00:26:17 2023 +0100 @@ -0,0 +1,4 @@ +PKGDIR ?= .. +L4DIR ?= $(PKGDIR)/../../.. + +include $(L4DIR)/mk/subdir.mk diff -r 99ce25bb6908 -r 48a46e7a32e7 libresource/lib/src/Makefile --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/libresource/lib/src/Makefile Wed Mar 22 00:26:17 2023 +0100 @@ -0,0 +1,14 @@ +PKGDIR ?= ../.. +L4DIR ?= $(PKGDIR)/../../.. + +TARGET = libresource.so libresource.a +PC_FILENAME = libresource + +SRC_CC = resource_server.cc + +REQUIRES_LIBS = l4re_c-util libipc libstdc++ libsystypes + +PRIVATE_INCDIR = $(PKGDIR)/include/resource +CONTRIB_INCDIR = libresource + +include $(L4DIR)/mk/lib.mk diff -r 99ce25bb6908 -r 48a46e7a32e7 libresource/lib/src/resource_server.cc --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/libresource/lib/src/resource_server.cc Wed Mar 22 00:26:17 2023 +0100 @@ -0,0 +1,189 @@ +/* + * Resource server functionality. + * + * Copyright (C) 2018, 2019, 2020, 2021, 2022 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) _config, &_config->server); +} + +/* Start in the same thread indicating whether deletion notifications and + finalisation are to be used. */ + +long ResourceServer::start(bool finalisation) +{ + resource_init_config(_config, _resource); + _config->thread = pthread_l4_cap(pthread_self()); + + /* NOTE: On MIPS32, at least, in a payload started by libexec, the main thread + is not necessarily returned correctly. */ + + if (l4_is_invalid_cap(_config->thread)) + _config->thread = l4re_env()->main_thread; + + if (finalisation) + { + _config->finaliser = resource_same_thread_finaliser; + _config->notifications = 1; + } + + return resource_start_config(_config, _resource); +} + +/* Start serving a resource in an existing thread. */ + +long ResourceServer::start_in_thread(l4_cap_idx_t thread, bool finalisation) +{ + resource_init_config(_config, _resource); + resource_set_config_threaded(_config, thread, 1, finalisation); + + return resource_start_config(_config, _resource); +} + +/* Start serving a resource in a new thread. */ + +long ResourceServer::start_thread(bool finalisation) +{ + pthread_t thread; + pthread_attr_t attr; + long err; + + pthread_attr_init(&attr); + pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED); + + resource_init_config(_config, _resource); + + err = pthread_create(&thread, &attr, ipc_server_start_mainloop, _config); + if (err) + return err; + + resource_set_config_threaded(_config, pthread_l4_cap(thread), 1, finalisation); + + return resource_start_config(_config, _resource); +} + +/* A convenience method starting a thread and returning the server capability + employed via the given parameter. */ + +long ResourceServer::start_thread(l4_cap_idx_t *server, bool finalisation) +{ + long err = start_thread(finalisation); + + if (!err) + *server = _config->server; + + return err; +} + + + +/* Initialise a server configuration for a resource. */ + +void resource_init_config(ipc_server_config_type *config, Resource *resource) +{ + ipc_server_default_config_type default_config = resource->config(); + + config->handler_obj = resource->interface(); + config->finaliser_obj = resource; + config->expected_items = default_config.expected_items; + config->handler = default_config.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, + int finalisation) +{ + config->finaliser = resource_thread_finaliser; + config->config_thread = new_thread; + config->thread = thread; + config->notifications = finalisation; +} + +/* Activate a resource and start a server for it. */ + +long resource_start_config(ipc_server_config_type *config, Resource *resource) +{ + resource->activate(); + long err = ipc_server_start_config(config); + + /* Discard any server resources if starting it failed. */ + + if (err) + { + ipc_server_finalise_config(config); + ipc_server_discard_thread(config); + } + + return err; +} + + + +/* A finaliser for exposed resources in the same thread. */ + +void resource_same_thread_finaliser(ipc_server_config_type *config) +{ + Resource *resource = reinterpret_cast(config->finaliser_obj); + + /* Close but do not delete the resource since it is assumed that it is being + managed by the thread. */ + + resource->close(); + + /* Release the capabilities. */ + + ipc_server_finalise_config(config); + delete config; +} + +/* A finaliser for exposed resources in a different thread. */ + +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; +} + +// vim: tabstop=2 expandtab shiftwidth=2 diff -r 99ce25bb6908 -r 48a46e7a32e7 servers/Control --- a/servers/Control Tue Mar 21 21:49:00 2023 +0100 +++ b/servers/Control Wed Mar 22 00:26:17 2023 +0100 @@ -1,3 +1,3 @@ -requires: libstdc++ libc libipc libfsserver libmem libe2access_blockserver libexec +requires: libstdc++ libc libipc libfsserver libresource libmem libe2access_blockserver libexec provides: fsservers maintainer: paul@boddie.org.uk diff -r 99ce25bb6908 -r 48a46e7a32e7 servers/Makefile --- a/servers/Makefile Tue Mar 21 21:49:00 2023 +0100 +++ b/servers/Makefile Wed Mar 22 00:26:17 2023 +0100 @@ -23,6 +23,6 @@ SRC_CC_test_server = test_file_server.cc -REQUIRES_LIBS = l4re_c-util libmem libfsserver libipc libstdc++ libsystypes libe2access_blockserver libexec +REQUIRES_LIBS = l4re_c-util libmem libfsserver libresource libipc libstdc++ libsystypes libe2access_blockserver libexec include $(L4DIR)/mk/prog.mk diff -r 99ce25bb6908 -r 48a46e7a32e7 servers/block_file_server.cc --- a/servers/block_file_server.cc Tue Mar 21 21:49:00 2023 +0100 +++ b/servers/block_file_server.cc Wed Mar 22 00:26:17 2023 +0100 @@ -30,8 +30,8 @@ #include #include #include -#include #include +#include #include diff -r 99ce25bb6908 -r 48a46e7a32e7 servers/client_file_server.cc --- a/servers/client_file_server.cc Tue Mar 21 21:49:00 2023 +0100 +++ b/servers/client_file_server.cc Wed Mar 22 00:26:17 2023 +0100 @@ -31,8 +31,8 @@ #include #include #include -#include #include +#include #include diff -r 99ce25bb6908 -r 48a46e7a32e7 servers/ext2_file_server.cc --- a/servers/ext2_file_server.cc Tue Mar 21 21:49:00 2023 +0100 +++ b/servers/ext2_file_server.cc Wed Mar 22 00:26:17 2023 +0100 @@ -30,9 +30,9 @@ #include #include #include -#include #include #include +#include #include diff -r 99ce25bb6908 -r 48a46e7a32e7 servers/host_file_server.cc --- a/servers/host_file_server.cc Tue Mar 21 21:49:00 2023 +0100 +++ b/servers/host_file_server.cc Wed Mar 22 00:26:17 2023 +0100 @@ -30,8 +30,8 @@ #include #include #include -#include #include +#include #include diff -r 99ce25bb6908 -r 48a46e7a32e7 servers/pipe_server.cc --- a/servers/pipe_server.cc Tue Mar 21 21:49:00 2023 +0100 +++ b/servers/pipe_server.cc Wed Mar 22 00:26:17 2023 +0100 @@ -30,7 +30,7 @@ #include #include -#include +#include #include diff -r 99ce25bb6908 -r 48a46e7a32e7 servers/process_server.cc --- a/servers/process_server.cc Tue Mar 21 21:49:00 2023 +0100 +++ b/servers/process_server.cc Wed Mar 22 00:26:17 2023 +0100 @@ -29,7 +29,7 @@ #include #include -#include +#include #include #include diff -r 99ce25bb6908 -r 48a46e7a32e7 servers/test_file_server.cc --- a/servers/test_file_server.cc Tue Mar 21 21:49:00 2023 +0100 +++ b/servers/test_file_server.cc Wed Mar 22 00:26:17 2023 +0100 @@ -31,8 +31,8 @@ #include #include #include -#include #include +#include #include