Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package gnome-remote-desktop for openSUSE:Factory checked in at 2023-05-29 22:47:56 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/gnome-remote-desktop (Old) and /work/SRC/openSUSE:Factory/.gnome-remote-desktop.new.1533 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "gnome-remote-desktop" Mon May 29 22:47:56 2023 rev:19 rq:1089552 version:44.2 Changes: -------- --- /work/SRC/openSUSE:Factory/gnome-remote-desktop/gnome-remote-desktop.changes 2023-04-24 22:32:05.639824759 +0200 +++ /work/SRC/openSUSE:Factory/.gnome-remote-desktop.new.1533/gnome-remote-desktop.changes 2023-05-29 22:48:11.414436346 +0200 @@ -1,0 +2,17 @@ +Sun May 28 09:20:44 UTC 2023 - Bjørn Lie <bjorn....@gmail.com> + +- Update to version 44.2: + + vnc-pipewire-stream and rdp-pipewire-stream: Lock buffer + mutex before removing buffer entry. + + vnc and rdp: Ensure PipeWire buffers to be queued before + destroying them. + + Updated translations. + +------------------------------------------------------------------- +Thu May 18 04:19:42 UTC 2023 - Luciano Santos <luc1...@opensuse.org> + +- Drop %systemd_user_postun_with_restart macro from the %postun + directive. It's been deprecated and emptied (expands to nil) on + both Tumbleweed and Leap already. + +------------------------------------------------------------------- Old: ---- gnome-remote-desktop-44.1.obscpio New: ---- gnome-remote-desktop-44.2.obscpio ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ gnome-remote-desktop.spec ++++++ --- /var/tmp/diff_new_pack.5SKhc1/_old 2023-05-29 22:48:12.798444625 +0200 +++ /var/tmp/diff_new_pack.5SKhc1/_new 2023-05-29 22:48:12.802444649 +0200 @@ -22,7 +22,7 @@ %define gstreamer_version 1.10.0 Name: gnome-remote-desktop -Version: 44.1 +Version: 44.2 Release: 0 Summary: GNOME Remote Desktop screen sharing service License: GPL-2.0-or-later @@ -92,9 +92,6 @@ %preun %systemd_user_preun %{systemd_unit} -%postun -%systemd_user_postun_with_restart %{systemd_unit} - %files %license COPYING %doc README.md ++++++ _service ++++++ --- /var/tmp/diff_new_pack.5SKhc1/_old 2023-05-29 22:48:12.834444840 +0200 +++ /var/tmp/diff_new_pack.5SKhc1/_new 2023-05-29 22:48:12.838444865 +0200 @@ -3,7 +3,7 @@ <service name="obs_scm" mode="manual"> <param name="url">https://gitlab.gnome.org/GNOME/gnome-remote-desktop.git</param> <param name="scm">git</param> - <param name="revision">refs/tags/44.1</param> + <param name="revision">refs/tags/44.2</param> <param name="versionformat">@PARENT_TAG@</param> <param name="changesgenerate">enable</param> </service> ++++++ _servicedata ++++++ --- /var/tmp/diff_new_pack.5SKhc1/_old 2023-05-29 22:48:12.870445056 +0200 +++ /var/tmp/diff_new_pack.5SKhc1/_new 2023-05-29 22:48:12.874445080 +0200 @@ -1,6 +1,6 @@ <servicedata> <service name="tar_scm"> <param name="url">https://gitlab.gnome.org/GNOME/gnome-remote-desktop.git</param> - <param name="changesrevision">66e0fa21c87f82d7aaf71846dc408fb832d43146</param></service></servicedata> + <param name="changesrevision">9d1ee9c9458636dbe4d3326dceec81dfefef56dd</param></service></servicedata> (No newline at EOF) ++++++ gnome-remote-desktop-44.1.obscpio -> gnome-remote-desktop-44.2.obscpio ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/gnome-remote-desktop-44.1/meson.build new/gnome-remote-desktop-44.2/meson.build --- old/gnome-remote-desktop-44.1/meson.build 2023-04-22 17:45:46.000000000 +0200 +++ new/gnome-remote-desktop-44.2/meson.build 2023-05-27 22:18:25.000000000 +0200 @@ -1,5 +1,5 @@ project('gnome-remote-desktop', 'c', - version: '44.1', + version: '44.2', meson_version: '>= 0.57.0', default_options: ['warning_level=1', 'buildtype=debugoptimized']) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/gnome-remote-desktop-44.1/po/it.po new/gnome-remote-desktop-44.2/po/it.po --- old/gnome-remote-desktop-44.1/po/it.po 2023-04-22 17:45:46.000000000 +0200 +++ new/gnome-remote-desktop-44.2/po/it.po 2023-05-27 22:18:25.000000000 +0200 @@ -3,24 +3,25 @@ # This file is distributed under the same license as the gnome-remote-desktop package. # Davide Ferracin <davide.ferra...@protonmail.com>, 2021. # Milo Casagrande <m...@milo.name>, 2022. +# Gianvito Cavasoli <gianv...@gmx.it>, 2023. # msgid "" msgstr "" "Project-Id-Version: gnome-remote-desktop master\n" "Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-remote-desktop/" "issues\n" -"POT-Creation-Date: 2022-02-25 22:19+0000\n" -"PO-Revision-Date: 2022-03-18 09:48+0100\n" -"Last-Translator: Milo Casagrande <m...@milo.name>\n" +"POT-Creation-Date: 2023-05-05 14:01+0000\n" +"PO-Revision-Date: 2023-05-21 02:46+0200\n" +"Last-Translator: Gianvito Cavasoli <gianv...@gmx.it>\n" "Language-Team: Italian <gnome-it-l...@gnome.org>\n" "Language: it\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" -"X-Generator: Poedit 3.0.1\n" +"Plural-Forms: nplurals=2; plural=(n != 1)\n" +"X-Generator: Gtranslator 42.0\n" -#: src/grd-daemon.c:423 +#: src/grd-daemon.c:513 msgid "GNOME Remote Desktop" msgstr "Computer remoto GNOME" @@ -46,16 +47,16 @@ msgid "Accept" msgstr "Accetta" -#: src/grd-ctl.c:44 +#: src/grd-ctl.c:53 #, c-format msgid "Usage: %s [OPTIONS...] COMMAND [SUBCOMMAND]...\n" msgstr "Uso: %s [OPZIONI...] COMANDO [SOTTOCOMANDO]...\n" -#: src/grd-ctl.c:383 +#: src/grd-ctl.c:461 msgid "Commands:\n" msgstr "Comandi:\n" -#: src/grd-ctl.c:388 +#: src/grd-ctl.c:466 msgid "" " rdp - RDP subcommands:\n" " enable - Enable the RDP backend\n" @@ -93,7 +94,7 @@ " dispositivi di ingresso\n" "\n" -#: src/grd-ctl.c:407 +#: src/grd-ctl.c:485 msgid "" " vnc - VNC subcommands:\n" " enable - Enable the VNC backend\n" @@ -124,16 +125,20 @@ " dispositivi di ingresso\n" "\n" -#: src/grd-ctl.c:422 +#: src/grd-ctl.c:500 msgid "" " status [--show-credentials] - Show current status\n" "\n" "Options:\n" +" --headless - Use headless credentials " +"storage\n" " --help - Print this help text\n" msgstr "" " status [--show-credentials] - Mostra lo stato attuale\n" "\n" "Opzioni:\n" +" --headless - Usa l'archiviazione delle " +"credenziali headless\n" " --help - Stampa questo aiuto\n" #: src/org.gnome.desktop.remote-desktop.gschema.xml.in:7 @@ -141,7 +146,7 @@ msgstr "Indica se il motore RDP è abilitato o meno" #: src/org.gnome.desktop.remote-desktop.gschema.xml.in:8 -msgid "If set to to 'true' the RDP backend will be initialized." +msgid "If set to 'true' the RDP backend will be initialized." msgstr "Se impostato a VERO, il motore RDP verrà inizializzato." #: src/org.gnome.desktop.remote-desktop.gschema.xml.in:14 @@ -156,10 +161,10 @@ "([MS-RDPBCGR] 2.2.1.3.2) or the client monitor data ([MS-RDPBCGR] " "2.2.1.3.6), depending on what is available. When using a remote desktop " "session with a virtual monitor, clients can resize the resolution of the " -"virtual monitor during a session with the Display Control Channel Extension " -"([MS-RDPEDISP]). Allowed screenshare modes include: * mirror-primary - " -"Record the primary monitor of the current user session. * extend - Create a " -"new virtual monitor and use it for the remote desktop session. The " +"virtual monitor during a session with the Display Update Virtual Channel " +"Extension ([MS-RDPEDISP]). Allowed screenshare modes include: * mirror-" +"primary - Record the primary monitor of the current user session. * extend - " +"Create a new virtual monitor and use it for the remote desktop session. The " "resolution of this virtual monitor is derived from the monitor " "configuration, submitted by the remote desktop client." msgstr "" @@ -175,7 +180,7 @@ "primary - Registra il monitor principale della sessione utente corrente. * " "extend - Crea un nuovo monitor virtuale e lo utilizza per la sessione di " "computer remoto. La risoluzione di questo monitor virtuale deriva dalla " -"configurazione del monitor, inviata dal client." +"configurazione del monitor, inviata dal client del computer remoto." #: src/org.gnome.desktop.remote-desktop.gschema.xml.in:41 msgid "Path to the certificate file" @@ -215,7 +220,7 @@ msgstr "Indica se il motore VNC è abilitato o meno" #: src/org.gnome.desktop.remote-desktop.gschema.xml.in:68 -msgid "If set to to 'true' the VNC backend will be initialized." +msgid "If set to 'true' the VNC backend will be initialized." msgstr "Se impostato a VERO, il motore VNC verrà inizializzato." #: src/org.gnome.desktop.remote-desktop.gschema.xml.in:75 @@ -244,3 +249,35 @@ "una persona che possa accedere fisicamente alla postazione per poter " "approvare esplicitamente le nuove richieste; * con password - richiedendo al " "client remoto di fornire una password prestabilita." + +#: src/org.gnome.desktop.remote-desktop.gschema.xml.in:95 +msgid "Screenshare mode of VNC connections" +msgstr "Modalità di condivisione dello schermo delle connessioni VNC" + +#: src/org.gnome.desktop.remote-desktop.gschema.xml.in:96 +msgid "" +"The screenshare mode specifies, whether the VNC backend mirrors the primary " +"screen, or whether a virtual monitor is created. For the initial resolution " +"of the virtual monitor, the VNC backend uses a default size of 1920x1080 " +"pixels. When using a remote desktop session with a virtual monitor, clients " +"can resize the resolution of the virtual monitor during a session with the " +"setDesktopSize PDU. Allowed screenshare modes include: * mirror-primary - " +"Record the primary monitor of the current user session. * extend - Create a " +"new virtual monitor and use it for the remote desktop session. The initial " +"monitor resolution of this virtual monitor is set to 1920x1080 pixels. " +"Clients can override the initial resolution with subsequent monitor " +"configuration updates." +msgstr "" +"La modalità di condivisione dello schermo specifica se il motore VNC " +"rispecchia lo schermo principale o se viene creato uno monitor virtuale. Per " +"la risoluzione iniziale del monitor virtuale, il motore VNC utilizza una " +"dimensione predefinita di 1920x1080 pixel. Quando si utilizza una sessione " +"di computer remoto con un monitor virtuale, i client possono ridimensionare " +"la risoluzione del monitor virtuale durante una sessione tramite " +"setDesktopSize PDU. Le modalità di condivisione dello schermo consentite " +"includono: * mirror-primary - Registra il monitor principale della sessione " +"utente corrente. * extend - Crea un nuovo monitor virtuale e lo utilizza per " +"la sessione di computer remoto. La risoluzione iniziale di questo monitor " +"virtuale è impostata su 1920x1080 pixel. I client possono sovrascrivere la " +"risoluzione iniziale con successivi aggiornamenti della configurazione del " +"monitor." diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/gnome-remote-desktop-44.1/src/grd-rdp-pipewire-stream.c new/gnome-remote-desktop-44.2/src/grd-rdp-pipewire-stream.c --- old/gnome-remote-desktop-44.1/src/grd-rdp-pipewire-stream.c 2023-04-22 17:45:46.000000000 +0200 +++ new/gnome-remote-desktop-44.2/src/grd-rdp-pipewire-stream.c 2023-05-27 22:18:25.000000000 +0200 @@ -57,6 +57,12 @@ gboolean success, gpointer user_data); +typedef struct +{ + GMutex buffer_mutex; + gboolean is_locked; +} BufferContext; + struct _GrdRdpFrame { gatomicrefcount refcount; @@ -134,6 +140,8 @@ struct pw_stream *pipewire_stream; struct spa_hook pipewire_stream_listener; + GHashTable *pipewire_buffers; + uint32_t src_node_id; struct spa_video_info_raw spa_format; @@ -146,6 +154,57 @@ G_DEFINE_AUTOPTR_CLEANUP_FUNC (GrdRdpFrame, grd_rdp_frame_unref) +static BufferContext * +buffer_context_new (void) +{ + BufferContext *buffer_context; + + buffer_context = g_new0 (BufferContext, 1); + g_mutex_init (&buffer_context->buffer_mutex); + + return buffer_context; +} + +static void +buffer_context_free (BufferContext *buffer_context) +{ + g_mutex_clear (&buffer_context->buffer_mutex); + + g_free (buffer_context); +} + +static void +acquire_pipewire_buffer_lock (GrdRdpPipeWireStream *stream, + struct pw_buffer *buffer) +{ + BufferContext *buffer_context = NULL; + + if (!g_hash_table_lookup_extended (stream->pipewire_buffers, buffer, + NULL, (gpointer *) &buffer_context)) + g_assert_not_reached (); + + g_mutex_lock (&buffer_context->buffer_mutex); + g_assert (!buffer_context->is_locked); + buffer_context->is_locked = TRUE; +} + +static void +maybe_release_pipewire_buffer_lock (GrdRdpPipeWireStream *stream, + struct pw_buffer *buffer) +{ + BufferContext *buffer_context = NULL; + + if (!g_hash_table_lookup_extended (stream->pipewire_buffers, buffer, + NULL, (gpointer *) &buffer_context)) + g_assert_not_reached (); + + if (!buffer_context->is_locked) + return; + + buffer_context->is_locked = FALSE; + g_mutex_unlock (&buffer_context->buffer_mutex); +} + static GrdRdpFrame * grd_rdp_frame_new (GrdRdpPipeWireStream *stream, GrdRdpFrameReadyCallback callback, @@ -447,6 +506,33 @@ } static void +on_stream_add_buffer (void *user_data, + struct pw_buffer *buffer) +{ + GrdRdpPipeWireStream *stream = user_data; + + g_hash_table_insert (stream->pipewire_buffers, buffer, buffer_context_new ()); +} + +static void +on_stream_remove_buffer (void *user_data, + struct pw_buffer *buffer) +{ + GrdRdpPipeWireStream *stream = user_data; + BufferContext *buffer_context = NULL; + + if (!g_hash_table_lookup_extended (stream->pipewire_buffers, buffer, + NULL, (gpointer *) &buffer_context)) + g_assert_not_reached (); + + /* Ensure buffer is not locked any more */ + g_mutex_lock (&buffer_context->buffer_mutex); + g_mutex_unlock (&buffer_context->buffer_mutex); + + g_hash_table_remove (stream->pipewire_buffers, buffer); +} + +static void process_mouse_pointer_bitmap (GrdRdpPipeWireStream *stream, struct spa_buffer *buffer) { @@ -532,6 +618,7 @@ g_source_set_ready_time (stream->frame_render_source, 0); out: pw_stream_queue_buffer (stream->pipewire_stream, buffer); + maybe_release_pipewire_buffer_lock (stream, buffer); g_clear_pointer (&frame, grd_rdp_frame_unref); } @@ -730,6 +817,7 @@ realize_buffer_data = g_new0 (RealizeBufferData, 1); realize_buffer_data->rdp_buffer = rdp_buffer; + acquire_pipewire_buffer_lock (stream, pw_buffer); grd_egl_thread_upload (egl_thread, stream->egl_slot, pbo, @@ -809,6 +897,7 @@ import_buffer_data->rdp_buffer = rdp_buffer; } + acquire_pipewire_buffer_lock (stream, pw_buffer); grd_egl_thread_download (egl_thread, stream->egl_slot, grd_rdp_buffer_get_pbo (rdp_buffer), @@ -905,6 +994,8 @@ PW_VERSION_STREAM_EVENTS, .state_changed = on_stream_state_changed, .param_changed = on_stream_param_changed, + .add_buffer = on_stream_add_buffer, + .remove_buffer = on_stream_remove_buffer, .process = on_stream_process, }; @@ -1200,6 +1291,8 @@ g_mutex_clear (&stream->frame_mutex); g_mutex_clear (&stream->dequeue_mutex); + g_clear_pointer (&stream->pipewire_buffers, g_hash_table_unref); + pw_deinit (); if (egl_thread) @@ -1211,6 +1304,10 @@ static void grd_rdp_pipewire_stream_init (GrdRdpPipeWireStream *stream) { + stream->pipewire_buffers = + g_hash_table_new_full (NULL, NULL, + NULL, (GDestroyNotify) buffer_context_free); + g_mutex_init (&stream->dequeue_mutex); g_mutex_init (&stream->frame_mutex); g_mutex_init (&stream->pointer_mutex); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/gnome-remote-desktop-44.1/src/grd-vnc-pipewire-stream.c new/gnome-remote-desktop-44.2/src/grd-vnc-pipewire-stream.c --- old/gnome-remote-desktop-44.1/src/grd-vnc-pipewire-stream.c 2023-04-22 17:45:46.000000000 +0200 +++ new/gnome-remote-desktop-44.2/src/grd-vnc-pipewire-stream.c 2023-05-27 22:18:25.000000000 +0200 @@ -50,6 +50,12 @@ gboolean success, gpointer user_data); +typedef struct +{ + GMutex buffer_mutex; + gboolean is_locked; +} BufferContext; + struct _GrdVncFrame { gatomicrefcount refcount; @@ -96,6 +102,8 @@ struct pw_stream *pipewire_stream; struct spa_hook pipewire_stream_listener; + GHashTable *pipewire_buffers; + uint32_t src_node_id; struct spa_video_info_raw spa_format; @@ -108,6 +116,57 @@ G_DEFINE_AUTOPTR_CLEANUP_FUNC (GrdVncFrame, grd_vnc_frame_unref) +static BufferContext * +buffer_context_new (void) +{ + BufferContext *buffer_context; + + buffer_context = g_new0 (BufferContext, 1); + g_mutex_init (&buffer_context->buffer_mutex); + + return buffer_context; +} + +static void +buffer_context_free (BufferContext *buffer_context) +{ + g_mutex_clear (&buffer_context->buffer_mutex); + + g_free (buffer_context); +} + +static void +acquire_pipewire_buffer_lock (GrdVncPipeWireStream *stream, + struct pw_buffer *buffer) +{ + BufferContext *buffer_context = NULL; + + if (!g_hash_table_lookup_extended (stream->pipewire_buffers, buffer, + NULL, (gpointer *) &buffer_context)) + g_assert_not_reached (); + + g_mutex_lock (&buffer_context->buffer_mutex); + g_assert (!buffer_context->is_locked); + buffer_context->is_locked = TRUE; +} + +static void +maybe_release_pipewire_buffer_lock (GrdVncPipeWireStream *stream, + struct pw_buffer *buffer) +{ + BufferContext *buffer_context = NULL; + + if (!g_hash_table_lookup_extended (stream->pipewire_buffers, buffer, + NULL, (gpointer *) &buffer_context)) + g_assert_not_reached (); + + if (!buffer_context->is_locked) + return; + + buffer_context->is_locked = FALSE; + g_mutex_unlock (&buffer_context->buffer_mutex); +} + static void vnc_pointer_free (VncPointer *vnc_pointer) { @@ -226,6 +285,33 @@ params, G_N_ELEMENTS (params)); } +static void +on_stream_add_buffer (void *user_data, + struct pw_buffer *buffer) +{ + GrdVncPipeWireStream *stream = user_data; + + g_hash_table_insert (stream->pipewire_buffers, buffer, buffer_context_new ()); +} + +static void +on_stream_remove_buffer (void *user_data, + struct pw_buffer *buffer) +{ + GrdVncPipeWireStream *stream = user_data; + BufferContext *buffer_context = NULL; + + if (!g_hash_table_lookup_extended (stream->pipewire_buffers, buffer, + NULL, (gpointer *) &buffer_context)) + g_assert_not_reached (); + + /* Ensure buffer is not locked any more */ + g_mutex_lock (&buffer_context->buffer_mutex); + g_mutex_unlock (&buffer_context->buffer_mutex); + + g_hash_table_remove (stream->pipewire_buffers, buffer); +} + static GrdVncFrame * grd_vnc_frame_new (GrdVncPipeWireStream *stream, GrdVncFrameReadyCallback callback, @@ -400,6 +486,7 @@ g_source_set_ready_time (stream->pending_frame_source, 0); out: pw_stream_queue_buffer (stream->pipewire_stream, buffer); + maybe_release_pipewire_buffer_lock (stream, buffer); g_clear_pointer (&frame, grd_vnc_frame_unref); } @@ -522,8 +609,9 @@ modifiers[i] = stream->spa_format.modifier; } dst_data = g_malloc0 (height * dst_stride); - frame->data = dst_data; + + acquire_pipewire_buffer_lock (stream, pw_buffer); grd_egl_thread_download (egl_thread, stream->egl_slot, 0, 0, 0, @@ -676,6 +764,8 @@ PW_VERSION_STREAM_EVENTS, .state_changed = on_stream_state_changed, .param_changed = on_stream_param_changed, + .add_buffer = on_stream_add_buffer, + .remove_buffer = on_stream_remove_buffer, .process = on_stream_process, }; @@ -972,6 +1062,8 @@ g_mutex_clear (&stream->frame_mutex); g_mutex_clear (&stream->dequeue_mutex); + g_clear_pointer (&stream->pipewire_buffers, g_hash_table_unref); + pw_deinit (); if (egl_thread) @@ -983,6 +1075,10 @@ static void grd_vnc_pipewire_stream_init (GrdVncPipeWireStream *stream) { + stream->pipewire_buffers = + g_hash_table_new_full (NULL, NULL, + NULL, (GDestroyNotify) buffer_context_free); + g_mutex_init (&stream->dequeue_mutex); g_mutex_init (&stream->frame_mutex); g_mutex_init (&stream->pointer_mutex); ++++++ gnome-remote-desktop.obsinfo ++++++ --- /var/tmp/diff_new_pack.5SKhc1/_old 2023-05-29 22:48:13.102446444 +0200 +++ /var/tmp/diff_new_pack.5SKhc1/_new 2023-05-29 22:48:13.106446467 +0200 @@ -1,5 +1,5 @@ name: gnome-remote-desktop -version: 44.1 -mtime: 1682178346 -commit: 66e0fa21c87f82d7aaf71846dc408fb832d43146 +version: 44.2 +mtime: 1685218705 +commit: 9d1ee9c9458636dbe4d3326dceec81dfefef56dd