From a4d997da3d6ba16cc0c7dd112094d3fa28dad0dd Mon Sep 17 00:00:00 2001 From: Jakob Bornecrantz Date: Fri, 18 Apr 2025 15:51:52 +0100 Subject: [PATCH] ipc: Expose no_stdin option through interface Part-of: --- src/xrt/ipc/server/ipc_server.h | 5 ++++- src/xrt/ipc/server/ipc_server_interface.h | 3 +++ .../ipc/server/ipc_server_mainloop_android.c | 2 +- src/xrt/ipc/server/ipc_server_mainloop_linux.c | 17 +++++------------ .../ipc/server/ipc_server_mainloop_windows.cpp | 5 +++-- src/xrt/ipc/server/ipc_server_process.c | 14 +++++++++++++- 6 files changed, 29 insertions(+), 17 deletions(-) diff --git a/src/xrt/ipc/server/ipc_server.h b/src/xrt/ipc/server/ipc_server.h index 7bda606d3..16e3f48f2 100644 --- a/src/xrt/ipc/server/ipc_server.h +++ b/src/xrt/ipc/server/ipc_server.h @@ -335,7 +335,7 @@ ipc_server_mainloop_deinit(struct ipc_server_mainloop *ml); * @public @memberof ipc_server_mainloop */ int -ipc_server_mainloop_init(struct ipc_server_mainloop *ml); +ipc_server_mainloop_init(struct ipc_server_mainloop *ml, bool no_stdin); /*! * @brief Poll the mainloop. @@ -423,6 +423,9 @@ struct ipc_server * User data passed to callbacks. */ void *callback_data; + + //! Disable listening on stdin for server stop. + bool no_stdin; }; /*! diff --git a/src/xrt/ipc/server/ipc_server_interface.h b/src/xrt/ipc/server/ipc_server_interface.h index a4bf829ed..19ccec04c 100644 --- a/src/xrt/ipc/server/ipc_server_interface.h +++ b/src/xrt/ipc/server/ipc_server_interface.h @@ -39,6 +39,9 @@ struct ipc_server_main_info //! Flag whether runtime should exit on app disconnect. bool exit_on_disconnect; + + //! Disable listening on stdin for server stop. + bool no_stdin; }; /*! diff --git a/src/xrt/ipc/server/ipc_server_mainloop_android.c b/src/xrt/ipc/server/ipc_server_mainloop_android.c index 461ca4c38..96a04f6bc 100644 --- a/src/xrt/ipc/server/ipc_server_mainloop_android.c +++ b/src/xrt/ipc/server/ipc_server_mainloop_android.c @@ -139,7 +139,7 @@ ipc_server_mainloop_poll(struct ipc_server *vs, struct ipc_server_mainloop *ml) } int -ipc_server_mainloop_init(struct ipc_server_mainloop *ml) +ipc_server_mainloop_init(struct ipc_server_mainloop *ml, bool no_stdin) { int ret = init_pipe(ml); if (ret < 0) { diff --git a/src/xrt/ipc/server/ipc_server_mainloop_linux.c b/src/xrt/ipc/server/ipc_server_mainloop_linux.c index d364fbed3..36bf3e31d 100644 --- a/src/xrt/ipc/server/ipc_server_mainloop_linux.c +++ b/src/xrt/ipc/server/ipc_server_mainloop_linux.c @@ -1,4 +1,5 @@ // Copyright 2020-2021, Collabora, Ltd. +// Copyright 2025, NVIDIA CORPORATION. // SPDX-License-Identifier: BSL-1.0 /*! * @file @@ -46,14 +47,6 @@ #include #endif -/* - * "XRT_NO_STDIN" option disables stdin and prevents monado-service from terminating. - * This could be useful for situations where there is no proper or in a non-interactive shell. - * Two example scenarios are: - * * IDE terminals, - * * Some scripting environments where monado-service is spawned in the background - */ -DEBUG_GET_ONCE_BOOL_OPTION(skip_stdin, "XRT_NO_STDIN", false) /* * @@ -175,7 +168,7 @@ init_listen_socket(struct ipc_server_mainloop *ml) } static int -init_epoll(struct ipc_server_mainloop *ml) +init_epoll(struct ipc_server_mainloop *ml, bool no_stdin) { int ret = epoll_create1(EPOLL_CLOEXEC); if (ret < 0) { @@ -186,7 +179,7 @@ init_epoll(struct ipc_server_mainloop *ml) struct epoll_event ev = {0}; - if (!ml->launched_by_socket && !debug_get_bool_option_skip_stdin()) { + if (!ml->launched_by_socket && !no_stdin) { // Can't do this when launched by systemd socket activation by // default. // This polls stdin. @@ -265,7 +258,7 @@ ipc_server_mainloop_poll(struct ipc_server *vs, struct ipc_server_mainloop *ml) } int -ipc_server_mainloop_init(struct ipc_server_mainloop *ml) +ipc_server_mainloop_init(struct ipc_server_mainloop *ml, bool no_stdin) { IPC_TRACE_MARKER(); @@ -275,7 +268,7 @@ ipc_server_mainloop_init(struct ipc_server_mainloop *ml) return ret; } - ret = init_epoll(ml); + ret = init_epoll(ml, no_stdin); if (ret < 0) { ipc_server_mainloop_deinit(ml); return ret; diff --git a/src/xrt/ipc/server/ipc_server_mainloop_windows.cpp b/src/xrt/ipc/server/ipc_server_mainloop_windows.cpp index 27e7659b0..2ea7bd9b2 100644 --- a/src/xrt/ipc/server/ipc_server_mainloop_windows.cpp +++ b/src/xrt/ipc/server/ipc_server_mainloop_windows.cpp @@ -1,5 +1,6 @@ // Copyright 2022, Magic Leap, Inc. // Copyright 2020-2022, Collabora, Ltd. +// Copyright 2025, NVIDIA CORPORATION. // SPDX-License-Identifier: BSL-1.0 /*! * @file @@ -218,7 +219,7 @@ ipc_server_mainloop_poll(struct ipc_server *vs, struct ipc_server_mainloop *ml) { IPC_TRACE_MARKER(); - if (_kbhit()) { + if (!vs->no_stdin && _kbhit()) { U_LOG_E("console input! exiting..."); ipc_server_handle_shutdown_signal(vs); return; @@ -249,7 +250,7 @@ ipc_server_mainloop_poll(struct ipc_server *vs, struct ipc_server_mainloop *ml) } int -ipc_server_mainloop_init(struct ipc_server_mainloop *ml) +ipc_server_mainloop_init(struct ipc_server_mainloop *ml, bool no_stdin) { IPC_TRACE_MARKER(); diff --git a/src/xrt/ipc/server/ipc_server_process.c b/src/xrt/ipc/server/ipc_server_process.c index 020150d55..126914234 100644 --- a/src/xrt/ipc/server/ipc_server_process.c +++ b/src/xrt/ipc/server/ipc_server_process.c @@ -61,6 +61,15 @@ DEBUG_GET_ONCE_BOOL_OPTION(exit_when_idle, "IPC_EXIT_WHEN_IDLE", false) DEBUG_GET_ONCE_NUM_OPTION(exit_when_idle_delay_ms, "IPC_EXIT_WHEN_IDLE_DELAY_MS", 5000) DEBUG_GET_ONCE_LOG_OPTION(ipc_log, "IPC_LOG", U_LOGGING_INFO) +/* + * "XRT_NO_STDIN" option disables stdin and prevents monado-service from terminating. + * This could be useful for situations where there is no proper or in a non-interactive shell. + * Two example scenarios are: + * * IDE terminals, + * * Some scripting environments where monado-service is spawned in the background + */ +DEBUG_GET_ONCE_BOOL_OPTION(no_stdin, "XRT_NO_STDIN", false) + /* * @@ -504,7 +513,7 @@ init_all(struct ipc_server *s, xret = xrt_instance_create(NULL, &s->xinst); IPC_CHK_WITH_GOTO(s, xret, "xrt_instance_create", error); - ret = ipc_server_mainloop_init(&s->ml); + ret = ipc_server_mainloop_init(&s->ml, s->no_stdin); if (ret < 0) { xret = XRT_ERROR_IPC_MAINLOOP_FAILED_TO_INIT; } @@ -1071,6 +1080,9 @@ ipc_server_main_common(const struct ipc_server_main_info *ismi, // Allocate the server itself. struct ipc_server *s = U_TYPED_CALLOC(struct ipc_server); + // Can be set by either. + s->no_stdin = ismi->no_stdin || debug_get_bool_option_no_stdin(); + #ifdef XRT_OS_WINDOWS timeBeginPeriod(1); #endif -- 2.51.2