From b47030911a7a526d7c5bb00edb9fd5ede278b221 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Guido=20G=C3=BCnther?= Date: Wed, 20 Aug 2025 17:59:42 +0200 Subject: [PATCH 1/3] server: Fix indent MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Guido Günther Part-of: --- src/server.c | 26 ++++++++++++++------------ 1 file changed, 14 insertions(+), 12 deletions(-) diff --git a/src/server.c b/src/server.c index 1c54eb2fb..067d385ad 100644 --- a/src/server.c +++ b/src/server.c @@ -1,6 +1,7 @@ /* * Copyright (C) 2019 Purism SPC - * 2023-2025 The Phosh Developers + * 2023-2024 The Phosh Developers + * 2025 Phosh.mobi e.V. * * SPDX-License-Identifier: GPL-3.0-or-later * Author: Guido Günther @@ -155,7 +156,7 @@ phoc_wayland_init (PhocServer *self) static void on_session_exit (GPid pid, gint status, PhocServer *self) { - g_autoptr(GError) err = NULL; + g_autoptr (GError) err = NULL; g_return_if_fail (PHOC_IS_SERVER (self)); g_spawn_close_pid (pid); @@ -179,9 +180,9 @@ on_child_setup (gpointer unused) /* phoc wants SIGUSR1 blocked due to wlroots/xwayland but we don't want to inherit that to children */ - sigemptyset(&mask); - sigaddset(&mask, SIGUSR1); - sigprocmask(SIG_UNBLOCK, &mask, NULL); + sigemptyset (&mask); + sigaddset (&mask, SIGUSR1); + sigprocmask (SIG_UNBLOCK, &mask, NULL); } @@ -324,9 +325,8 @@ phoc_server_initable_init (GInitable *initable, } self->renderer = phoc_renderer_new (self->backend, error); - if (self->renderer == NULL) { + if (self->renderer == NULL) return FALSE; - } wlr_renderer = phoc_renderer_get_wlr_renderer (self->renderer); wlr_renderer_init_wl_shm (wlr_renderer, self->wl_display); @@ -341,7 +341,9 @@ phoc_server_initable_init (GInitable *initable, self->data_device_manager = wlr_data_device_manager_create (self->wl_display); - self->compositor = wlr_compositor_create (self->wl_display, PHOC_WL_DISPLAY_VERSION, wlr_renderer); + self->compositor = wlr_compositor_create (self->wl_display, + PHOC_WL_DISPLAY_VERSION, + wlr_renderer); wl_signal_add (&self->compositor->events.new_surface, &self->new_surface); self->new_surface.notify = handle_new_surface; @@ -437,7 +439,7 @@ phoc_server_finalize (GObject *object) g_clear_pointer (&self->session_exec, g_free); if (self->inited) { - g_unsetenv("WAYLAND_DISPLAY"); + g_unsetenv ("WAYLAND_DISPLAY"); self->inited = FALSE; } @@ -517,7 +519,7 @@ phoc_server_get_default (void) if (G_UNLIKELY (instance == NULL)) { g_autoptr (GError) err = NULL; - g_debug("Creating server"); + g_debug ("Creating server"); instance = g_initable_new (PHOC_TYPE_SERVER, NULL, &err, NULL); if (instance == NULL) { g_critical ("Failed to create server: %s", err->message); @@ -577,13 +579,13 @@ phoc_server_setup (PhocServer *self, g_print ("Running compositor on wayland display '%s'\n", socket); if (!wlr_backend_start (self->backend)) { - g_warning("Failed to start backend"); + g_warning ("Failed to start backend"); wlr_backend_destroy (self->backend); wl_display_destroy (self->wl_display); return FALSE; } - g_setenv("WAYLAND_DISPLAY", socket, true); + g_setenv ("WAYLAND_DISPLAY", socket, true); if (self->flags & PHOC_SERVER_FLAG_SHELL_MODE) { g_message ("Enabling shell mode"); -- GitLab From 9c16568692f176a8b0ff001e9f2c0962b61d0ef3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Guido=20G=C3=BCnther?= Date: Wed, 20 Aug 2025 13:00:18 +0200 Subject: [PATCH 2/3] server: Use g_idle_add_once MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit It's less error prone Signed-off-by: Guido Günther Part-of: --- src/server.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/server.c b/src/server.c index 067d385ad..4ce306da9 100644 --- a/src/server.c +++ b/src/server.c @@ -186,9 +186,10 @@ on_child_setup (gpointer unused) } -static gboolean -phoc_startup_session_in_idle (PhocServer *self) +static void +phoc_startup_session_in_idle (gpointer data) { + PhocServer *self = PHOC_SERVER (data); GPid pid; g_auto (GStrv) argv; g_autoptr (GError) err = NULL; @@ -208,7 +209,6 @@ phoc_startup_session_in_idle (PhocServer *self) g_critical ("Failed to launch session: %s", err->message); g_main_loop_quit (self->mainloop); } - return FALSE; } @@ -217,7 +217,7 @@ phoc_startup_session (PhocServer *server) { gint id; - id = g_idle_add ((GSourceFunc) phoc_startup_session_in_idle, server); + id = g_idle_add_once (phoc_startup_session_in_idle, server); g_source_set_name_by_id (id, "[phoc] phoc_startup_session"); } -- GitLab From e624267844a5d364df43eeee4fdc01e0b7e85856 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Guido=20G=C3=BCnther?= Date: Wed, 20 Aug 2025 16:31:17 +0200 Subject: [PATCH 3/3] server: Bump nofile soft rlimit to the hard limit value MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Lets not run out of file descriptors when a client requests a lot of buffers. We restore the rlimit before forking of the child process. Closes: https://gitlab.gnome.org/World/Phosh/phoc/-/issues/415 Signed-off-by: Guido Günther Part-of: --- src/server.c | 43 ++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 42 insertions(+), 1 deletion(-) diff --git a/src/server.c b/src/server.c index 4ce306da9..849dbc384 100644 --- a/src/server.c +++ b/src/server.c @@ -27,6 +27,7 @@ #include #include +#include /* Maximum protocol versions we support */ #define PHOC_WL_DISPLAY_VERSION 6 @@ -70,6 +71,8 @@ typedef struct _PhocServer { GStrv dt_compatibles; + struct rlimit saved_nofile_rlimit; + struct wl_display *wl_display; guint wl_source; @@ -174,15 +177,26 @@ on_session_exit (GPid pid, gint status, PhocServer *self) static void -on_child_setup (gpointer unused) +on_child_setup (gpointer data) { + PhocServer *self = PHOC_SERVER (data); sigset_t mask; + g_assert (PHOC_IS_SERVER (data)); + /* phoc wants SIGUSR1 blocked due to wlroots/xwayland but we don't want to inherit that to children */ sigemptyset (&mask); sigaddset (&mask, SIGUSR1); sigprocmask (SIG_UNBLOCK, &mask, NULL); + + /* Restore nofile rlimit */ + if (self->saved_nofile_rlimit.rlim_cur) { + if (setrlimit (RLIMIT_NOFILE, &self->saved_nofile_rlimit)) { + g_critical ("Failed to restore nofile rlimit: %s", g_strerror (errno)); + return; + } + } } @@ -222,6 +236,30 @@ phoc_startup_session (PhocServer *server) } +static void +phoc_server_raise_nofile_rlimit (PhocServer *self) +{ + struct rlimit new_rlimit; + + if (getrlimit (RLIMIT_NOFILE, &self->saved_nofile_rlimit)) { + g_critical ("Failed to get nofile rlimit: %s", g_strerror (errno)); + return; + } + + new_rlimit = self->saved_nofile_rlimit; + new_rlimit.rlim_cur = new_rlimit.rlim_max; + + if (setrlimit (RLIMIT_NOFILE, &new_rlimit)) { + g_critical ("Failed to raise nofile rlimit: %s, max open files is %" G_GUINT64_FORMAT, + g_strerror (errno), + (guint64)self->saved_nofile_rlimit.rlim_cur); + return; + } + + g_debug ("Updated nofile current rlimit to %" G_GUINT64_FORMAT, (guint64)new_rlimit.rlim_cur); +} + + static void on_shell_state_changed (PhocServer *self, GParamSpec *pspec, PhocPhoshPrivate *phosh) { @@ -599,6 +637,9 @@ phoc_server_setup (PhocServer *self, } phoc_wayland_init (self); + + phoc_server_raise_nofile_rlimit (self); + if (self->session_exec) phoc_startup_session (self); -- GitLab