# HG changeset patch # User Paul Boddie # Date 1669938592 -3600 # Node ID 3b84f92ed69c273cd1a1286b7f5c5ec277893c59 # Parent 4c2ca0e1bc850d4f06df1649a299c0ddb7d55127 Introduced slightly simplified server configuration enabled by idl4re changes. diff -r 4c2ca0e1bc85 -r 3b84f92ed69c libfsserver/include/fsserver/directory_resource.h --- a/libfsserver/include/fsserver/directory_resource.h Fri Dec 02 00:48:55 2022 +0100 +++ b/libfsserver/include/fsserver/directory_resource.h Fri Dec 02 00:49:52 2022 +0100 @@ -1,7 +1,7 @@ /* * A resource offering support for directory operations. * - * Copyright (C) 2021 Paul Boddie + * Copyright (C) 2021, 2022 Paul Boddie * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as @@ -49,9 +49,7 @@ /* Server details. */ - int expected_items(); - - ipc_server_handler_type handler(); + ipc_server_default_config_type config(); void *interface() { return static_cast(this); } diff -r 4c2ca0e1bc85 -r 3b84f92ed69c libfsserver/include/fsserver/file_pager.h --- a/libfsserver/include/fsserver/file_pager.h Fri Dec 02 00:48:55 2022 +0100 +++ b/libfsserver/include/fsserver/file_pager.h Fri Dec 02 00:49:52 2022 +0100 @@ -56,9 +56,7 @@ /* Server details. */ - int expected_items(); - - ipc_server_handler_type handler(); + ipc_server_default_config_type config(); void *interface() { return static_cast(this); } diff -r 4c2ca0e1bc85 -r 3b84f92ed69c libfsserver/include/fsserver/filesystem_resource.h --- a/libfsserver/include/fsserver/filesystem_resource.h Fri Dec 02 00:48:55 2022 +0100 +++ b/libfsserver/include/fsserver/filesystem_resource.h Fri Dec 02 00:49:52 2022 +0100 @@ -1,7 +1,7 @@ /* * A resource supporting the creation of user-specific opener resources. * - * Copyright (C) 2021 Paul Boddie + * Copyright (C) 2021, 2022 Paul Boddie * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as @@ -37,9 +37,7 @@ /* Server details. */ - int expected_items(); - - ipc_server_handler_type handler(); + ipc_server_default_config_type config(); void *interface() { return static_cast(this); } diff -r 4c2ca0e1bc85 -r 3b84f92ed69c libfsserver/include/fsserver/opener_context_resource.h --- a/libfsserver/include/fsserver/opener_context_resource.h Fri Dec 02 00:48:55 2022 +0100 +++ b/libfsserver/include/fsserver/opener_context_resource.h Fri Dec 02 00:49:52 2022 +0100 @@ -44,9 +44,7 @@ /* Server details. */ - int expected_items(); - - ipc_server_handler_type handler(); + ipc_server_default_config_type config(); void *interface() { return static_cast(this); } diff -r 4c2ca0e1bc85 -r 3b84f92ed69c libfsserver/include/fsserver/opener_resource.h --- a/libfsserver/include/fsserver/opener_resource.h Fri Dec 02 00:48:55 2022 +0100 +++ b/libfsserver/include/fsserver/opener_resource.h Fri Dec 02 00:49:52 2022 +0100 @@ -47,9 +47,7 @@ /* Server details. */ - int expected_items(); - - ipc_server_handler_type handler(); + ipc_server_default_config_type config(); void *interface() { return static_cast(this); } diff -r 4c2ca0e1bc85 -r 3b84f92ed69c libfsserver/include/fsserver/pipe_opener_resource.h --- a/libfsserver/include/fsserver/pipe_opener_resource.h Fri Dec 02 00:48:55 2022 +0100 +++ b/libfsserver/include/fsserver/pipe_opener_resource.h Fri Dec 02 00:49:52 2022 +0100 @@ -1,7 +1,7 @@ /* * A pipe opener resource. * - * Copyright (C) 2021 Paul Boddie + * Copyright (C) 2021, 2022 Paul Boddie * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as @@ -42,9 +42,7 @@ /* Server details. */ - int expected_items(); - - ipc_server_handler_type handler(); + ipc_server_default_config_type config(); void *interface() { return static_cast(this); } diff -r 4c2ca0e1bc85 -r 3b84f92ed69c libfsserver/include/fsserver/pipe_pager.h --- a/libfsserver/include/fsserver/pipe_pager.h Fri Dec 02 00:48:55 2022 +0100 +++ b/libfsserver/include/fsserver/pipe_pager.h Fri Dec 02 00:49:52 2022 +0100 @@ -1,7 +1,7 @@ /* * A pipe pager providing access to pipe content and navigation support. * - * Copyright (C) 2021 Paul Boddie + * Copyright (C) 2021, 2022 Paul Boddie * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as @@ -51,9 +51,7 @@ /* Server details. */ - int expected_items(); - - ipc_server_handler_type handler(); + ipc_server_default_config_type config(); void *interface() { return static_cast(this); } diff -r 4c2ca0e1bc85 -r 3b84f92ed69c libfsserver/include/fsserver/resource.h --- a/libfsserver/include/fsserver/resource.h Fri Dec 02 00:48:55 2022 +0100 +++ b/libfsserver/include/fsserver/resource.h Fri Dec 02 00:49:52 2022 +0100 @@ -1,7 +1,7 @@ /* * Common resource classes and functions. * - * Copyright (C) 2018, 2019, 2020 Paul Boddie + * Copyright (C) 2018, 2019, 2020, 2022 Paul Boddie * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as @@ -36,9 +36,7 @@ /* Server details. */ - virtual int expected_items() = 0; - - virtual ipc_server_handler_type handler() = 0; + virtual ipc_server_default_config_type config() = 0; virtual void *interface() = 0; diff -r 4c2ca0e1bc85 -r 3b84f92ed69c libfsserver/lib/directories/directory_resource.cc --- a/libfsserver/lib/directories/directory_resource.cc Fri Dec 02 00:48:55 2022 +0100 +++ b/libfsserver/lib/directories/directory_resource.cc Fri Dec 02 00:49:52 2022 +0100 @@ -41,14 +41,9 @@ -int DirectoryResource::expected_items() +ipc_server_default_config_type DirectoryResource::config() { - return DirectoryObject_expected_items; -} - -ipc_server_handler_type DirectoryResource::handler() -{ - return (ipc_server_handler_type) handle_DirectoryObject; + return config_DirectoryObject; } diff -r 4c2ca0e1bc85 -r 3b84f92ed69c libfsserver/lib/files/file_pager.cc --- a/libfsserver/lib/files/file_pager.cc Fri Dec 02 00:48:55 2022 +0100 +++ b/libfsserver/lib/files/file_pager.cc Fri Dec 02 00:49:52 2022 +0100 @@ -38,14 +38,9 @@ { } -int FilePager::expected_items() +ipc_server_default_config_type FilePager::config() { - return MappedFileObject_expected_items; -} - -ipc_server_handler_type FilePager::handler() -{ - return (ipc_server_handler_type) handle_MappedFileObject; + return config_MappedFileObject; } diff -r 4c2ca0e1bc85 -r 3b84f92ed69c libfsserver/lib/files/filesystem_resource.cc --- a/libfsserver/lib/files/filesystem_resource.cc Fri Dec 02 00:48:55 2022 +0100 +++ b/libfsserver/lib/files/filesystem_resource.cc Fri Dec 02 00:49:52 2022 +0100 @@ -1,7 +1,7 @@ /* * A resource supporting the creation of user-specific opener resources. * - * Copyright (C) 2021 Paul Boddie + * Copyright (C) 2021, 2022 Paul Boddie * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as @@ -29,14 +29,9 @@ { } -int FilesystemResource::expected_items() +ipc_server_default_config_type FilesystemResource::config() { - return FilesystemObject_expected_items; -} - -ipc_server_handler_type FilesystemResource::handler() -{ - return (ipc_server_handler_type) handle_FilesystemObject; + return config_FilesystemObject; } // vim: tabstop=4 expandtab shiftwidth=4 diff -r 4c2ca0e1bc85 -r 3b84f92ed69c libfsserver/lib/files/opener_context_resource.cc --- a/libfsserver/lib/files/opener_context_resource.cc Fri Dec 02 00:48:55 2022 +0100 +++ b/libfsserver/lib/files/opener_context_resource.cc Fri Dec 02 00:49:52 2022 +0100 @@ -36,14 +36,9 @@ { } -int OpenerContextResource::expected_items() +ipc_server_default_config_type OpenerContextResource::config() { - return OpenerContextObject_expected_items; -} - -ipc_server_handler_type OpenerContextResource::handler() -{ - return (ipc_server_handler_type) handle_OpenerContextObject; + return config_OpenerContextObject; } diff -r 4c2ca0e1bc85 -r 3b84f92ed69c libfsserver/lib/files/opener_resource.cc --- a/libfsserver/lib/files/opener_resource.cc Fri Dec 02 00:48:55 2022 +0100 +++ b/libfsserver/lib/files/opener_resource.cc Fri Dec 02 00:49:52 2022 +0100 @@ -34,14 +34,9 @@ { } -int OpenerResource::expected_items() +ipc_server_default_config_type OpenerResource::config() { - return Opener_expected_items; -} - -ipc_server_handler_type OpenerResource::handler() -{ - return (ipc_server_handler_type) handle_Opener; + return config_Opener; } diff -r 4c2ca0e1bc85 -r 3b84f92ed69c libfsserver/lib/generic/resource_server.cc --- a/libfsserver/lib/generic/resource_server.cc Fri Dec 02 00:48:55 2022 +0100 +++ b/libfsserver/lib/generic/resource_server.cc Fri Dec 02 00:49:52 2022 +0100 @@ -87,10 +87,12 @@ void resource_init_config(ipc_server_config_type *config, Resource *resource) { + ipc_server_default_config_type default_config = resource->config(); + config->handler_obj = resource->interface(); config->finaliser_obj = resource; - config->expected_items = resource->expected_items(); - config->handler = resource->handler(); + config->expected_items = default_config.expected_items; + config->handler = default_config.handler; } /* Set a configuration to be threaded. */ diff -r 4c2ca0e1bc85 -r 3b84f92ed69c libfsserver/lib/pipes/pipe_opener_resource.cc --- a/libfsserver/lib/pipes/pipe_opener_resource.cc Fri Dec 02 00:48:55 2022 +0100 +++ b/libfsserver/lib/pipes/pipe_opener_resource.cc Fri Dec 02 00:49:52 2022 +0100 @@ -37,14 +37,9 @@ { } -int PipeOpenerResource::expected_items() +ipc_server_default_config_type PipeOpenerResource::config() { - return PipeOpener_expected_items; -} - -ipc_server_handler_type PipeOpenerResource::handler() -{ - return (ipc_server_handler_type) handle_PipeOpener; + return config_PipeOpener; } diff -r 4c2ca0e1bc85 -r 3b84f92ed69c libfsserver/lib/pipes/pipe_pager.cc --- a/libfsserver/lib/pipes/pipe_pager.cc Fri Dec 02 00:48:55 2022 +0100 +++ b/libfsserver/lib/pipes/pipe_pager.cc Fri Dec 02 00:49:52 2022 +0100 @@ -42,14 +42,9 @@ _mapper = _paging->current_region(_writing); } -int PipePager::expected_items() +ipc_server_default_config_type PipePager::config() { - return PipeObject_expected_items; -} - -ipc_server_handler_type PipePager::handler() -{ - return (ipc_server_handler_type) handle_PipeObject; + return config_PipeObject; } diff -r 4c2ca0e1bc85 -r 3b84f92ed69c libipc/include/ipc/server.h --- a/libipc/include/ipc/server.h Fri Dec 02 00:48:55 2022 +0100 +++ b/libipc/include/ipc/server.h Fri Dec 02 00:49:52 2022 +0100 @@ -30,22 +30,17 @@ /* A convenience macro for invoking the server mainloop. */ #define ipc_server_loop_for(TYPE, POINTER, NAME) \ - _ipc_server_loop_for(TYPE##_expected_items, (TYPE *) POINTER, \ - (ipc_server_handler_type) handle_##TYPE, \ - NAME) + _ipc_server_loop_for(&config_##TYPE, (TYPE *) POINTER, NAME) /* A convenience macro for initialising a server. */ #define ipc_server_init_for(CONFIG, TYPE, POINTER) \ - _ipc_server_init_for(CONFIG, TYPE##_expected_items, (TYPE *) POINTER, \ - (ipc_server_handler_type) handle_##TYPE) + _ipc_server_init_for(CONFIG, &config_##TYPE, (TYPE *) POINTER) /* A convenience macro for adding a configuration to an existing server. */ #define ipc_server_add_config(CONFIG, TYPE, POINTER, THREAD) \ - _ipc_server_add_config(CONFIG, TYPE##_expected_items, (TYPE *) POINTER, \ - (ipc_server_handler_type) handle_##TYPE, \ - THREAD) + _ipc_server_add_config(CONFIG, &config_##TYPE, (TYPE *) POINTER, THREAD) /* A handler function type. */ @@ -93,6 +88,15 @@ } ipc_server_config_type; +/* Server configuration defaults. */ + +typedef struct ipc_server_default_config_type +{ + int expected_items; + ipc_server_handler_type handler; + +} ipc_server_default_config_type; + /* Associate a notification IRQ with an IPC gate in the main thread. */ @@ -127,23 +131,25 @@ /* Handle incoming messages for a server. */ -long _ipc_server_loop_for(int expected_items, void *handler_obj, - ipc_server_handler_type handler, const char *name); +long _ipc_server_loop_for(ipc_server_default_config_type *default_config, + void *handler_obj, const char *name); /* Initialise a server. */ -long _ipc_server_init_for(ipc_server_config_type *config, int expected_items, - void *handler_obj, ipc_server_handler_type handler); +long _ipc_server_init_for(ipc_server_config_type *config, + ipc_server_default_config_type *default_config, + void *handler_obj); /* Add handling of incoming messages to an existing server. */ -long _ipc_server_add_config(ipc_server_config_type *config, int expected_items, - void *handler_obj, ipc_server_handler_type handler, +long _ipc_server_add_config(ipc_server_config_type *config, + ipc_server_default_config_type *default_config, + void *handler_obj, l4_cap_idx_t thread); /* Handle incoming messages and IRQ notifications for a server. */ -long ipc_server_managed_loop(int expected_items, ipc_server_config_type *config); +long ipc_server_managed_loop(ipc_server_config_type *config); /* A pthread-compatible mainloop initiation function. */ diff -r 4c2ca0e1bc85 -r 3b84f92ed69c libipc/lib/src/server.c --- a/libipc/lib/src/server.c Fri Dec 02 00:48:55 2022 +0100 +++ b/libipc/lib/src/server.c Fri Dec 02 00:49:52 2022 +0100 @@ -153,8 +153,9 @@ /* Support for the convenience macro starting a server for a given object. */ -long _ipc_server_loop_for(int expected_items, void *handler_obj, - ipc_server_handler_type handler, const char *name) +long _ipc_server_loop_for(ipc_server_default_config_type *default_config, + void *handler_obj, + const char *name) { ipc_server_config_type config; long err; @@ -166,20 +167,21 @@ return err; } - _ipc_server_init_for(&config, expected_items, handler_obj, handler); + _ipc_server_init_for(&config, default_config, handler_obj); return ipc_server_start_config(&config); } /* Initialise a server for a given object. */ -long _ipc_server_init_for(ipc_server_config_type *config, int expected_items, - void *handler_obj, ipc_server_handler_type handler) +long _ipc_server_init_for(ipc_server_config_type *config, + ipc_server_default_config_type *default_config, + void *handler_obj) { ipc_server_init_config(config); - config->expected_items = expected_items; - config->handler = handler; + config->expected_items = default_config->expected_items; + config->handler = default_config->handler; config->handler_obj = handler_obj; return L4_EOK; @@ -187,11 +189,12 @@ /* Associate a new configuration with an existing server endpoint. */ -long _ipc_server_add_config(ipc_server_config_type *config, int expected_items, - void *handler_obj, ipc_server_handler_type handler, +long _ipc_server_add_config(ipc_server_config_type *config, + ipc_server_default_config_type *default_config, + void *handler_obj, l4_cap_idx_t thread) { - _ipc_server_init_for(config, expected_items, handler_obj, handler); + _ipc_server_init_for(config, default_config, handler_obj); return ipc_server_start_config_thread(config, thread); } @@ -211,7 +214,7 @@ /* A server main loop handling endpoint deletion for an IPC gate dedicated to a particular object within its own thread. */ -long ipc_server_managed_loop(int expected_items, ipc_server_config_type *config) +long ipc_server_managed_loop(ipc_server_config_type *config) { ipc_message_t msg; l4_umword_t label, irq_label; @@ -222,7 +225,7 @@ /* Declare the extent to which capabilities are expected in messages. */ - long err = ipc_message_expect(&msg, expected_items); + long err = ipc_message_expect(&msg, config->expected_items); if (err) return err; @@ -271,7 +274,7 @@ { ipc_server_config_type *config = (ipc_server_config_type *) data; - long err = ipc_server_managed_loop(config->expected_items, config); + long err = ipc_server_managed_loop(config); if (config->finaliser != NULL) config->finaliser(config);