1.1 --- a/libfsserver/include/fsserver/directory_resource.h Fri Dec 02 00:48:55 2022 +0100 1.2 +++ b/libfsserver/include/fsserver/directory_resource.h Fri Dec 02 00:49:52 2022 +0100 1.3 @@ -1,7 +1,7 @@ 1.4 /* 1.5 * A resource offering support for directory operations. 1.6 * 1.7 - * Copyright (C) 2021 Paul Boddie <paul@boddie.org.uk> 1.8 + * Copyright (C) 2021, 2022 Paul Boddie <paul@boddie.org.uk> 1.9 * 1.10 * This program is free software; you can redistribute it and/or 1.11 * modify it under the terms of the GNU General Public License as 1.12 @@ -49,9 +49,7 @@ 1.13 1.14 /* Server details. */ 1.15 1.16 - int expected_items(); 1.17 - 1.18 - ipc_server_handler_type handler(); 1.19 + ipc_server_default_config_type config(); 1.20 1.21 void *interface() 1.22 { return static_cast<DirectoryObject *>(this); }
2.1 --- a/libfsserver/include/fsserver/file_pager.h Fri Dec 02 00:48:55 2022 +0100 2.2 +++ b/libfsserver/include/fsserver/file_pager.h Fri Dec 02 00:49:52 2022 +0100 2.3 @@ -56,9 +56,7 @@ 2.4 2.5 /* Server details. */ 2.6 2.7 - int expected_items(); 2.8 - 2.9 - ipc_server_handler_type handler(); 2.10 + ipc_server_default_config_type config(); 2.11 2.12 void *interface() 2.13 { return static_cast<MappedFileObject *>(this); }
3.1 --- a/libfsserver/include/fsserver/filesystem_resource.h Fri Dec 02 00:48:55 2022 +0100 3.2 +++ b/libfsserver/include/fsserver/filesystem_resource.h Fri Dec 02 00:49:52 2022 +0100 3.3 @@ -1,7 +1,7 @@ 3.4 /* 3.5 * A resource supporting the creation of user-specific opener resources. 3.6 * 3.7 - * Copyright (C) 2021 Paul Boddie <paul@boddie.org.uk> 3.8 + * Copyright (C) 2021, 2022 Paul Boddie <paul@boddie.org.uk> 3.9 * 3.10 * This program is free software; you can redistribute it and/or 3.11 * modify it under the terms of the GNU General Public License as 3.12 @@ -37,9 +37,7 @@ 3.13 3.14 /* Server details. */ 3.15 3.16 - int expected_items(); 3.17 - 3.18 - ipc_server_handler_type handler(); 3.19 + ipc_server_default_config_type config(); 3.20 3.21 void *interface() 3.22 { return static_cast<Filesystem *>(this); }
4.1 --- a/libfsserver/include/fsserver/opener_context_resource.h Fri Dec 02 00:48:55 2022 +0100 4.2 +++ b/libfsserver/include/fsserver/opener_context_resource.h Fri Dec 02 00:49:52 2022 +0100 4.3 @@ -44,9 +44,7 @@ 4.4 4.5 /* Server details. */ 4.6 4.7 - int expected_items(); 4.8 - 4.9 - ipc_server_handler_type handler(); 4.10 + ipc_server_default_config_type config(); 4.11 4.12 void *interface() 4.13 { return static_cast<OpenerContextObject *>(this); }
5.1 --- a/libfsserver/include/fsserver/opener_resource.h Fri Dec 02 00:48:55 2022 +0100 5.2 +++ b/libfsserver/include/fsserver/opener_resource.h Fri Dec 02 00:49:52 2022 +0100 5.3 @@ -47,9 +47,7 @@ 5.4 5.5 /* Server details. */ 5.6 5.7 - int expected_items(); 5.8 - 5.9 - ipc_server_handler_type handler(); 5.10 + ipc_server_default_config_type config(); 5.11 5.12 void *interface() 5.13 { return static_cast<Opener *>(this); }
6.1 --- a/libfsserver/include/fsserver/pipe_opener_resource.h Fri Dec 02 00:48:55 2022 +0100 6.2 +++ b/libfsserver/include/fsserver/pipe_opener_resource.h Fri Dec 02 00:49:52 2022 +0100 6.3 @@ -1,7 +1,7 @@ 6.4 /* 6.5 * A pipe opener resource. 6.6 * 6.7 - * Copyright (C) 2021 Paul Boddie <paul@boddie.org.uk> 6.8 + * Copyright (C) 2021, 2022 Paul Boddie <paul@boddie.org.uk> 6.9 * 6.10 * This program is free software; you can redistribute it and/or 6.11 * modify it under the terms of the GNU General Public License as 6.12 @@ -42,9 +42,7 @@ 6.13 6.14 /* Server details. */ 6.15 6.16 - int expected_items(); 6.17 - 6.18 - ipc_server_handler_type handler(); 6.19 + ipc_server_default_config_type config(); 6.20 6.21 void *interface() 6.22 { return static_cast<PipeOpener *>(this); }
7.1 --- a/libfsserver/include/fsserver/pipe_pager.h Fri Dec 02 00:48:55 2022 +0100 7.2 +++ b/libfsserver/include/fsserver/pipe_pager.h Fri Dec 02 00:49:52 2022 +0100 7.3 @@ -1,7 +1,7 @@ 7.4 /* 7.5 * A pipe pager providing access to pipe content and navigation support. 7.6 * 7.7 - * Copyright (C) 2021 Paul Boddie <paul@boddie.org.uk> 7.8 + * Copyright (C) 2021, 2022 Paul Boddie <paul@boddie.org.uk> 7.9 * 7.10 * This program is free software; you can redistribute it and/or 7.11 * modify it under the terms of the GNU General Public License as 7.12 @@ -51,9 +51,7 @@ 7.13 7.14 /* Server details. */ 7.15 7.16 - int expected_items(); 7.17 - 7.18 - ipc_server_handler_type handler(); 7.19 + ipc_server_default_config_type config(); 7.20 7.21 void *interface() 7.22 { return static_cast<PipeObject *>(this); }
8.1 --- a/libfsserver/include/fsserver/resource.h Fri Dec 02 00:48:55 2022 +0100 8.2 +++ b/libfsserver/include/fsserver/resource.h Fri Dec 02 00:49:52 2022 +0100 8.3 @@ -1,7 +1,7 @@ 8.4 /* 8.5 * Common resource classes and functions. 8.6 * 8.7 - * Copyright (C) 2018, 2019, 2020 Paul Boddie <paul@boddie.org.uk> 8.8 + * Copyright (C) 2018, 2019, 2020, 2022 Paul Boddie <paul@boddie.org.uk> 8.9 * 8.10 * This program is free software; you can redistribute it and/or 8.11 * modify it under the terms of the GNU General Public License as 8.12 @@ -36,9 +36,7 @@ 8.13 8.14 /* Server details. */ 8.15 8.16 - virtual int expected_items() = 0; 8.17 - 8.18 - virtual ipc_server_handler_type handler() = 0; 8.19 + virtual ipc_server_default_config_type config() = 0; 8.20 8.21 virtual void *interface() = 0; 8.22
9.1 --- a/libfsserver/lib/directories/directory_resource.cc Fri Dec 02 00:48:55 2022 +0100 9.2 +++ b/libfsserver/lib/directories/directory_resource.cc Fri Dec 02 00:49:52 2022 +0100 9.3 @@ -41,14 +41,9 @@ 9.4 9.5 9.6 9.7 -int DirectoryResource::expected_items() 9.8 +ipc_server_default_config_type DirectoryResource::config() 9.9 { 9.10 - return DirectoryObject_expected_items; 9.11 -} 9.12 - 9.13 -ipc_server_handler_type DirectoryResource::handler() 9.14 -{ 9.15 - return (ipc_server_handler_type) handle_DirectoryObject; 9.16 + return config_DirectoryObject; 9.17 } 9.18 9.19
10.1 --- a/libfsserver/lib/files/file_pager.cc Fri Dec 02 00:48:55 2022 +0100 10.2 +++ b/libfsserver/lib/files/file_pager.cc Fri Dec 02 00:49:52 2022 +0100 10.3 @@ -38,14 +38,9 @@ 10.4 { 10.5 } 10.6 10.7 -int FilePager::expected_items() 10.8 +ipc_server_default_config_type FilePager::config() 10.9 { 10.10 - return MappedFileObject_expected_items; 10.11 -} 10.12 - 10.13 -ipc_server_handler_type FilePager::handler() 10.14 -{ 10.15 - return (ipc_server_handler_type) handle_MappedFileObject; 10.16 + return config_MappedFileObject; 10.17 } 10.18 10.19
11.1 --- a/libfsserver/lib/files/filesystem_resource.cc Fri Dec 02 00:48:55 2022 +0100 11.2 +++ b/libfsserver/lib/files/filesystem_resource.cc Fri Dec 02 00:49:52 2022 +0100 11.3 @@ -1,7 +1,7 @@ 11.4 /* 11.5 * A resource supporting the creation of user-specific opener resources. 11.6 * 11.7 - * Copyright (C) 2021 Paul Boddie <paul@boddie.org.uk> 11.8 + * Copyright (C) 2021, 2022 Paul Boddie <paul@boddie.org.uk> 11.9 * 11.10 * This program is free software; you can redistribute it and/or 11.11 * modify it under the terms of the GNU General Public License as 11.12 @@ -29,14 +29,9 @@ 11.13 { 11.14 } 11.15 11.16 -int FilesystemResource::expected_items() 11.17 +ipc_server_default_config_type FilesystemResource::config() 11.18 { 11.19 - return FilesystemObject_expected_items; 11.20 -} 11.21 - 11.22 -ipc_server_handler_type FilesystemResource::handler() 11.23 -{ 11.24 - return (ipc_server_handler_type) handle_FilesystemObject; 11.25 + return config_FilesystemObject; 11.26 } 11.27 11.28 // vim: tabstop=4 expandtab shiftwidth=4
12.1 --- a/libfsserver/lib/files/opener_context_resource.cc Fri Dec 02 00:48:55 2022 +0100 12.2 +++ b/libfsserver/lib/files/opener_context_resource.cc Fri Dec 02 00:49:52 2022 +0100 12.3 @@ -36,14 +36,9 @@ 12.4 { 12.5 } 12.6 12.7 -int OpenerContextResource::expected_items() 12.8 +ipc_server_default_config_type OpenerContextResource::config() 12.9 { 12.10 - return OpenerContextObject_expected_items; 12.11 -} 12.12 - 12.13 -ipc_server_handler_type OpenerContextResource::handler() 12.14 -{ 12.15 - return (ipc_server_handler_type) handle_OpenerContextObject; 12.16 + return config_OpenerContextObject; 12.17 } 12.18 12.19
13.1 --- a/libfsserver/lib/files/opener_resource.cc Fri Dec 02 00:48:55 2022 +0100 13.2 +++ b/libfsserver/lib/files/opener_resource.cc Fri Dec 02 00:49:52 2022 +0100 13.3 @@ -34,14 +34,9 @@ 13.4 { 13.5 } 13.6 13.7 -int OpenerResource::expected_items() 13.8 +ipc_server_default_config_type OpenerResource::config() 13.9 { 13.10 - return Opener_expected_items; 13.11 -} 13.12 - 13.13 -ipc_server_handler_type OpenerResource::handler() 13.14 -{ 13.15 - return (ipc_server_handler_type) handle_Opener; 13.16 + return config_Opener; 13.17 } 13.18 13.19
14.1 --- a/libfsserver/lib/generic/resource_server.cc Fri Dec 02 00:48:55 2022 +0100 14.2 +++ b/libfsserver/lib/generic/resource_server.cc Fri Dec 02 00:49:52 2022 +0100 14.3 @@ -87,10 +87,12 @@ 14.4 14.5 void resource_init_config(ipc_server_config_type *config, Resource *resource) 14.6 { 14.7 + ipc_server_default_config_type default_config = resource->config(); 14.8 + 14.9 config->handler_obj = resource->interface(); 14.10 config->finaliser_obj = resource; 14.11 - config->expected_items = resource->expected_items(); 14.12 - config->handler = resource->handler(); 14.13 + config->expected_items = default_config.expected_items; 14.14 + config->handler = default_config.handler; 14.15 } 14.16 14.17 /* Set a configuration to be threaded. */
15.1 --- a/libfsserver/lib/pipes/pipe_opener_resource.cc Fri Dec 02 00:48:55 2022 +0100 15.2 +++ b/libfsserver/lib/pipes/pipe_opener_resource.cc Fri Dec 02 00:49:52 2022 +0100 15.3 @@ -37,14 +37,9 @@ 15.4 { 15.5 } 15.6 15.7 -int PipeOpenerResource::expected_items() 15.8 +ipc_server_default_config_type PipeOpenerResource::config() 15.9 { 15.10 - return PipeOpener_expected_items; 15.11 -} 15.12 - 15.13 -ipc_server_handler_type PipeOpenerResource::handler() 15.14 -{ 15.15 - return (ipc_server_handler_type) handle_PipeOpener; 15.16 + return config_PipeOpener; 15.17 } 15.18 15.19
16.1 --- a/libfsserver/lib/pipes/pipe_pager.cc Fri Dec 02 00:48:55 2022 +0100 16.2 +++ b/libfsserver/lib/pipes/pipe_pager.cc Fri Dec 02 00:49:52 2022 +0100 16.3 @@ -42,14 +42,9 @@ 16.4 _mapper = _paging->current_region(_writing); 16.5 } 16.6 16.7 -int PipePager::expected_items() 16.8 +ipc_server_default_config_type PipePager::config() 16.9 { 16.10 - return PipeObject_expected_items; 16.11 -} 16.12 - 16.13 -ipc_server_handler_type PipePager::handler() 16.14 -{ 16.15 - return (ipc_server_handler_type) handle_PipeObject; 16.16 + return config_PipeObject; 16.17 } 16.18 16.19
17.1 --- a/libipc/include/ipc/server.h Fri Dec 02 00:48:55 2022 +0100 17.2 +++ b/libipc/include/ipc/server.h Fri Dec 02 00:49:52 2022 +0100 17.3 @@ -30,22 +30,17 @@ 17.4 /* A convenience macro for invoking the server mainloop. */ 17.5 17.6 #define ipc_server_loop_for(TYPE, POINTER, NAME) \ 17.7 - _ipc_server_loop_for(TYPE##_expected_items, (TYPE *) POINTER, \ 17.8 - (ipc_server_handler_type) handle_##TYPE, \ 17.9 - NAME) 17.10 + _ipc_server_loop_for(&config_##TYPE, (TYPE *) POINTER, NAME) 17.11 17.12 /* A convenience macro for initialising a server. */ 17.13 17.14 #define ipc_server_init_for(CONFIG, TYPE, POINTER) \ 17.15 - _ipc_server_init_for(CONFIG, TYPE##_expected_items, (TYPE *) POINTER, \ 17.16 - (ipc_server_handler_type) handle_##TYPE) 17.17 + _ipc_server_init_for(CONFIG, &config_##TYPE, (TYPE *) POINTER) 17.18 17.19 /* A convenience macro for adding a configuration to an existing server. */ 17.20 17.21 #define ipc_server_add_config(CONFIG, TYPE, POINTER, THREAD) \ 17.22 - _ipc_server_add_config(CONFIG, TYPE##_expected_items, (TYPE *) POINTER, \ 17.23 - (ipc_server_handler_type) handle_##TYPE, \ 17.24 - THREAD) 17.25 + _ipc_server_add_config(CONFIG, &config_##TYPE, (TYPE *) POINTER, THREAD) 17.26 17.27 /* A handler function type. */ 17.28 17.29 @@ -93,6 +88,15 @@ 17.30 17.31 } ipc_server_config_type; 17.32 17.33 +/* Server configuration defaults. */ 17.34 + 17.35 +typedef struct ipc_server_default_config_type 17.36 +{ 17.37 + int expected_items; 17.38 + ipc_server_handler_type handler; 17.39 + 17.40 +} ipc_server_default_config_type; 17.41 + 17.42 17.43 17.44 /* Associate a notification IRQ with an IPC gate in the main thread. */ 17.45 @@ -127,23 +131,25 @@ 17.46 17.47 /* Handle incoming messages for a server. */ 17.48 17.49 -long _ipc_server_loop_for(int expected_items, void *handler_obj, 17.50 - ipc_server_handler_type handler, const char *name); 17.51 +long _ipc_server_loop_for(ipc_server_default_config_type *default_config, 17.52 + void *handler_obj, const char *name); 17.53 17.54 /* Initialise a server. */ 17.55 17.56 -long _ipc_server_init_for(ipc_server_config_type *config, int expected_items, 17.57 - void *handler_obj, ipc_server_handler_type handler); 17.58 +long _ipc_server_init_for(ipc_server_config_type *config, 17.59 + ipc_server_default_config_type *default_config, 17.60 + void *handler_obj); 17.61 17.62 /* Add handling of incoming messages to an existing server. */ 17.63 17.64 -long _ipc_server_add_config(ipc_server_config_type *config, int expected_items, 17.65 - void *handler_obj, ipc_server_handler_type handler, 17.66 +long _ipc_server_add_config(ipc_server_config_type *config, 17.67 + ipc_server_default_config_type *default_config, 17.68 + void *handler_obj, 17.69 l4_cap_idx_t thread); 17.70 17.71 /* Handle incoming messages and IRQ notifications for a server. */ 17.72 17.73 -long ipc_server_managed_loop(int expected_items, ipc_server_config_type *config); 17.74 +long ipc_server_managed_loop(ipc_server_config_type *config); 17.75 17.76 /* A pthread-compatible mainloop initiation function. */ 17.77
18.1 --- a/libipc/lib/src/server.c Fri Dec 02 00:48:55 2022 +0100 18.2 +++ b/libipc/lib/src/server.c Fri Dec 02 00:49:52 2022 +0100 18.3 @@ -153,8 +153,9 @@ 18.4 18.5 /* Support for the convenience macro starting a server for a given object. */ 18.6 18.7 -long _ipc_server_loop_for(int expected_items, void *handler_obj, 18.8 - ipc_server_handler_type handler, const char *name) 18.9 +long _ipc_server_loop_for(ipc_server_default_config_type *default_config, 18.10 + void *handler_obj, 18.11 + const char *name) 18.12 { 18.13 ipc_server_config_type config; 18.14 long err; 18.15 @@ -166,20 +167,21 @@ 18.16 return err; 18.17 } 18.18 18.19 - _ipc_server_init_for(&config, expected_items, handler_obj, handler); 18.20 + _ipc_server_init_for(&config, default_config, handler_obj); 18.21 18.22 return ipc_server_start_config(&config); 18.23 } 18.24 18.25 /* Initialise a server for a given object. */ 18.26 18.27 -long _ipc_server_init_for(ipc_server_config_type *config, int expected_items, 18.28 - void *handler_obj, ipc_server_handler_type handler) 18.29 +long _ipc_server_init_for(ipc_server_config_type *config, 18.30 + ipc_server_default_config_type *default_config, 18.31 + void *handler_obj) 18.32 { 18.33 ipc_server_init_config(config); 18.34 18.35 - config->expected_items = expected_items; 18.36 - config->handler = handler; 18.37 + config->expected_items = default_config->expected_items; 18.38 + config->handler = default_config->handler; 18.39 config->handler_obj = handler_obj; 18.40 18.41 return L4_EOK; 18.42 @@ -187,11 +189,12 @@ 18.43 18.44 /* Associate a new configuration with an existing server endpoint. */ 18.45 18.46 -long _ipc_server_add_config(ipc_server_config_type *config, int expected_items, 18.47 - void *handler_obj, ipc_server_handler_type handler, 18.48 +long _ipc_server_add_config(ipc_server_config_type *config, 18.49 + ipc_server_default_config_type *default_config, 18.50 + void *handler_obj, 18.51 l4_cap_idx_t thread) 18.52 { 18.53 - _ipc_server_init_for(config, expected_items, handler_obj, handler); 18.54 + _ipc_server_init_for(config, default_config, handler_obj); 18.55 return ipc_server_start_config_thread(config, thread); 18.56 } 18.57 18.58 @@ -211,7 +214,7 @@ 18.59 /* A server main loop handling endpoint deletion for an IPC gate dedicated to 18.60 a particular object within its own thread. */ 18.61 18.62 -long ipc_server_managed_loop(int expected_items, ipc_server_config_type *config) 18.63 +long ipc_server_managed_loop(ipc_server_config_type *config) 18.64 { 18.65 ipc_message_t msg; 18.66 l4_umword_t label, irq_label; 18.67 @@ -222,7 +225,7 @@ 18.68 18.69 /* Declare the extent to which capabilities are expected in messages. */ 18.70 18.71 - long err = ipc_message_expect(&msg, expected_items); 18.72 + long err = ipc_message_expect(&msg, config->expected_items); 18.73 18.74 if (err) 18.75 return err; 18.76 @@ -271,7 +274,7 @@ 18.77 { 18.78 ipc_server_config_type *config = (ipc_server_config_type *) data; 18.79 18.80 - long err = ipc_server_managed_loop(config->expected_items, config); 18.81 + long err = ipc_server_managed_loop(config); 18.82 18.83 if (config->finaliser != NULL) 18.84 config->finaliser(config);