# HG changeset patch # User Paul Boddie # Date 1654468574 -7200 # Node ID e54ba46787b6bd6b11b0179667a05531be34dbb0 # Parent 8345cdd26583d4e2c85a52c729082bf9e2c12104 Introduced another convenience macro for initialising servers plus a function for completing initialisation of servers in separate threads. diff -r 8345cdd26583 -r e54ba46787b6 libipc/include/ipc/server.h --- a/libipc/include/ipc/server.h Sun Jun 05 21:30:59 2022 +0200 +++ b/libipc/include/ipc/server.h Mon Jun 06 00:36:14 2022 +0200 @@ -34,6 +34,12 @@ (ipc_server_handler_type) handle_##TYPE, \ 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) + /* A convenience macro for adding a configuration to an existing server. */ #define ipc_server_add_config(CONFIG, TYPE, POINTER, THREAD) \ @@ -124,6 +130,11 @@ long _ipc_server_loop_for(int expected_items, void *handler_obj, ipc_server_handler_type handler, 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); + /* Add handling of incoming messages to an existing server. */ long _ipc_server_add_config(ipc_server_config_type *config, int expected_items, @@ -160,6 +171,11 @@ long ipc_server_start_config(ipc_server_config_type *config); +/* Initialise and start a server using the given configuration and thread. */ + +long ipc_server_start_config_thread(ipc_server_config_type *config, + l4_cap_idx_t thread); + EXTERN_C_END /* vim: tabstop=2 expandtab shiftwidth=2 diff -r 8345cdd26583 -r e54ba46787b6 libipc/lib/src/server.c --- a/libipc/lib/src/server.c Sun Jun 05 21:30:59 2022 +0200 +++ b/libipc/lib/src/server.c Mon Jun 06 00:36:14 2022 +0200 @@ -166,24 +166,38 @@ return err; } - ipc_server_init_config(&config); - config.expected_items = expected_items; - config.handler = handler; - config.handler_obj = handler_obj; + _ipc_server_init_for(&config, expected_items, handler_obj, handler); 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) +{ + ipc_server_init_config(config); + + config->expected_items = expected_items; + config->handler = handler; + config->handler_obj = handler_obj; +} + /* 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, l4_cap_idx_t thread) { - ipc_server_init_config(config); - config->expected_items = expected_items; - config->handler = handler; - config->handler_obj = handler_obj; + _ipc_server_init_for(config, expected_items, handler_obj, handler); + return ipc_server_start_config_thread(config, thread); +} + +/* Complete initialisation of a server in the given thread. */ + +long ipc_server_start_config_thread(ipc_server_config_type *config, + l4_cap_idx_t thread) +{ config->thread = thread; config->config_thread = 1; diff -r 8345cdd26583 -r e54ba46787b6 tests/dstest_exec.cc --- a/tests/dstest_exec.cc Sun Jun 05 21:30:59 2022 +0200 +++ b/tests/dstest_exec.cc Mon Jun 06 00:36:14 2022 +0200 @@ -286,24 +286,6 @@ static ExecPager exec_pager; -static void init_pager(ipc_server_config_type *config) -{ - ipc_server_init_config(config); - - config->expected_items = PagerObject_expected_items; - config->handler = (ipc_server_handler_type) handle_PagerObject; - config->handler_obj = static_cast(&exec_pager); -} - -static long start_pager(ipc_server_config_type *config, pthread_t thread) -{ - config->config_thread = 1; - config->thread = pthread_l4_cap(thread); - - printf("Starting pager thread...\n"); - return ipc_server_start_config(config); -} - int main(int argc, char *argv[]) @@ -334,16 +316,7 @@ return 1; } - /* Start the pager. */ - - ipc_server_config_type config; - pthread_t pager_thread; - pthread_attr_t attr; - - pthread_attr_init(&attr); - pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED); - - init_pager(&config); + /* Initialise pager regions. */ for (unsigned int i = 0; i < payload->segments(); i++) { @@ -353,6 +326,17 @@ exec_pager.add(stack.region()); + /* Start the pager. */ + + pthread_t pager_thread; + pthread_attr_t attr; + + pthread_attr_init(&attr); + pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED); + + ipc_server_config_type config; + ipc_server_init_for(&config, PagerObject, &exec_pager); + err = pthread_create(&pager_thread, &attr, ipc_server_start_mainloop, &config); if (err) @@ -361,7 +345,8 @@ return 1; } - err = start_pager(&config, pager_thread); + printf("Starting pager thread...\n"); + err = ipc_server_start_config_thread(&config, pthread_l4_cap(pager_thread)); if (err) {