# HG changeset patch # User Paul Boddie # Date 1676655678 -3600 # Node ID f8f29bf0e4d7546dba491ae258291b5ec414f4b9 # Parent 4cc570dec22f7403f9a0412b5231d50ad563a581 Added initial support for communicating process/task signals as notifications. diff -r 4cc570dec22f -r f8f29bf0e4d7 libexec/include/exec/external_pager.h --- a/libexec/include/exec/external_pager.h Fri Feb 17 18:39:43 2023 +0100 +++ b/libexec/include/exec/external_pager.h Fri Feb 17 18:41:18 2023 +0100 @@ -1,7 +1,7 @@ /* * A system pager implementation residing in a separate task. * - * Copyright (C) 2022 Paul Boddie + * Copyright (C) 2022, 2023 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 @@ -23,6 +23,7 @@ #include +#include "notifier_interface.h" #include "parent_pager_object_interface.h" @@ -31,6 +32,9 @@ class ExternalPager : public ExecPager, public ParentPagerObject { +protected: + Notifier *_notifier = NULL; + public: explicit ExternalPager(address_t start = 0, address_t end = 0); @@ -50,6 +54,11 @@ /* Parent methods. */ virtual long signal(unsigned long sig, unsigned long val); + + /* Notification methods. */ + + virtual void set_notifier(Notifier *notifier) + { _notifier = notifier; } }; /* vim: tabstop=2 expandtab shiftwidth=2 diff -r 4cc570dec22f -r f8f29bf0e4d7 libexec/include/exec/process_creator.h --- a/libexec/include/exec/process_creator.h Fri Feb 17 18:39:43 2023 +0100 +++ b/libexec/include/exec/process_creator.h Fri Feb 17 18:41:18 2023 +0100 @@ -83,6 +83,8 @@ explicit ProcessCreator(const char *rm_filename); long start(file_t *file, int argc, const char *argv[]); + + void set_notifier(Notifier *notifier); }; /* vim: tabstop=2 expandtab shiftwidth=2 diff -r 4cc570dec22f -r f8f29bf0e4d7 libexec/lib/src/Makefile --- a/libexec/lib/src/Makefile Fri Feb 17 18:39:43 2023 +0100 +++ b/libexec/lib/src/Makefile Fri Feb 17 18:41:18 2023 +0100 @@ -15,7 +15,7 @@ # Required interfaces. -CLIENT_INTERFACES_CC = dataspace mapped_file +CLIENT_INTERFACES_CC = dataspace mapped_file notifier SERVER_INTERFACES_CC = pager_object parent_pager_object diff -r 4cc570dec22f -r f8f29bf0e4d7 libexec/lib/src/external_pager.cc --- a/libexec/lib/src/external_pager.cc Fri Feb 17 18:39:43 2023 +0100 +++ b/libexec/lib/src/external_pager.cc Fri Feb 17 18:41:18 2023 +0100 @@ -163,7 +163,9 @@ long ExternalPager::signal(unsigned long sig, unsigned long val) { - printf("Signal %ld with value %ld received.\n", sig, val); + if (_notifier != NULL) + _notifier->notify(NOTIFY_TASK_SIGNAL); + return L4_EOK; } diff -r 4cc570dec22f -r f8f29bf0e4d7 libexec/lib/src/process_creator.cc --- a/libexec/lib/src/process_creator.cc Fri Feb 17 18:39:43 2023 +0100 +++ b/libexec/lib/src/process_creator.cc Fri Feb 17 18:41:18 2023 +0100 @@ -306,5 +306,10 @@ return start_program(argc, argv); } +void ProcessCreator::set_notifier(Notifier *notifier) +{ + _exec_pager.set_notifier(notifier); +} + /* vim: tabstop=2 expandtab shiftwidth=2 */ diff -r 4cc570dec22f -r f8f29bf0e4d7 tests/Makefile --- a/tests/Makefile Fri Feb 17 18:39:43 2023 +0100 +++ b/tests/Makefile Fri Feb 17 18:41:18 2023 +0100 @@ -32,11 +32,14 @@ # Required interfaces. -CLIENT_INTERFACES_CC = dataspace +CLIENT_INTERFACES_CC_dstest_exec = notifier +CLIENT_INTERFACES_CC_dstest_file_mapping = dataspace +CLIENT_INTERFACES_CC = dataspace notifier # Generated and plain source files. -CLIENT_INTERFACES_SRC_CC = $(call interfaces_to_client_cc,$(CLIENT_INTERFACES_CC)) +CLIENT_INTERFACES_SRC_CC_dstest_exec = $(call interfaces_to_client_cc,$(CLIENT_INTERFACES_CC_dstest_exec)) +CLIENT_INTERFACES_SRC_CC_dstest_file_mapping = $(call interfaces_to_client_cc,$(CLIENT_INTERFACES_CC_dstest_file_mapping)) # Normal source files. @@ -66,10 +69,11 @@ SRC_CC_dstest_test_client = dstest_test_client.cc -SRC_CC_dstest_exec = dstest_exec.cc +PLAIN_SRC_CC_dstest_exec = dstest_exec.cc +SRC_CC_dstest_exec = $(PLAIN_SRC_CC_dstest_exec) $(CLIENT_INTERFACES_SRC_CC_dstest_exec) PLAIN_SRC_CC_dstest_file_mapping = dstest_file_mapping.cc -SRC_CC_dstest_file_mapping = $(PLAIN_SRC_CC_dstest_file_mapping) $(CLIENT_INTERFACES_SRC_CC) +SRC_CC_dstest_file_mapping = $(PLAIN_SRC_CC_dstest_file_mapping) $(CLIENT_INTERFACES_SRC_CC_dstest_file_mapping) SRC_CC_dstest_align = dstest_align.cc @@ -79,4 +83,6 @@ include $(L4DIR)/mk/prog.mk include $(IDL_MK_DIR)/interface_rules.mk -$(PLAIN_SRC_CC_dstest_file_mapping): $(CLIENT_INTERFACES_SRC_CC) +$(PLAIN_SRC_CC_dstest_exec): $(CLIENT_INTERFACES_SRC_CC_dstest_exec) + +$(PLAIN_SRC_CC_dstest_file_mapping): $(CLIENT_INTERFACES_SRC_CC_dstest_file_mapping) diff -r 4cc570dec22f -r f8f29bf0e4d7 tests/dstest_exec.cc --- a/tests/dstest_exec.cc Fri Feb 17 18:39:43 2023 +0100 +++ b/tests/dstest_exec.cc Fri Feb 17 18:41:18 2023 +0100 @@ -25,11 +25,25 @@ #include #include +#include #include +class local_Notifier : public Notifier +{ +public: + long notify(notify_flags_t flags) + { + printf("Notified with flags: %" pFMTnotify_flags "x\n", flags); + + return L4_EOK; + } +}; + + + int main(int argc, char *argv[]) { long err; @@ -52,6 +66,9 @@ return 1; } + local_Notifier notifier; + + creator.set_notifier(¬ifier); err = creator.start(program_file, argc - 2, (const char **) argv + 2); if (err)