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