# HG changeset patch # User Paul Boddie # Date 1679251087 -3600 # Node ID 2707dae2e91c4d66c31ece7cae387876b8af2f94 # Parent 0e0c902368d1316ed99f5e910c10d0984068372b Moved opening of the region mapper program file to the process server initialisation code, fixing the accumulation of numerous redundant file pagers. diff -r 0e0c902368d1 -r 2707dae2e91c libexec/include/exec/process_creating.h --- a/libexec/include/exec/process_creating.h Sun Mar 19 17:58:10 2023 +0100 +++ b/libexec/include/exec/process_creating.h Sun Mar 19 19:38:07 2023 +0100 @@ -38,9 +38,10 @@ protected: std::mutex _lock; - /* Region mapper program filename. */ + /* Region mapper program file. */ const char *_rm_filename; + file_t *_rm_file; /* External pager configuration. */ @@ -86,7 +87,7 @@ long start_program(int argc, const char *argv[]); public: - explicit ProcessCreating(const char *rm_filename); + explicit ProcessCreating(const char *rm_filename, file_t *rm_file); virtual long start(int argc, const char *argv[], l4_cap_idx_t *process); }; diff -r 0e0c902368d1 -r 2707dae2e91c libexec/include/exec/process_creator_resource.h --- a/libexec/include/exec/process_creator_resource.h Sun Mar 19 17:58:10 2023 +0100 +++ b/libexec/include/exec/process_creator_resource.h Sun Mar 19 19:38:07 2023 +0100 @@ -36,7 +36,7 @@ ProcessCreating _creating; public: - explicit ProcessCreatorResource(const char *rm_filename); + explicit ProcessCreatorResource(const char *rm_filename, file_t *rm_file); virtual ~ProcessCreatorResource(); diff -r 0e0c902368d1 -r 2707dae2e91c libexec/lib/src/process_creating.cc --- a/libexec/lib/src/process_creating.cc Sun Mar 19 17:58:10 2023 +0100 +++ b/libexec/lib/src/process_creating.cc Sun Mar 19 19:38:07 2023 +0100 @@ -43,8 +43,8 @@ /* Initialise the process creator with the details of a region mapper. */ -ProcessCreating::ProcessCreating(const char *rm_filename) -: _rm_filename(rm_filename) +ProcessCreating::ProcessCreating(const char *rm_filename, file_t *rm_file) +: _rm_filename(rm_filename), _rm_file(rm_file) { } @@ -54,7 +54,7 @@ long ProcessCreating::init_region_mapper() { - long err = exec_get_payload(_rm_filename, &_rm_payload, true); + long err = exec_get_payload_file(_rm_file, &_rm_payload, true); if (err) return err; diff -r 0e0c902368d1 -r 2707dae2e91c libexec/lib/src/process_creator_resource.cc --- a/libexec/lib/src/process_creator_resource.cc Sun Mar 19 17:58:10 2023 +0100 +++ b/libexec/lib/src/process_creator_resource.cc Sun Mar 19 19:38:07 2023 +0100 @@ -30,8 +30,8 @@ /* Support for creating processes. */ -ProcessCreatorResource::ProcessCreatorResource(const char *rm_filename) -: _creating(rm_filename) +ProcessCreatorResource::ProcessCreatorResource(const char *rm_filename, file_t *rm_file) +: _creating(rm_filename, rm_file) { } diff -r 0e0c902368d1 -r 2707dae2e91c servers/process_server.cc --- a/servers/process_server.cc Sun Mar 19 17:58:10 2023 +0100 +++ b/servers/process_server.cc Sun Mar 19 19:38:07 2023 +0100 @@ -22,6 +22,7 @@ #include #include +#include #include #include @@ -30,6 +31,7 @@ #include #include #include +#include @@ -59,7 +61,16 @@ return 1; } - ProcessCreatorResource creator(rm_filename); + file_t *rm_file = client_open(rm_filename, O_RDONLY); + + if (!client_opened(rm_file)) + { + err = (rm_file == NULL) ? -L4_ENOMEM : rm_file->error; + printf("Could not open region mapper file: %s\n", l4sys_errtostr(err)); + return 1; + } + + ProcessCreatorResource creator(rm_filename, rm_file); /* Register a server associating it with the given object. */