L4Re/departure

Changeset

535:48a46e7a32e7
2023-03-22 Paul Boddie raw files shortlog changelog graph Introduced a separate library for the resource and resource server abstractions.
docs/wiki/Libraries (file) libexec/Control (file) libexec/include/exec/external_pager.h (file) libexec/include/exec/internal_pager.h (file) libexec/include/exec/process_creator_resource.h (file) libexec/lib/src/Makefile (file) libexec/lib/src/process_creating.cc (file) libexec/lib/src/process_creator_resource.cc (file) libexec/rm/region_mapper.cc (file) libfsserver/include/fsserver/directory_resource.h (file) libfsserver/include/fsserver/filesystem_resource.h (file) libfsserver/include/fsserver/opener_resource.h (file) libfsserver/include/fsserver/pager.h (file) libfsserver/include/fsserver/pipe_opener_resource.h (file) libfsserver/include/fsserver/provider.h (file) libfsserver/include/fsserver/resource.h libfsserver/include/fsserver/resource_server.h libfsserver/include/fsserver/simple_pager.h (file) libfsserver/lib/Makefile (file) libfsserver/lib/files/ext2_file_opener.cc (file) libfsserver/lib/files/ext2_filesystem.cc (file) libfsserver/lib/files/file_pager.cc (file) libfsserver/lib/files/host_file_opener.cc (file) libfsserver/lib/files/opener_resource.cc (file) libfsserver/lib/generic/notification.cc (file) libfsserver/lib/generic/resource_server.cc libfsserver/lib/pipes/pipe_opener_resource.cc (file) libnotifier/Control (file) libnotifier/include/notifier/notifier.h (file) libnotifier/lib/src/Makefile (file) libnotifier/lib/src/notifier.cc (file) libresource/Control (file) libresource/Makefile (file) libresource/include/Makefile (file) libresource/include/resource/resource.h (file) libresource/include/resource/resource_server.h (file) libresource/lib/Makefile (file) libresource/lib/src/Makefile (file) libresource/lib/src/resource_server.cc (file) servers/Control (file) servers/Makefile (file) servers/block_file_server.cc (file) servers/client_file_server.cc (file) servers/ext2_file_server.cc (file) servers/host_file_server.cc (file) servers/pipe_server.cc (file) servers/process_server.cc (file) servers/test_file_server.cc (file)
     1.1 --- a/docs/wiki/Libraries	Tue Mar 21 21:49:00 2023 +0100
     1.2 +++ b/docs/wiki/Libraries	Wed Mar 22 00:26:17 2023 +0100
     1.3 @@ -60,7 +60,6 @@
     1.4  || '''Header File'''     || '''Contents'''                              ||
     1.5  || `fsclient/client.h`   || Filesystem client functions                 ||
     1.6  || `fsclient/file.h`     || File access convenience functions and types ||
     1.7 -|| `fsclient/notifier.h` || File event notification support             ||
     1.8  
     1.9  == libfsserver ==
    1.10  
    1.11 @@ -68,52 +67,50 @@
    1.12  functionality for filesystem-related [[Components|components]].
    1.13  
    1.14  || '''Header File'''                      || '''Contents'''                                                                                                                   ||
    1.15 -|| `fsserver/access_map.h`                || An access map providing memory corresponding to file regions.                                                                    ||
    1.16 -|| `fsserver/accessor.h`                  || Generic accessor functionality.                                                                                                  ||
    1.17 -|| `fsserver/accountable.h`               || Accountable object support.                                                                                                      ||
    1.18 -|| `fsserver/block_file_accessor.h`       || A file accessor employing a rewritable memory area.                                                                              ||
    1.19 -|| `fsserver/block_file_opener.h`         || An opener for a file employing a rewritable memory area.                                                                         ||
    1.20 -|| `fsserver/copied_page_mapper.h`        || A page mapper providing copied memory pages or deferring to another page mapper to satisfy file accesses.                        ||
    1.21 -|| `fsserver/directory_accessor.h`        || An object providing access to a filesystem directory.                                                                            ||
    1.22 -|| `fsserver/directory_provider.h`        || An object providing a directory abstraction with notification facilities.                                                        ||
    1.23 -|| `fsserver/directory_resource.h`        || A resource offering support for directory operations.                                                                            ||
    1.24 -|| `fsserver/ext2_directory_accessor.h`   || An object for a directory provided by an Ext2-compatible filesystem.                                                             ||
    1.25 -|| `fsserver/ext2_file_accessor.h`        || A file accessor employing a file provided by an Ext2-compatible filesystem.                                                      ||
    1.26 -|| `fsserver/ext2_file_opener.h`          || An opener for a file provided by an Ext2-compatible filesystem.                                                                  ||
    1.27 -|| `fsserver/ext2_file_operations.h`      || File operations supporting an Ext2-compatible filesystem.                                                                        ||
    1.28 -|| `fsserver/ext2_filesystem.h`           || A resource supporting the creation of user-specific ext2 filesystem opener resources.                                            ||
    1.29 -|| `fsserver/file_opening.h`              || Generic support for opening files.                                                                                               ||
    1.30 -|| `fsserver/file_pager.h`                || File-specific pager functionality.                                                                                               ||
    1.31 -|| `fsserver/file_provider.h`             || An object encapsulating file resources.                                                                                          ||
    1.32 -|| `fsserver/filesystem_resource.h`       || A resource supporting the creation of user-specific opener resources.                                                            ||
    1.33 -|| `fsserver/generic_page_mapper.h`       || A generic page mapper providing memory pages to satisfy file accesses.                                                           ||
    1.34 -|| `fsserver/host_directory_accessor.h`   || An object for a "host" directory provided via the C library.                                                                     ||
    1.35 -|| `fsserver/host_file_accessor.h`        || A file accessor employing a "host" file provided via the C library.                                                              ||
    1.36 -|| `fsserver/host_file_opener.h`          || An opener for a "host" file provided via the C library.                                                                          ||
    1.37 -|| `fsserver/ipc.h`                       || Interprocess communication utilities.                                                                                            ||
    1.38 -|| `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.    ||
    1.39 -|| `fsserver/notification.h`              || Notification support.                                                                                                            ||
    1.40 -|| `fsserver/opener_context_resource.h`   || A context resource offering support for opening files.                                                                           ||
    1.41 -|| `fsserver/opener_resource.h`           || A resource offering support for creating contexts and opening files.                                                             ||
    1.42 -|| `fsserver/page_mapper.h`               || A page mapper providing memory pages to satisfy file accesses.                                                                   ||
    1.43 -|| `fsserver/page_owner.h`                || A page owner abstraction, indicating the current user of a memory region.                                                        ||
    1.44 -|| `fsserver/page_queue.h`                || A page queue abstraction.                                                                                                        ||
    1.45 -|| `fsserver/page_queue_partitioned.h`    || A page queue retaining two internal collections of memory pages.                                                                 ||
    1.46 -|| `fsserver/page_queue_shared.h`         || A page queue whose users take turns to access pages.                                                                             ||
    1.47 -|| `fsserver/pager.h`                     || Generic pager functionality.                                                                                                     ||
    1.48 -|| `fsserver/pages.h`                     || A page collection abstraction providing pages from a queue to users.                                                             ||
    1.49 -|| `fsserver/pipe_accessor.h`             || A pipe accessor merely resetting allocated memory for use.                                                                       ||
    1.50 -|| `fsserver/pipe_opener_resource.h`      || A pipe opener resource.                                                                                                          ||
    1.51 -|| `fsserver/pipe_pager.h`                || A pipe pager providing access to pipe content and navigation support.                                                            ||
    1.52 -|| `fsserver/pipe_paging.h`               || A pipe paging coordinator, permitting memory sharing pipe endpoints.                                                             ||
    1.53 -|| `fsserver/provider.h`                  || Filesystem object provider support.                                                                                              ||
    1.54 -|| `fsserver/provider_registry.h`         || A registry of filesystem object providers.                                                                                       ||
    1.55 -|| `fsserver/resource.h`                  || Common resource classes and functions.                                                                                           ||
    1.56 -|| `fsserver/resource_registry.h`         || A registry of filesystem object resources.                                                                                       ||
    1.57 -|| `fsserver/resource_server.h`           || Common resource server functions.                                                                                                ||
    1.58 -|| `fsserver/simple_pager.h`              || A simple pager exposing a single memory region.                                                                                  ||
    1.59 -|| `fsserver/test_file_accessor.h`        || A test accessor producing generated content.                                                                                     ||
    1.60 -|| `fsserver/test_file_opener.h`          || An opener for a test file containing generated content.                                                                          ||
    1.61 +|| `fsserver/access_map.h`                || An access map providing memory corresponding to file regions                                                                    ||
    1.62 +|| `fsserver/accessor.h`                  || Generic accessor functionality                                                                                                  ||
    1.63 +|| `fsserver/accountable.h`               || Accountable object support                                                                                                      ||
    1.64 +|| `fsserver/block_file_accessor.h`       || A file accessor employing a rewritable memory area                                                                              ||
    1.65 +|| `fsserver/block_file_opener.h`         || An opener for a file employing a rewritable memory area                                                                         ||
    1.66 +|| `fsserver/copied_page_mapper.h`        || A page mapper providing copied memory pages or deferring to another page mapper to satisfy file accesses                        ||
    1.67 +|| `fsserver/directory_accessor.h`        || An object providing access to a filesystem directory                                                                            ||
    1.68 +|| `fsserver/directory_provider.h`        || An object providing a directory abstraction with notification facilities                                                        ||
    1.69 +|| `fsserver/directory_resource.h`        || A resource offering support for directory operations                                                                            ||
    1.70 +|| `fsserver/ext2_directory_accessor.h`   || An object for a directory provided by an Ext2-compatible filesystem                                                             ||
    1.71 +|| `fsserver/ext2_file_accessor.h`        || A file accessor employing a file provided by an Ext2-compatible filesystem                                                      ||
    1.72 +|| `fsserver/ext2_file_opener.h`          || An opener for a file provided by an Ext2-compatible filesystem                                                                  ||
    1.73 +|| `fsserver/ext2_file_operations.h`      || File operations supporting an Ext2-compatible filesystem                                                                        ||
    1.74 +|| `fsserver/ext2_filesystem.h`           || A resource supporting the creation of user-specific ext2 filesystem opener resources                                            ||
    1.75 +|| `fsserver/file_opening.h`              || Generic support for opening files                                                                                               ||
    1.76 +|| `fsserver/file_pager.h`                || File-specific pager functionality                                                                                               ||
    1.77 +|| `fsserver/file_provider.h`             || An object encapsulating file resources                                                                                          ||
    1.78 +|| `fsserver/filesystem_resource.h`       || A resource supporting the creation of user-specific opener resources                                                            ||
    1.79 +|| `fsserver/generic_page_mapper.h`       || A generic page mapper providing memory pages to satisfy file accesses                                                           ||
    1.80 +|| `fsserver/host_directory_accessor.h`   || An object for a "host" directory provided via the C library                                                                     ||
    1.81 +|| `fsserver/host_file_accessor.h`        || A file accessor employing a "host" file provided via the C library                                                              ||
    1.82 +|| `fsserver/host_file_opener.h`          || An opener for a "host" file provided via the C library                                                                          ||
    1.83 +|| `fsserver/ipc.h`                       || Interprocess communication utilities                                                                                            ||
    1.84 +|| `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    ||
    1.85 +|| `fsserver/notification.h`              || Notification support                                                                                                            ||
    1.86 +|| `fsserver/opener_context_resource.h`   || A context resource offering support for opening files                                                                           ||
    1.87 +|| `fsserver/opener_resource.h`           || A resource offering support for creating contexts and opening files                                                             ||
    1.88 +|| `fsserver/page_mapper.h`               || A page mapper providing memory pages to satisfy file accesses                                                                   ||
    1.89 +|| `fsserver/page_owner.h`                || A page owner abstraction, indicating the current user of a memory region                                                        ||
    1.90 +|| `fsserver/page_queue.h`                || A page queue abstraction                                                                                                        ||
    1.91 +|| `fsserver/page_queue_partitioned.h`    || A page queue retaining two internal collections of memory pages                                                                 ||
    1.92 +|| `fsserver/page_queue_shared.h`         || A page queue whose users take turns to access pages                                                                             ||
    1.93 +|| `fsserver/pager.h`                     || Generic pager functionality                                                                                                     ||
    1.94 +|| `fsserver/pages.h`                     || A page collection abstraction providing pages from a queue to users                                                             ||
    1.95 +|| `fsserver/pipe_accessor.h`             || A pipe accessor merely resetting allocated memory for use                                                                       ||
    1.96 +|| `fsserver/pipe_opener_resource.h`      || A pipe opener resource                                                                                                          ||
    1.97 +|| `fsserver/pipe_pager.h`                || A pipe pager providing access to pipe content and navigation support                                                            ||
    1.98 +|| `fsserver/pipe_paging.h`               || A pipe paging coordinator, permitting memory sharing pipe endpoints                                                             ||
    1.99 +|| `fsserver/provider.h`                  || Filesystem object provider support                                                                                              ||
   1.100 +|| `fsserver/provider_registry.h`         || A registry of filesystem object providers                                                                                       ||
   1.101 +|| `fsserver/resource_registry.h`         || A registry of filesystem object resources                                                                                       ||
   1.102 +|| `fsserver/simple_pager.h`              || A simple pager exposing a single memory region                                                                                  ||
   1.103 +|| `fsserver/test_file_accessor.h`        || A test accessor producing generated content                                                                                     ||
   1.104 +|| `fsserver/test_file_opener.h`          || An opener for a test file containing generated content                                                                          ||
   1.105  
   1.106  == libipc ==
   1.107  
   1.108 @@ -148,6 +145,22 @@
   1.109  || `mem/send_flexpage.h`         || A "send" flexpage abstraction for communicating memory mappings        ||
   1.110  || `mem/types.h`                 || Miscellaneous types                                                    ||
   1.111  
   1.112 +== libnotifier ==
   1.113 +
   1.114 +A library providing notification support for programs.
   1.115 +
   1.116 +|| '''Header File'''     || '''Contents'''             ||
   1.117 +|| `notifier/notifier.h` || Event notification support ||
   1.118 +
   1.119 +== libresource ==
   1.120 +
   1.121 +A library providing support for resources, which are managed server
   1.122 +components.
   1.123 +
   1.124 +|| '''Header File'''             || '''Contents'''                        ||
   1.125 +|| `resource/resource.h`         || Common resource classes and functions ||
   1.126 +|| `resource/resource_server.h`  || Common resource server functions      ||
   1.127 +
   1.128  == libsystypes ==
   1.129  
   1.130  A repository of fundamental types used by the other libraries.
     2.1 --- a/libexec/Control	Tue Mar 21 21:49:00 2023 +0100
     2.2 +++ b/libexec/Control	Wed Mar 22 00:26:17 2023 +0100
     2.3 @@ -1,3 +1,3 @@
     2.4 -requires: libstdc++ libc libmem libipc libsystypes libfsclient libfsserver
     2.5 +requires: libstdc++ libc libmem libipc libsystypes libfsclient libfsserver libresource
     2.6  provides: libexec
     2.7  maintainer: paul@boddie.org.uk
     3.1 --- a/libexec/include/exec/external_pager.h	Tue Mar 21 21:49:00 2023 +0100
     3.2 +++ b/libexec/include/exec/external_pager.h	Wed Mar 22 00:26:17 2023 +0100
     3.3 @@ -27,7 +27,7 @@
     3.4  #include <exec/pager.h>
     3.5  #include <exec/segment.h>
     3.6  #include <fsserver/notification.h>
     3.7 -#include <fsserver/resource.h>
     3.8 +#include <resource/resource.h>
     3.9  
    3.10  #include "parent_pager_object_interface.h"
    3.11  
     4.1 --- a/libexec/include/exec/internal_pager.h	Tue Mar 21 21:49:00 2023 +0100
     4.2 +++ b/libexec/include/exec/internal_pager.h	Wed Mar 22 00:26:17 2023 +0100
     4.3 @@ -22,7 +22,7 @@
     4.4  #pragma once
     4.5  
     4.6  #include <exec/pager.h>
     4.7 -#include <fsserver/resource.h>
     4.8 +#include <resource/resource.h>
     4.9  
    4.10  #include "pager_object_interface.h"
    4.11  
     5.1 --- a/libexec/include/exec/process_creator_resource.h	Tue Mar 21 21:49:00 2023 +0100
     5.2 +++ b/libexec/include/exec/process_creator_resource.h	Wed Mar 22 00:26:17 2023 +0100
     5.3 @@ -22,7 +22,7 @@
     5.4  #pragma once
     5.5  
     5.6  #include <exec/process_creating.h>
     5.7 -#include <fsserver/resource.h>
     5.8 +#include <resource/resource.h>
     5.9  
    5.10  #include "opener_interface.h"
    5.11  
     6.1 --- a/libexec/lib/src/Makefile	Tue Mar 21 21:49:00 2023 +0100
     6.2 +++ b/libexec/lib/src/Makefile	Wed Mar 22 00:26:17 2023 +0100
     6.3 @@ -45,7 +45,7 @@
     6.4  				$(SERVER_INTERFACES_SRC_CC) \
     6.5  				$(PLAIN_SRC_CC)
     6.6  
     6.7 -REQUIRES_LIBS  	= l4re_c-util libmem libipc libstdc++ libsystypes libfsclient libfsserver
     6.8 +REQUIRES_LIBS  	= l4re_c-util libmem libipc libstdc++ libsystypes libfsclient libfsserver libresource
     6.9  
    6.10  PRIVATE_INCDIR	= $(PKGDIR)/include/exec $(IDL_BUILD_DIR) $(IDL_EXPORT_DIR)
    6.11  
     7.1 --- a/libexec/lib/src/process_creating.cc	Tue Mar 21 21:49:00 2023 +0100
     7.2 +++ b/libexec/lib/src/process_creating.cc	Wed Mar 22 00:26:17 2023 +0100
     7.3 @@ -23,9 +23,9 @@
     7.4  
     7.5  #include <exec/common.h>
     7.6  #include <fsclient/client.h>
     7.7 -#include <fsserver/resource_server.h>
     7.8  #include <ipc/cap_alloc.h>
     7.9  #include <ipc/map.h>
    7.10 +#include <resource/resource_server.h>
    7.11  #include <systypes/env.h>
    7.12  #include <systypes/fcntl.h>
    7.13  
     8.1 --- a/libexec/lib/src/process_creator_resource.cc	Tue Mar 21 21:49:00 2023 +0100
     8.2 +++ b/libexec/lib/src/process_creator_resource.cc	Wed Mar 22 00:26:17 2023 +0100
     8.3 @@ -19,7 +19,7 @@
     8.4   * Boston, MA  02110-1301, USA
     8.5   */
     8.6  
     8.7 -#include <fsserver/resource_server.h>
     8.8 +#include <resource/resource_server.h>
     8.9  
    8.10  #include "opener_server.h"
    8.11  #include "process_creating.h"
     9.1 --- a/libexec/rm/region_mapper.cc	Tue Mar 21 21:49:00 2023 +0100
     9.2 +++ b/libexec/rm/region_mapper.cc	Wed Mar 22 00:26:17 2023 +0100
     9.3 @@ -28,7 +28,7 @@
     9.4  #include <exec/common.h>
     9.5  #include <exec/internal_pager.h>
     9.6  #include <exec/stack.h>
     9.7 -#include <fsserver/resource_server.h>
     9.8 +#include <resource/resource_server.h>
     9.9  
    9.10  
    9.11  
    10.1 --- a/libfsserver/include/fsserver/directory_resource.h	Tue Mar 21 21:49:00 2023 +0100
    10.2 +++ b/libfsserver/include/fsserver/directory_resource.h	Wed Mar 22 00:26:17 2023 +0100
    10.3 @@ -23,7 +23,7 @@
    10.4  
    10.5  #include <fsserver/directory_object_interface.h>
    10.6  #include <fsserver/directory_provider.h>
    10.7 -#include <fsserver/resource.h>
    10.8 +#include <resource/resource.h>
    10.9  
   10.10  
   10.11  
    11.1 --- a/libfsserver/include/fsserver/filesystem_resource.h	Tue Mar 21 21:49:00 2023 +0100
    11.2 +++ b/libfsserver/include/fsserver/filesystem_resource.h	Wed Mar 22 00:26:17 2023 +0100
    11.3 @@ -22,8 +22,8 @@
    11.4  #pragma once
    11.5  
    11.6  #include <fsserver/filesystem_object_interface.h>
    11.7 -#include <fsserver/resource.h>
    11.8  #include <fsserver/resource_registry.h>
    11.9 +#include <resource/resource.h>
   11.10  
   11.11  
   11.12  
    12.1 --- a/libfsserver/include/fsserver/opener_resource.h	Tue Mar 21 21:49:00 2023 +0100
    12.2 +++ b/libfsserver/include/fsserver/opener_resource.h	Wed Mar 22 00:26:17 2023 +0100
    12.3 @@ -24,8 +24,8 @@
    12.4  #include <fsserver/file_opening.h>
    12.5  #include <fsserver/opener_context_resource.h>
    12.6  #include <fsserver/opener_interface.h>
    12.7 -#include <fsserver/resource.h>
    12.8  #include <fsserver/resource_registry.h>
    12.9 +#include <resource/resource.h>
   12.10  
   12.11  
   12.12  
    13.1 --- a/libfsserver/include/fsserver/pager.h	Tue Mar 21 21:49:00 2023 +0100
    13.2 +++ b/libfsserver/include/fsserver/pager.h	Wed Mar 22 00:26:17 2023 +0100
    13.3 @@ -24,7 +24,7 @@
    13.4  #include <systypes/base.h>
    13.5  
    13.6  #include <fsserver/generic_page_mapper.h>
    13.7 -#include <fsserver/resource.h>
    13.8 +#include <resource/resource.h>
    13.9  
   13.10  
   13.11  
    14.1 --- a/libfsserver/include/fsserver/pipe_opener_resource.h	Tue Mar 21 21:49:00 2023 +0100
    14.2 +++ b/libfsserver/include/fsserver/pipe_opener_resource.h	Wed Mar 22 00:26:17 2023 +0100
    14.3 @@ -24,7 +24,7 @@
    14.4  #include <mem/memory.h>
    14.5  #include <fsserver/pipe_opener_interface.h>
    14.6  #include <fsserver/pipe_paging.h>
    14.7 -#include <fsserver/resource.h>
    14.8 +#include <resource/resource.h>
    14.9  
   14.10  
   14.11  
    15.1 --- a/libfsserver/include/fsserver/provider.h	Tue Mar 21 21:49:00 2023 +0100
    15.2 +++ b/libfsserver/include/fsserver/provider.h	Wed Mar 22 00:26:17 2023 +0100
    15.3 @@ -24,7 +24,7 @@
    15.4  #include <fsserver/accountable.h>
    15.5  #include <fsserver/notification.h>
    15.6  #include <fsserver/provider_registry.h>
    15.7 -#include <fsserver/resource.h>
    15.8 +#include <resource/resource.h>
    15.9  
   15.10  
   15.11  
    16.1 --- a/libfsserver/include/fsserver/resource.h	Tue Mar 21 21:49:00 2023 +0100
    16.2 +++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
    16.3 @@ -1,54 +0,0 @@
    16.4 -/*
    16.5 - * Common resource classes and functions.
    16.6 - *
    16.7 - * Copyright (C) 2018, 2019, 2020, 2022 Paul Boddie <paul@boddie.org.uk>
    16.8 - *
    16.9 - * This program is free software; you can redistribute it and/or
   16.10 - * modify it under the terms of the GNU General Public License as
   16.11 - * published by the Free Software Foundation; either version 2 of
   16.12 - * the License, or (at your option) any later version.
   16.13 - *
   16.14 - * This program is distributed in the hope that it will be useful,
   16.15 - * but WITHOUT ANY WARRANTY; without even the implied warranty of
   16.16 - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   16.17 - * GNU General Public License for more details.
   16.18 - *
   16.19 - * You should have received a copy of the GNU General Public License
   16.20 - * along with this program; if not, write to the Free Software
   16.21 - * Foundation, Inc., 51 Franklin Street, Fifth Floor,
   16.22 - * Boston, MA  02110-1301, USA
   16.23 - */
   16.24 -
   16.25 -#pragma once
   16.26 -
   16.27 -#include <ipc/server.h>
   16.28 -
   16.29 -
   16.30 -
   16.31 -/* A generic class for an object potentially needing to be closed after use. */
   16.32 -
   16.33 -class Resource
   16.34 -{
   16.35 -public:
   16.36 -  virtual ~Resource()
   16.37 -  {
   16.38 -  }
   16.39 -
   16.40 -  /* Server details. */
   16.41 -
   16.42 -  virtual ipc_server_default_config_type config() = 0;
   16.43 -
   16.44 -  virtual void *interface() = 0;
   16.45 -
   16.46 -  /* Deallocation of resources. */
   16.47 -
   16.48 -  virtual void close()
   16.49 -  {
   16.50 -  }
   16.51 -
   16.52 -  /* Activation. */
   16.53 -
   16.54 -  virtual void activate()
   16.55 -  {
   16.56 -  }
   16.57 -};
    17.1 --- a/libfsserver/include/fsserver/resource_server.h	Tue Mar 21 21:49:00 2023 +0100
    17.2 +++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
    17.3 @@ -1,85 +0,0 @@
    17.4 -/*
    17.5 - * Common resource server functions.
    17.6 - *
    17.7 - * Copyright (C) 2018, 2019, 2020, 2021, 2023 Paul Boddie <paul@boddie.org.uk>
    17.8 - *
    17.9 - * This program is free software; you can redistribute it and/or
   17.10 - * modify it under the terms of the GNU General Public License as
   17.11 - * published by the Free Software Foundation; either version 2 of
   17.12 - * the License, or (at your option) any later version.
   17.13 - *
   17.14 - * This program is distributed in the hope that it will be useful,
   17.15 - * but WITHOUT ANY WARRANTY; without even the implied warranty of
   17.16 - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   17.17 - * GNU General Public License for more details.
   17.18 - *
   17.19 - * You should have received a copy of the GNU General Public License
   17.20 - * along with this program; if not, write to the Free Software
   17.21 - * Foundation, Inc., 51 Franklin Street, Fifth Floor,
   17.22 - * Boston, MA  02110-1301, USA
   17.23 - */
   17.24 -
   17.25 -#pragma once
   17.26 -
   17.27 -#include <fsserver/resource.h>
   17.28 -#include <ipc/server.h>
   17.29 -
   17.30 -
   17.31 -
   17.32 -/* Convenience abstraction for blocking servers. */
   17.33 -
   17.34 -class ResourceServer
   17.35 -{
   17.36 -protected:
   17.37 -  Resource *_resource;
   17.38 -  ipc_server_config_type *_config;
   17.39 -
   17.40 -public:
   17.41 -  explicit ResourceServer(Resource *resource)
   17.42 -  : _resource(resource)
   17.43 -  {
   17.44 -    _config = new ipc_server_config_type;
   17.45 -    ipc_server_init_config(_config);
   17.46 -  }
   17.47 -
   17.48 -  /* Access to configuration. */
   17.49 -
   17.50 -  ipc_server_config_type *config()
   17.51 -  { return _config; }
   17.52 -
   17.53 -  /* Server IPC gate allocation. */
   17.54 -
   17.55 -  long bind(const char *name);
   17.56 -
   17.57 -  /* Server initiation. */
   17.58 -
   17.59 -  long start(bool finalisation = false);
   17.60 -
   17.61 -  long start_in_thread(l4_cap_idx_t thread, bool finalisation = false);
   17.62 -
   17.63 -  long start_thread(bool finalisation = true);
   17.64 -
   17.65 -  long start_thread(l4_cap_idx_t *server, bool finalisation = true);
   17.66 -};
   17.67 -
   17.68 -
   17.69 -
   17.70 -/* Server initialisation. */
   17.71 -
   17.72 -void resource_init_config(ipc_server_config_type *config, Resource *resource);
   17.73 -
   17.74 -void resource_set_config_threaded(ipc_server_config_type *config,
   17.75 -                                  l4_cap_idx_t thread, int new_thread,
   17.76 -                                  int finalisation);
   17.77 -
   17.78 -/* Server initiation. */
   17.79 -
   17.80 -long resource_start_config(ipc_server_config_type *config, Resource *resource);
   17.81 -
   17.82 -/* Server finalisation. */
   17.83 -
   17.84 -void resource_same_thread_finaliser(ipc_server_config_type *config);
   17.85 -
   17.86 -void resource_thread_finaliser(ipc_server_config_type *config);
   17.87 -
   17.88 -// vim: tabstop=2 expandtab shiftwidth=2
    18.1 --- a/libfsserver/include/fsserver/simple_pager.h	Tue Mar 21 21:49:00 2023 +0100
    18.2 +++ b/libfsserver/include/fsserver/simple_pager.h	Wed Mar 22 00:26:17 2023 +0100
    18.3 @@ -24,7 +24,7 @@
    18.4  #include <fsserver/dataspace_interface.h>
    18.5  #include <mem/flexpage.h>
    18.6  #include <mem/memory.h>
    18.7 -#include <fsserver/resource.h>
    18.8 +#include <resource/resource.h>
    18.9  
   18.10  
   18.11  
    19.1 --- a/libfsserver/lib/Makefile	Tue Mar 21 21:49:00 2023 +0100
    19.2 +++ b/libfsserver/lib/Makefile	Wed Mar 22 00:26:17 2023 +0100
    19.3 @@ -61,7 +61,6 @@
    19.4  					generic/notification.cc \
    19.5  					generic/pager.cc \
    19.6  					generic/provider.cc \
    19.7 -					generic/resource_server.cc \
    19.8  					generic/simple_pager.cc \
    19.9  					mapping/access_map.cc \
   19.10  					mapping/copied_page_mapper.cc \
   19.11 @@ -87,7 +86,8 @@
   19.12  
   19.13  REQUIRES_LIBS	= \
   19.14  		l4re_c-util libmem libipc libstdc++ libsystypes libfsclient \
   19.15 -		libext2fs libext2fs_blockserver libe2access libe2access_blockserver
   19.16 +		libresource libext2fs libext2fs_blockserver libe2access \
   19.17 +		libe2access_blockserver
   19.18  
   19.19  PRIVATE_INCDIR	= $(PKGDIR)/include $(PKGDIR)/include/fsserver \
   19.20  		  $(IDL_BUILD_DIR) $(IDL_EXPORT_DIR)
    20.1 --- a/libfsserver/lib/files/ext2_file_opener.cc	Tue Mar 21 21:49:00 2023 +0100
    20.2 +++ b/libfsserver/lib/files/ext2_file_opener.cc	Wed Mar 22 00:26:17 2023 +0100
    20.3 @@ -23,13 +23,13 @@
    20.4  
    20.5  #include <e2access/path.h>
    20.6  #include <fsclient/client.h>
    20.7 +#include <resource/resource_server.h>
    20.8  #include <systypes/fcntl.h>
    20.9  #include <systypes/stat.h>
   20.10  
   20.11  #include "ext2_directory_accessor.h"
   20.12  #include "ext2_file_accessor.h"
   20.13  #include "ext2_file_opener.h"
   20.14 -#include "resource_server.h"
   20.15  
   20.16  
   20.17  
    21.1 --- a/libfsserver/lib/files/ext2_filesystem.cc	Tue Mar 21 21:49:00 2023 +0100
    21.2 +++ b/libfsserver/lib/files/ext2_filesystem.cc	Wed Mar 22 00:26:17 2023 +0100
    21.3 @@ -20,9 +20,10 @@
    21.4   * Boston, MA  02110-1301, USA
    21.5   */
    21.6  
    21.7 +#include <resource/resource_server.h>
    21.8 +
    21.9  #include "ext2_file_opener.h"
   21.10  #include "ext2_filesystem.h"
   21.11 -#include "resource_server.h"
   21.12  
   21.13  Ext2Filesystem::Ext2Filesystem(Pages *pages, ext2_filsys fs)
   21.14  : FilesystemResource(pages)
    22.1 --- a/libfsserver/lib/files/file_pager.cc	Tue Mar 21 21:49:00 2023 +0100
    22.2 +++ b/libfsserver/lib/files/file_pager.cc	Wed Mar 22 00:26:17 2023 +0100
    22.3 @@ -20,12 +20,12 @@
    22.4   */
    22.5  
    22.6  #include <fsclient/file.h>  /* file_region_flags */
    22.7 +#include <resource/resource_server.h>
    22.8  #include <systypes/fcntl.h>
    22.9  
   22.10  #include "copied_page_mapper.h"
   22.11  #include "file_pager.h"
   22.12  #include "mapped_file_object_server.h"
   22.13 -#include "resource_server.h"
   22.14  
   22.15  
   22.16  
    23.1 --- a/libfsserver/lib/files/host_file_opener.cc	Tue Mar 21 21:49:00 2023 +0100
    23.2 +++ b/libfsserver/lib/files/host_file_opener.cc	Wed Mar 22 00:26:17 2023 +0100
    23.3 @@ -26,11 +26,11 @@
    23.4  #include <unistd.h>
    23.5  
    23.6  #include <fsclient/client.h>
    23.7 +#include <resource/resource_server.h>
    23.8  
    23.9  #include "host_directory_accessor.h"
   23.10  #include "host_file_accessor.h"
   23.11  #include "host_file_opener.h"
   23.12 -#include "resource_server.h"
   23.13  
   23.14  
   23.15  
    24.1 --- a/libfsserver/lib/files/opener_resource.cc	Tue Mar 21 21:49:00 2023 +0100
    24.2 +++ b/libfsserver/lib/files/opener_resource.cc	Wed Mar 22 00:26:17 2023 +0100
    24.3 @@ -19,9 +19,10 @@
    24.4   * Boston, MA  02110-1301, USA
    24.5   */
    24.6  
    24.7 +#include <resource/resource_server.h>
    24.8 +
    24.9  #include "opener_server.h"
   24.10  #include "opener_resource.h"
   24.11 -#include "resource_server.h"
   24.12  
   24.13  /* Support for providing access to files. */
   24.14  
    25.1 --- a/libfsserver/lib/generic/notification.cc	Tue Mar 21 21:49:00 2023 +0100
    25.2 +++ b/libfsserver/lib/generic/notification.cc	Wed Mar 22 00:26:17 2023 +0100
    25.3 @@ -20,12 +20,11 @@
    25.4   */
    25.5  
    25.6  #include <ipc/cap_alloc.h>
    25.7 +#include <resource/resource_server.h>
    25.8  
    25.9  #include "notification.h"
   25.10  #include "notifier_client.h"
   25.11  
   25.12 -#include "resource_server.h"
   25.13 -
   25.14  
   25.15  
   25.16  /* Initialise endpoints and flags for notifications. */
    26.1 --- a/libfsserver/lib/generic/resource_server.cc	Tue Mar 21 21:49:00 2023 +0100
    26.2 +++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
    26.3 @@ -1,189 +0,0 @@
    26.4 -/*
    26.5 - * Resource server functionality.
    26.6 - *
    26.7 - * Copyright (C) 2018, 2019, 2020, 2021, 2022 Paul Boddie <paul@boddie.org.uk>
    26.8 - *
    26.9 - * This program is free software; you can redistribute it and/or
   26.10 - * modify it under the terms of the GNU General Public License as
   26.11 - * published by the Free Software Foundation; either version 2 of
   26.12 - * the License, or (at your option) any later version.
   26.13 - *
   26.14 - * This program is distributed in the hope that it will be useful,
   26.15 - * but WITHOUT ANY WARRANTY; without even the implied warranty of
   26.16 - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   26.17 - * GNU General Public License for more details.
   26.18 - *
   26.19 - * You should have received a copy of the GNU General Public License
   26.20 - * along with this program; if not, write to the Free Software
   26.21 - * Foundation, Inc., 51 Franklin Street, Fifth Floor,
   26.22 - * Boston, MA  02110-1301, USA
   26.23 - */
   26.24 -
   26.25 -#include <l4/re/env.h>
   26.26 -#include <l4/sys/types.h>
   26.27 -
   26.28 -#include <pthread-l4.h>
   26.29 -#include <pthread.h>
   26.30 -
   26.31 -#include "resource_server.h"
   26.32 -
   26.33 -
   26.34 -
   26.35 -/* Convenience server methods. */
   26.36 -
   26.37 -/* Bind to a named IPC gate capability. */
   26.38 -
   26.39 -long ResourceServer::bind(const char *name)
   26.40 -{
   26.41 -  return ipc_server_bind(name, (l4_umword_t) _config, &_config->server);
   26.42 -}
   26.43 -
   26.44 -/* Start in the same thread indicating whether deletion notifications and
   26.45 -   finalisation are to be used. */
   26.46 -
   26.47 -long ResourceServer::start(bool finalisation)
   26.48 -{
   26.49 -  resource_init_config(_config, _resource);
   26.50 -  _config->thread = pthread_l4_cap(pthread_self());
   26.51 -
   26.52 -  /* NOTE: On MIPS32, at least, in a payload started by libexec, the main thread
   26.53 -           is not necessarily returned correctly. */
   26.54 -
   26.55 -  if (l4_is_invalid_cap(_config->thread))
   26.56 -    _config->thread = l4re_env()->main_thread;
   26.57 -
   26.58 -  if (finalisation)
   26.59 -  {
   26.60 -    _config->finaliser = resource_same_thread_finaliser;
   26.61 -    _config->notifications = 1;
   26.62 -  }
   26.63 -
   26.64 -  return resource_start_config(_config, _resource);
   26.65 -}
   26.66 -
   26.67 -/* Start serving a resource in an existing thread. */
   26.68 -
   26.69 -long ResourceServer::start_in_thread(l4_cap_idx_t thread, bool finalisation)
   26.70 -{
   26.71 -  resource_init_config(_config, _resource);
   26.72 -  resource_set_config_threaded(_config, thread, 1, finalisation);
   26.73 -
   26.74 -  return resource_start_config(_config, _resource);
   26.75 -}
   26.76 -
   26.77 -/* Start serving a resource in a new thread. */
   26.78 -
   26.79 -long ResourceServer::start_thread(bool finalisation)
   26.80 -{
   26.81 -  pthread_t thread;
   26.82 -  pthread_attr_t attr;
   26.83 -  long err;
   26.84 -
   26.85 -  pthread_attr_init(&attr);
   26.86 -  pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
   26.87 -
   26.88 -  resource_init_config(_config, _resource);
   26.89 -
   26.90 -  err = pthread_create(&thread, &attr, ipc_server_start_mainloop, _config);
   26.91 -  if (err)
   26.92 -    return err;
   26.93 -
   26.94 -  resource_set_config_threaded(_config, pthread_l4_cap(thread), 1, finalisation);
   26.95 -
   26.96 -  return resource_start_config(_config, _resource);
   26.97 -}
   26.98 -
   26.99 -/* A convenience method starting a thread and returning the server capability
  26.100 -   employed via the given parameter. */
  26.101 -
  26.102 -long ResourceServer::start_thread(l4_cap_idx_t *server, bool finalisation)
  26.103 -{
  26.104 -  long err = start_thread(finalisation);
  26.105 -
  26.106 -  if (!err)
  26.107 -    *server = _config->server;
  26.108 -
  26.109 -  return err;
  26.110 -}
  26.111 -
  26.112 -
  26.113 -
  26.114 -/* Initialise a server configuration for a resource. */
  26.115 -
  26.116 -void resource_init_config(ipc_server_config_type *config, Resource *resource)
  26.117 -{
  26.118 -  ipc_server_default_config_type default_config = resource->config();
  26.119 -
  26.120 -  config->handler_obj = resource->interface();
  26.121 -  config->finaliser_obj = resource;
  26.122 -  config->expected_items = default_config.expected_items;
  26.123 -  config->handler = default_config.handler;
  26.124 -}
  26.125 -
  26.126 -/* Set a configuration to be threaded. */
  26.127 -
  26.128 -void resource_set_config_threaded(ipc_server_config_type *config,
  26.129 -                                  l4_cap_idx_t thread, int new_thread,
  26.130 -                                  int finalisation)
  26.131 -{
  26.132 -  config->finaliser = resource_thread_finaliser;
  26.133 -  config->config_thread = new_thread;
  26.134 -  config->thread = thread;
  26.135 -  config->notifications = finalisation;
  26.136 -}
  26.137 -
  26.138 -/* Activate a resource and start a server for it. */
  26.139 -
  26.140 -long resource_start_config(ipc_server_config_type *config, Resource *resource)
  26.141 -{
  26.142 -  resource->activate();
  26.143 -  long err = ipc_server_start_config(config);
  26.144 -
  26.145 -  /* Discard any server resources if starting it failed. */
  26.146 -
  26.147 -  if (err)
  26.148 -  {
  26.149 -    ipc_server_finalise_config(config);
  26.150 -    ipc_server_discard_thread(config);
  26.151 -  }
  26.152 -
  26.153 -  return err;
  26.154 -}
  26.155 -
  26.156 -
  26.157 -
  26.158 -/* A finaliser for exposed resources in the same thread. */
  26.159 -
  26.160 -void resource_same_thread_finaliser(ipc_server_config_type *config)
  26.161 -{
  26.162 -  Resource *resource = reinterpret_cast<Resource *>(config->finaliser_obj);
  26.163 -
  26.164 -  /* Close but do not delete the resource since it is assumed that it is being
  26.165 -     managed by the thread. */
  26.166 -
  26.167 -  resource->close();
  26.168 -
  26.169 -  /* Release the capabilities. */
  26.170 -
  26.171 -  ipc_server_finalise_config(config);
  26.172 -  delete config;
  26.173 -}
  26.174 -
  26.175 -/* A finaliser for exposed resources in a different thread. */
  26.176 -
  26.177 -void resource_thread_finaliser(ipc_server_config_type *config)
  26.178 -{
  26.179 -  Resource *resource = reinterpret_cast<Resource *>(config->finaliser_obj);
  26.180 -
  26.181 -  /* Close and delete the resource. */
  26.182 -
  26.183 -  resource->close();
  26.184 -  delete resource;
  26.185 -
  26.186 -  /* Release the capabilities. */
  26.187 -
  26.188 -  ipc_server_finalise_config(config);
  26.189 -  delete config;
  26.190 -}
  26.191 -
  26.192 -// vim: tabstop=2 expandtab shiftwidth=2
    27.1 --- a/libfsserver/lib/pipes/pipe_opener_resource.cc	Tue Mar 21 21:49:00 2023 +0100
    27.2 +++ b/libfsserver/lib/pipes/pipe_opener_resource.cc	Wed Mar 22 00:26:17 2023 +0100
    27.3 @@ -20,13 +20,13 @@
    27.4   */
    27.5  
    27.6  #include <ipc/cap_alloc.h>
    27.7 +#include <resource/resource_server.h>
    27.8  
    27.9  #include <l4/cxx/exceptions>
   27.10  
   27.11  #include "pipe_opener_resource.h"
   27.12  #include "pipe_opener_server.h"
   27.13  #include "pipe_pager.h"
   27.14 -#include "resource_server.h"
   27.15  
   27.16  
   27.17  
    28.1 --- a/libnotifier/Control	Tue Mar 21 21:49:00 2023 +0100
    28.2 +++ b/libnotifier/Control	Wed Mar 22 00:26:17 2023 +0100
    28.3 @@ -1,3 +1,3 @@
    28.4 -requires: libstdc++ libc libipc libfsserver
    28.5 +requires: libstdc++ libc libipc libresource
    28.6  provides: libnotifier
    28.7  maintainer: paul@boddie.org.uk
    29.1 --- a/libnotifier/include/notifier/notifier.h	Tue Mar 21 21:49:00 2023 +0100
    29.2 +++ b/libnotifier/include/notifier/notifier.h	Wed Mar 22 00:26:17 2023 +0100
    29.3 @@ -26,7 +26,7 @@
    29.4  #include <map>
    29.5  #include <mutex>
    29.6  
    29.7 -#include <fsserver/resource.h>
    29.8 +#include <resource/resource.h>
    29.9  #include <systypes/base.h>
   29.10  
   29.11  #include "notifier_interface.h"
    30.1 --- a/libnotifier/lib/src/Makefile	Tue Mar 21 21:49:00 2023 +0100
    30.2 +++ b/libnotifier/lib/src/Makefile	Wed Mar 22 00:26:17 2023 +0100
    30.3 @@ -34,7 +34,7 @@
    30.4  				$(SERVER_INTERFACES_SRC_CC) \
    30.5  				$(PLAIN_SRC_CC)
    30.6  
    30.7 -REQUIRES_LIBS	= l4re_c-util libipc libstdc++ libsystypes libfsserver
    30.8 +REQUIRES_LIBS	= l4re_c-util libipc libstdc++ libsystypes libresource
    30.9  
   30.10  PRIVATE_INCDIR	= $(PKGDIR)/include/notifier $(IDL_BUILD_DIR) $(IDL_EXPORT_DIR)
   30.11  CONTRIB_INCDIR	= libnotifier
   30.12 @@ -42,4 +42,4 @@
   30.13  include $(L4DIR)/mk/lib.mk
   30.14  include $(IDL_MK_DIR)/interface_rules.mk
   30.15  
   30.16 -$(PLAIN_SRC_CC): $(CLIENT_INTERFACES_SRC_CC)
   30.17 +$(PLAIN_SRC_CC): $(CLIENT_INTERFACES_SRC_CC) $(SERVER_INTERFACES_SRC_CC)
    31.1 --- a/libnotifier/lib/src/notifier.cc	Tue Mar 21 21:49:00 2023 +0100
    31.2 +++ b/libnotifier/lib/src/notifier.cc	Wed Mar 22 00:26:17 2023 +0100
    31.3 @@ -22,9 +22,9 @@
    31.4  #include <map>
    31.5  #include <mutex>
    31.6  
    31.7 -#include <fsserver/resource_server.h>
    31.8  #include <ipc/cap_alloc.h>
    31.9  #include <ipc/server.h>
   31.10 +#include <resource/resource_server.h>
   31.11  
   31.12  #include "notification_client.h"
   31.13  #include "notifier.h"
    32.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    32.2 +++ b/libresource/Control	Wed Mar 22 00:26:17 2023 +0100
    32.3 @@ -0,0 +1,3 @@
    32.4 +requires: libstdc++ libc libipc
    32.5 +provides: libresource
    32.6 +maintainer: paul@boddie.org.uk
    33.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    33.2 +++ b/libresource/Makefile	Wed Mar 22 00:26:17 2023 +0100
    33.3 @@ -0,0 +1,4 @@
    33.4 +PKGDIR	?= .
    33.5 +L4DIR	?= $(PKGDIR)/../../..
    33.6 +
    33.7 +include $(L4DIR)/mk/subdir.mk
    34.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    34.2 +++ b/libresource/include/Makefile	Wed Mar 22 00:26:17 2023 +0100
    34.3 @@ -0,0 +1,7 @@
    34.4 +PKGDIR	?= ..
    34.5 +L4DIR	?= $(PKGDIR)/../../..
    34.6 +
    34.7 +PKGNAME = libresource
    34.8 +CONTRIB_HEADERS = 1
    34.9 +
   34.10 +include $(L4DIR)/mk/include.mk
    35.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    35.2 +++ b/libresource/include/resource/resource.h	Wed Mar 22 00:26:17 2023 +0100
    35.3 @@ -0,0 +1,54 @@
    35.4 +/*
    35.5 + * Common resource classes and functions.
    35.6 + *
    35.7 + * Copyright (C) 2018, 2019, 2020, 2022 Paul Boddie <paul@boddie.org.uk>
    35.8 + *
    35.9 + * This program is free software; you can redistribute it and/or
   35.10 + * modify it under the terms of the GNU General Public License as
   35.11 + * published by the Free Software Foundation; either version 2 of
   35.12 + * the License, or (at your option) any later version.
   35.13 + *
   35.14 + * This program is distributed in the hope that it will be useful,
   35.15 + * but WITHOUT ANY WARRANTY; without even the implied warranty of
   35.16 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   35.17 + * GNU General Public License for more details.
   35.18 + *
   35.19 + * You should have received a copy of the GNU General Public License
   35.20 + * along with this program; if not, write to the Free Software
   35.21 + * Foundation, Inc., 51 Franklin Street, Fifth Floor,
   35.22 + * Boston, MA  02110-1301, USA
   35.23 + */
   35.24 +
   35.25 +#pragma once
   35.26 +
   35.27 +#include <ipc/server.h>
   35.28 +
   35.29 +
   35.30 +
   35.31 +/* A generic class for an object potentially needing to be closed after use. */
   35.32 +
   35.33 +class Resource
   35.34 +{
   35.35 +public:
   35.36 +  virtual ~Resource()
   35.37 +  {
   35.38 +  }
   35.39 +
   35.40 +  /* Server details. */
   35.41 +
   35.42 +  virtual ipc_server_default_config_type config() = 0;
   35.43 +
   35.44 +  virtual void *interface() = 0;
   35.45 +
   35.46 +  /* Deallocation of resources. */
   35.47 +
   35.48 +  virtual void close()
   35.49 +  {
   35.50 +  }
   35.51 +
   35.52 +  /* Activation. */
   35.53 +
   35.54 +  virtual void activate()
   35.55 +  {
   35.56 +  }
   35.57 +};
    36.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    36.2 +++ b/libresource/include/resource/resource_server.h	Wed Mar 22 00:26:17 2023 +0100
    36.3 @@ -0,0 +1,85 @@
    36.4 +/*
    36.5 + * Common resource server functions.
    36.6 + *
    36.7 + * Copyright (C) 2018, 2019, 2020, 2021, 2023 Paul Boddie <paul@boddie.org.uk>
    36.8 + *
    36.9 + * This program is free software; you can redistribute it and/or
   36.10 + * modify it under the terms of the GNU General Public License as
   36.11 + * published by the Free Software Foundation; either version 2 of
   36.12 + * the License, or (at your option) any later version.
   36.13 + *
   36.14 + * This program is distributed in the hope that it will be useful,
   36.15 + * but WITHOUT ANY WARRANTY; without even the implied warranty of
   36.16 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   36.17 + * GNU General Public License for more details.
   36.18 + *
   36.19 + * You should have received a copy of the GNU General Public License
   36.20 + * along with this program; if not, write to the Free Software
   36.21 + * Foundation, Inc., 51 Franklin Street, Fifth Floor,
   36.22 + * Boston, MA  02110-1301, USA
   36.23 + */
   36.24 +
   36.25 +#pragma once
   36.26 +
   36.27 +#include <resource/resource.h>
   36.28 +#include <ipc/server.h>
   36.29 +
   36.30 +
   36.31 +
   36.32 +/* Convenience abstraction for blocking servers. */
   36.33 +
   36.34 +class ResourceServer
   36.35 +{
   36.36 +protected:
   36.37 +  Resource *_resource;
   36.38 +  ipc_server_config_type *_config;
   36.39 +
   36.40 +public:
   36.41 +  explicit ResourceServer(Resource *resource)
   36.42 +  : _resource(resource)
   36.43 +  {
   36.44 +    _config = new ipc_server_config_type;
   36.45 +    ipc_server_init_config(_config);
   36.46 +  }
   36.47 +
   36.48 +  /* Access to configuration. */
   36.49 +
   36.50 +  ipc_server_config_type *config()
   36.51 +  { return _config; }
   36.52 +
   36.53 +  /* Server IPC gate allocation. */
   36.54 +
   36.55 +  long bind(const char *name);
   36.56 +
   36.57 +  /* Server initiation. */
   36.58 +
   36.59 +  long start(bool finalisation = false);
   36.60 +
   36.61 +  long start_in_thread(l4_cap_idx_t thread, bool finalisation = false);
   36.62 +
   36.63 +  long start_thread(bool finalisation = true);
   36.64 +
   36.65 +  long start_thread(l4_cap_idx_t *server, bool finalisation = true);
   36.66 +};
   36.67 +
   36.68 +
   36.69 +
   36.70 +/* Server initialisation. */
   36.71 +
   36.72 +void resource_init_config(ipc_server_config_type *config, Resource *resource);
   36.73 +
   36.74 +void resource_set_config_threaded(ipc_server_config_type *config,
   36.75 +                                  l4_cap_idx_t thread, int new_thread,
   36.76 +                                  int finalisation);
   36.77 +
   36.78 +/* Server initiation. */
   36.79 +
   36.80 +long resource_start_config(ipc_server_config_type *config, Resource *resource);
   36.81 +
   36.82 +/* Server finalisation. */
   36.83 +
   36.84 +void resource_same_thread_finaliser(ipc_server_config_type *config);
   36.85 +
   36.86 +void resource_thread_finaliser(ipc_server_config_type *config);
   36.87 +
   36.88 +// vim: tabstop=2 expandtab shiftwidth=2
    37.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    37.2 +++ b/libresource/lib/Makefile	Wed Mar 22 00:26:17 2023 +0100
    37.3 @@ -0,0 +1,4 @@
    37.4 +PKGDIR	?= ..
    37.5 +L4DIR	?= $(PKGDIR)/../../..
    37.6 +
    37.7 +include $(L4DIR)/mk/subdir.mk
    38.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    38.2 +++ b/libresource/lib/src/Makefile	Wed Mar 22 00:26:17 2023 +0100
    38.3 @@ -0,0 +1,14 @@
    38.4 +PKGDIR		?= ../..
    38.5 +L4DIR		?= $(PKGDIR)/../../..
    38.6 +
    38.7 +TARGET		= libresource.so libresource.a
    38.8 +PC_FILENAME	= libresource
    38.9 +
   38.10 +SRC_CC		= resource_server.cc
   38.11 +
   38.12 +REQUIRES_LIBS	= l4re_c-util libipc libstdc++ libsystypes
   38.13 +
   38.14 +PRIVATE_INCDIR	= $(PKGDIR)/include/resource
   38.15 +CONTRIB_INCDIR	= libresource
   38.16 +
   38.17 +include $(L4DIR)/mk/lib.mk
    39.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    39.2 +++ b/libresource/lib/src/resource_server.cc	Wed Mar 22 00:26:17 2023 +0100
    39.3 @@ -0,0 +1,189 @@
    39.4 +/*
    39.5 + * Resource server functionality.
    39.6 + *
    39.7 + * Copyright (C) 2018, 2019, 2020, 2021, 2022 Paul Boddie <paul@boddie.org.uk>
    39.8 + *
    39.9 + * This program is free software; you can redistribute it and/or
   39.10 + * modify it under the terms of the GNU General Public License as
   39.11 + * published by the Free Software Foundation; either version 2 of
   39.12 + * the License, or (at your option) any later version.
   39.13 + *
   39.14 + * This program is distributed in the hope that it will be useful,
   39.15 + * but WITHOUT ANY WARRANTY; without even the implied warranty of
   39.16 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   39.17 + * GNU General Public License for more details.
   39.18 + *
   39.19 + * You should have received a copy of the GNU General Public License
   39.20 + * along with this program; if not, write to the Free Software
   39.21 + * Foundation, Inc., 51 Franklin Street, Fifth Floor,
   39.22 + * Boston, MA  02110-1301, USA
   39.23 + */
   39.24 +
   39.25 +#include <l4/re/env.h>
   39.26 +#include <l4/sys/types.h>
   39.27 +
   39.28 +#include <pthread-l4.h>
   39.29 +#include <pthread.h>
   39.30 +
   39.31 +#include "resource_server.h"
   39.32 +
   39.33 +
   39.34 +
   39.35 +/* Convenience server methods. */
   39.36 +
   39.37 +/* Bind to a named IPC gate capability. */
   39.38 +
   39.39 +long ResourceServer::bind(const char *name)
   39.40 +{
   39.41 +  return ipc_server_bind(name, (l4_umword_t) _config, &_config->server);
   39.42 +}
   39.43 +
   39.44 +/* Start in the same thread indicating whether deletion notifications and
   39.45 +   finalisation are to be used. */
   39.46 +
   39.47 +long ResourceServer::start(bool finalisation)
   39.48 +{
   39.49 +  resource_init_config(_config, _resource);
   39.50 +  _config->thread = pthread_l4_cap(pthread_self());
   39.51 +
   39.52 +  /* NOTE: On MIPS32, at least, in a payload started by libexec, the main thread
   39.53 +           is not necessarily returned correctly. */
   39.54 +
   39.55 +  if (l4_is_invalid_cap(_config->thread))
   39.56 +    _config->thread = l4re_env()->main_thread;
   39.57 +
   39.58 +  if (finalisation)
   39.59 +  {
   39.60 +    _config->finaliser = resource_same_thread_finaliser;
   39.61 +    _config->notifications = 1;
   39.62 +  }
   39.63 +
   39.64 +  return resource_start_config(_config, _resource);
   39.65 +}
   39.66 +
   39.67 +/* Start serving a resource in an existing thread. */
   39.68 +
   39.69 +long ResourceServer::start_in_thread(l4_cap_idx_t thread, bool finalisation)
   39.70 +{
   39.71 +  resource_init_config(_config, _resource);
   39.72 +  resource_set_config_threaded(_config, thread, 1, finalisation);
   39.73 +
   39.74 +  return resource_start_config(_config, _resource);
   39.75 +}
   39.76 +
   39.77 +/* Start serving a resource in a new thread. */
   39.78 +
   39.79 +long ResourceServer::start_thread(bool finalisation)
   39.80 +{
   39.81 +  pthread_t thread;
   39.82 +  pthread_attr_t attr;
   39.83 +  long err;
   39.84 +
   39.85 +  pthread_attr_init(&attr);
   39.86 +  pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
   39.87 +
   39.88 +  resource_init_config(_config, _resource);
   39.89 +
   39.90 +  err = pthread_create(&thread, &attr, ipc_server_start_mainloop, _config);
   39.91 +  if (err)
   39.92 +    return err;
   39.93 +
   39.94 +  resource_set_config_threaded(_config, pthread_l4_cap(thread), 1, finalisation);
   39.95 +
   39.96 +  return resource_start_config(_config, _resource);
   39.97 +}
   39.98 +
   39.99 +/* A convenience method starting a thread and returning the server capability
  39.100 +   employed via the given parameter. */
  39.101 +
  39.102 +long ResourceServer::start_thread(l4_cap_idx_t *server, bool finalisation)
  39.103 +{
  39.104 +  long err = start_thread(finalisation);
  39.105 +
  39.106 +  if (!err)
  39.107 +    *server = _config->server;
  39.108 +
  39.109 +  return err;
  39.110 +}
  39.111 +
  39.112 +
  39.113 +
  39.114 +/* Initialise a server configuration for a resource. */
  39.115 +
  39.116 +void resource_init_config(ipc_server_config_type *config, Resource *resource)
  39.117 +{
  39.118 +  ipc_server_default_config_type default_config = resource->config();
  39.119 +
  39.120 +  config->handler_obj = resource->interface();
  39.121 +  config->finaliser_obj = resource;
  39.122 +  config->expected_items = default_config.expected_items;
  39.123 +  config->handler = default_config.handler;
  39.124 +}
  39.125 +
  39.126 +/* Set a configuration to be threaded. */
  39.127 +
  39.128 +void resource_set_config_threaded(ipc_server_config_type *config,
  39.129 +                                  l4_cap_idx_t thread, int new_thread,
  39.130 +                                  int finalisation)
  39.131 +{
  39.132 +  config->finaliser = resource_thread_finaliser;
  39.133 +  config->config_thread = new_thread;
  39.134 +  config->thread = thread;
  39.135 +  config->notifications = finalisation;
  39.136 +}
  39.137 +
  39.138 +/* Activate a resource and start a server for it. */
  39.139 +
  39.140 +long resource_start_config(ipc_server_config_type *config, Resource *resource)
  39.141 +{
  39.142 +  resource->activate();
  39.143 +  long err = ipc_server_start_config(config);
  39.144 +
  39.145 +  /* Discard any server resources if starting it failed. */
  39.146 +
  39.147 +  if (err)
  39.148 +  {
  39.149 +    ipc_server_finalise_config(config);
  39.150 +    ipc_server_discard_thread(config);
  39.151 +  }
  39.152 +
  39.153 +  return err;
  39.154 +}
  39.155 +
  39.156 +
  39.157 +
  39.158 +/* A finaliser for exposed resources in the same thread. */
  39.159 +
  39.160 +void resource_same_thread_finaliser(ipc_server_config_type *config)
  39.161 +{
  39.162 +  Resource *resource = reinterpret_cast<Resource *>(config->finaliser_obj);
  39.163 +
  39.164 +  /* Close but do not delete the resource since it is assumed that it is being
  39.165 +     managed by the thread. */
  39.166 +
  39.167 +  resource->close();
  39.168 +
  39.169 +  /* Release the capabilities. */
  39.170 +
  39.171 +  ipc_server_finalise_config(config);
  39.172 +  delete config;
  39.173 +}
  39.174 +
  39.175 +/* A finaliser for exposed resources in a different thread. */
  39.176 +
  39.177 +void resource_thread_finaliser(ipc_server_config_type *config)
  39.178 +{
  39.179 +  Resource *resource = reinterpret_cast<Resource *>(config->finaliser_obj);
  39.180 +
  39.181 +  /* Close and delete the resource. */
  39.182 +
  39.183 +  resource->close();
  39.184 +  delete resource;
  39.185 +
  39.186 +  /* Release the capabilities. */
  39.187 +
  39.188 +  ipc_server_finalise_config(config);
  39.189 +  delete config;
  39.190 +}
  39.191 +
  39.192 +// vim: tabstop=2 expandtab shiftwidth=2
    40.1 --- a/servers/Control	Tue Mar 21 21:49:00 2023 +0100
    40.2 +++ b/servers/Control	Wed Mar 22 00:26:17 2023 +0100
    40.3 @@ -1,3 +1,3 @@
    40.4 -requires: libstdc++ libc libipc libfsserver libmem libe2access_blockserver libexec
    40.5 +requires: libstdc++ libc libipc libfsserver libresource libmem libe2access_blockserver libexec
    40.6  provides: fsservers
    40.7  maintainer: paul@boddie.org.uk
    41.1 --- a/servers/Makefile	Tue Mar 21 21:49:00 2023 +0100
    41.2 +++ b/servers/Makefile	Wed Mar 22 00:26:17 2023 +0100
    41.3 @@ -23,6 +23,6 @@
    41.4  
    41.5  SRC_CC_test_server	= test_file_server.cc
    41.6  
    41.7 -REQUIRES_LIBS	= l4re_c-util libmem libfsserver libipc libstdc++ libsystypes libe2access_blockserver libexec
    41.8 +REQUIRES_LIBS	= l4re_c-util libmem libfsserver libresource libipc libstdc++ libsystypes libe2access_blockserver libexec
    41.9  
   41.10  include $(L4DIR)/mk/prog.mk
    42.1 --- a/servers/block_file_server.cc	Tue Mar 21 21:49:00 2023 +0100
    42.2 +++ b/servers/block_file_server.cc	Wed Mar 22 00:26:17 2023 +0100
    42.3 @@ -30,8 +30,8 @@
    42.4  #include <mem/memory_incremental.h>
    42.5  #include <fsserver/page_queue_shared.h>
    42.6  #include <fsserver/pages.h>
    42.7 -#include <fsserver/resource_server.h>
    42.8  #include <fsserver/block_file_opener.h>
    42.9 +#include <resource/resource_server.h>
   42.10  #include <systypes/env.h>
   42.11  
   42.12  
    43.1 --- a/servers/client_file_server.cc	Tue Mar 21 21:49:00 2023 +0100
    43.2 +++ b/servers/client_file_server.cc	Wed Mar 22 00:26:17 2023 +0100
    43.3 @@ -31,8 +31,8 @@
    43.4  #include <mem/memory_incremental.h>
    43.5  #include <fsserver/page_queue_shared.h>
    43.6  #include <fsserver/pages.h>
    43.7 -#include <fsserver/resource_server.h>
    43.8  #include <fsserver/client_file_opener.h>
    43.9 +#include <resource/resource_server.h>
   43.10  #include <systypes/env.h>
   43.11  
   43.12  
    44.1 --- a/servers/ext2_file_server.cc	Tue Mar 21 21:49:00 2023 +0100
    44.2 +++ b/servers/ext2_file_server.cc	Wed Mar 22 00:26:17 2023 +0100
    44.3 @@ -30,9 +30,9 @@
    44.4  #include <e2access/fs.h>
    44.5  #include <fsserver/page_queue_shared.h>
    44.6  #include <fsserver/pages.h>
    44.7 -#include <fsserver/resource_server.h>
    44.8  #include <fsserver/ext2_filesystem.h>
    44.9  #include <mem/memory_incremental.h>
   44.10 +#include <resource/resource_server.h>
   44.11  #include <systypes/env.h>
   44.12  
   44.13  
    45.1 --- a/servers/host_file_server.cc	Tue Mar 21 21:49:00 2023 +0100
    45.2 +++ b/servers/host_file_server.cc	Wed Mar 22 00:26:17 2023 +0100
    45.3 @@ -30,8 +30,8 @@
    45.4  #include <mem/memory_incremental.h>
    45.5  #include <fsserver/page_queue_shared.h>
    45.6  #include <fsserver/pages.h>
    45.7 -#include <fsserver/resource_server.h>
    45.8  #include <fsserver/host_file_opener.h>
    45.9 +#include <resource/resource_server.h>
   45.10  #include <systypes/env.h>
   45.11  
   45.12  
    46.1 --- a/servers/pipe_server.cc	Tue Mar 21 21:49:00 2023 +0100
    46.2 +++ b/servers/pipe_server.cc	Wed Mar 22 00:26:17 2023 +0100
    46.3 @@ -30,7 +30,7 @@
    46.4  
    46.5  #include <mem/memory_incremental.h>
    46.6  #include <fsserver/pipe_opener_resource.h>
    46.7 -#include <fsserver/resource_server.h>
    46.8 +#include <resource/resource_server.h>
    46.9  #include <systypes/env.h>
   46.10  
   46.11  
    47.1 --- a/servers/process_server.cc	Tue Mar 21 21:49:00 2023 +0100
    47.2 +++ b/servers/process_server.cc	Wed Mar 22 00:26:17 2023 +0100
    47.3 @@ -29,7 +29,7 @@
    47.4  #include <stdlib.h>
    47.5  
    47.6  #include <exec/process_creator_resource.h>
    47.7 -#include <fsserver/resource_server.h>
    47.8 +#include <resource/resource_server.h>
    47.9  #include <systypes/env.h>
   47.10  #include <systypes/fcntl.h>
   47.11  
    48.1 --- a/servers/test_file_server.cc	Tue Mar 21 21:49:00 2023 +0100
    48.2 +++ b/servers/test_file_server.cc	Wed Mar 22 00:26:17 2023 +0100
    48.3 @@ -31,8 +31,8 @@
    48.4  #include <mem/memory_utils.h>
    48.5  #include <fsserver/page_queue_shared.h>
    48.6  #include <fsserver/pages.h>
    48.7 -#include <fsserver/resource_server.h>
    48.8  #include <fsserver/test_file_opener.h>
    48.9 +#include <resource/resource_server.h>
   48.10  #include <systypes/env.h>
   48.11  
   48.12