From 3df02058fb3d48a999bbc8d5d56c2910fbc249a4 Mon Sep 17 00:00:00 2001
From: Andreas Wacknitz <A.Wacknitz@gmx.de>
Date: Sun, 24 Mar 2024 23:37:14 +0100
Subject: [PATCH] meld: update to 3.22.2

---
 components/library/glib/patches/22-fam.patch |  357 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 357 insertions(+), 0 deletions(-)

diff --git a/components/library/glib/patches/22-fam.patch b/components/library/glib/patches/22-fam.patch
new file mode 100644
index 0000000..51f1e5b
--- /dev/null
+++ b/components/library/glib/patches/22-fam.patch
@@ -0,0 +1,357 @@
+Revert 6aa210e6af965a972a1c3a03e9abd556c45872ac 
+Required for some customers - see 31814220
+
+--- a/meson_options.txt	2023-06-26 07:39:05.868503104 -0700
++++ b/meson_options.txt	2023-06-26 07:39:26.039681486 -0700
+@@ -77,6 +77,11 @@
+        value : false,
+        description : 'Also use posix threads in case the platform defaults to another implementation (on Windows for example)')
+ 
++option('fam',
++       type : 'boolean',
++       value : false,
++       description : 'Use fam for file system monitoring')
++
+ option('tests',
+        type : 'boolean',
+        value : true,
+--- a/gio/meson.build	2023-06-26 07:39:55.405741615 -0700
++++ b/gio/meson.build	2023-06-26 07:40:20.914170757 -0700
+@@ -1100,6 +1100,7 @@
+   endforeach
+ endif
+ 
++subdir('fam')
+ if build_tests
+     subdir('tests')
+ endif
+--- a/docs/reference/gio/overview.xml	2023-06-26 07:43:32.574491070 -0700
++++ b/docs/reference/gio/overview.xml	2023-06-26 07:44:52.171474717 -0700
+@@ -392,7 +392,7 @@
+         The #GFileMonitor implementation for local files that is included
+         in GIO on Linux has the name <literal>inotify</literal>, others that are built
+         are built as modules (depending on the platform) are called
+-        <literal>kqueue</literal> and <literal>win32filemonitor</literal>.
++        <literal>fam</literal>, <literal>kqueue</literal> and <literal>win32filemonitor</literal>.
+       </para><para>
+         The special value <literal>help</literal> can be used to print a list of
+         available implementations to standard output.
+@@ -665,7 +665,7 @@
+       </para>
+       <para>
+         GIO uses this extension point internally, to switch between
+-        its kqueue-based and inotify-based file monitoring implementations.
++        its fam-based and inotify-based file monitoring implementations.
+       </para>
+    </formalpara>
+ 
+--- a/docs/reference/gio/meson.build	2023-06-26 07:45:17.347220450 -0700
++++ b/docs/reference/gio/meson.build	2023-06-26 07:45:33.867624140 -0700
+@@ -3,6 +3,7 @@
+   subdir('xml')
+ 
+   ignore_headers = [
++    'fam',
+     'gdbus-2.0',
+     'inotify',
+     'kqueue',
+--- a/gio/fam/gfamfilemonitor.map	2023-06-26 07:48:33.508579231 -0700
++++ b/gio/fam/gfamfilemonitor.map	2023-06-26 07:42:21.369994717 -0700
+@@ -0,0 +1,8 @@
++{
++global:
++  g_io_module_load;
++  g_io_module_unload;
++  g_io_module_query;
++local:
++  *;
++};
+--- a/gio/fam/gfamfilemonitor.c	2023-06-26 07:48:25.344771924 -0700
++++ b/gio/fam/gfamfilemonitor.c	2023-06-26 07:42:21.365393800 -0700
+@@ -0,0 +1,235 @@
++/*
++ * Copyright �� 2015 Canonical Limited
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License as published by the Free Software Foundation; either
++ * version 2.1 of the License, or (at your option) any later version.
++ *
++ * This library is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General
++ * Public License along with this library; if not, see <http://www.gnu.org/licenses/>.
++ *
++ * Author: Ryan Lortie <desrt@desrt.ca>
++ */
++
++#include "config.h"
++
++#include <gio/glocalfilemonitor.h>
++#include <gio/giomodule.h>
++#include "glib-private.h"
++#include <glib-unix.h>
++#include <fam.h>
++
++static GMutex         fam_lock;
++static gboolean       fam_initialised;
++static FAMConnection  fam_connection;
++static GSource       *fam_source;
++
++#define G_TYPE_FAM_FILE_MONITOR      (g_fam_file_monitor_get_type ())
++#define G_FAM_FILE_MONITOR(inst)     (G_TYPE_CHECK_INSTANCE_CAST ((inst), \
++                                      G_TYPE_FAM_FILE_MONITOR, GFamFileMonitor))
++
++typedef GLocalFileMonitorClass GFamFileMonitorClass;
++
++typedef struct
++{
++  GLocalFileMonitor parent_instance;
++
++  FAMRequest request;
++} GFamFileMonitor;
++
++static GType g_fam_file_monitor_get_type (void);
++G_DEFINE_DYNAMIC_TYPE (GFamFileMonitor, g_fam_file_monitor, G_TYPE_LOCAL_FILE_MONITOR)
++
++static gboolean
++g_fam_file_monitor_callback (gint         fd,
++                             GIOCondition condition,
++                             gpointer     user_data)
++{
++  gint64 now = g_source_get_time (fam_source);
++
++  g_mutex_lock (&fam_lock);
++
++  while (FAMPending (&fam_connection))
++    {
++      const gchar *child;
++      FAMEvent ev;
++
++      if (FAMNextEvent (&fam_connection, &ev) != 1)
++        {
++          /* The daemon died.  We're in a really bad situation now
++           * because we potentially have a bunch of request structures
++           * outstanding which no longer make any sense to anyone.
++           *
++           * The best thing that we can do is do nothing.  Notification
++           * won't work anymore for this process.
++           */
++          g_mutex_unlock (&fam_lock);
++
++          g_warning ("Lost connection to FAM (file monitoring) service.  Expect no further file monitor events.");
++
++          return FALSE;
++        }
++
++      /* We expect ev.filename to be a relative path for children in a
++       * monitored directory, and an absolute path for a monitored file
++       * or the directory itself.
++       */
++      if (ev.filename[0] != '/')
++        child = ev.filename;
++      else
++        child = NULL;
++
++      switch (ev.code)
++        {
++        case FAMAcknowledge:
++          g_source_unref (ev.userdata);
++          break;
++
++        case FAMChanged:
++          g_file_monitor_source_handle_event (ev.userdata, G_FILE_MONITOR_EVENT_CHANGED, child, NULL, NULL, now);
++          break;
++
++        case FAMDeleted:
++          g_file_monitor_source_handle_event (ev.userdata, G_FILE_MONITOR_EVENT_DELETED, child, NULL, NULL, now);
++          break;
++
++        case FAMCreated:
++          g_file_monitor_source_handle_event (ev.userdata, G_FILE_MONITOR_EVENT_CREATED, child, NULL, NULL, now);
++          break;
++
++        default:
++          /* unknown type */
++          break;
++        }
++    }
++
++  g_mutex_unlock (&fam_lock);
++
++  return TRUE;
++}
++
++static gboolean
++g_fam_file_monitor_is_supported (void)
++{
++  g_mutex_lock (&fam_lock);
++
++  if (!fam_initialised)
++    {
++      fam_initialised = FAMOpen2 (&fam_connection, "GLib GIO") == 0;
++
++      if (fam_initialised)
++        {
++#ifdef HAVE_FAM_NO_EXISTS
++          /* This is a gamin extension that avoids sending all the
++           * Exists event for dir monitors
++           */
++          FAMNoExists (&fam_connection);
++#endif
++
++          fam_source = g_unix_fd_source_new (FAMCONNECTION_GETFD (&fam_connection), G_IO_IN);
++          g_source_set_callback (fam_source, (GSourceFunc) g_fam_file_monitor_callback, NULL, NULL);
++          g_source_attach (fam_source, GLIB_PRIVATE_CALL(g_get_worker_context) ());
++        }
++    }
++
++  g_mutex_unlock (&fam_lock);
++
++  return fam_initialised;
++}
++
++static gboolean
++g_fam_file_monitor_cancel (GFileMonitor *monitor)
++{
++  GFamFileMonitor *gffm = G_FAM_FILE_MONITOR (monitor);
++
++  g_mutex_lock (&fam_lock);
++
++  g_assert (fam_initialised);
++
++  FAMCancelMonitor (&fam_connection, &gffm->request);
++
++  g_mutex_unlock (&fam_lock);
++
++  return TRUE;
++}
++
++static void
++g_fam_file_monitor_start (GLocalFileMonitor  *local_monitor,
++                          const gchar        *dirname,
++                          const gchar        *basename,
++                          const gchar        *filename,
++                          GFileMonitorSource *source)
++{
++  GFamFileMonitor *gffm = G_FAM_FILE_MONITOR (local_monitor);
++
++  g_mutex_lock (&fam_lock);
++
++  g_assert (fam_initialised);
++
++  g_source_ref ((GSource *) source);
++
++  if (dirname)
++    FAMMonitorDirectory (&fam_connection, dirname, &gffm->request, source);
++  else
++    FAMMonitorFile (&fam_connection, filename, &gffm->request, source);
++
++  g_mutex_unlock (&fam_lock);
++}
++
++static void
++g_fam_file_monitor_init (GFamFileMonitor* monitor)
++{
++}
++
++static void
++g_fam_file_monitor_class_init (GFamFileMonitorClass *class)
++{
++  GFileMonitorClass *file_monitor_class = G_FILE_MONITOR_CLASS (class);
++
++  class->is_supported = g_fam_file_monitor_is_supported;
++  class->start = g_fam_file_monitor_start;
++  file_monitor_class->cancel = g_fam_file_monitor_cancel;
++}
++
++static void
++g_fam_file_monitor_class_finalize (GFamFileMonitorClass *class)
++{
++}
++
++void
++g_io_module_load (GIOModule *module)
++{
++  g_type_module_use (G_TYPE_MODULE (module));
++
++  g_fam_file_monitor_register_type (G_TYPE_MODULE (module));
++
++  g_io_extension_point_implement (G_LOCAL_FILE_MONITOR_EXTENSION_POINT_NAME,
++                                 G_TYPE_FAM_FILE_MONITOR, "fam", 10);
++
++  g_io_extension_point_implement (G_NFS_FILE_MONITOR_EXTENSION_POINT_NAME,
++                                 G_TYPE_FAM_FILE_MONITOR, "fam", 10);
++}
++
++void
++g_io_module_unload (GIOModule *module)
++{
++  g_assert_not_reached ();
++}
++
++char **
++g_io_module_query (void)
++{
++  char *eps[] = {
++    G_LOCAL_FILE_MONITOR_EXTENSION_POINT_NAME,
++    G_NFS_FILE_MONITOR_EXTENSION_POINT_NAME,
++    NULL
++  };
++
++  return g_strdupv (eps);
++}
+--- a/gio/fam/meson.build	2023-06-26 07:51:35.321884298 -0700
++++ b/gio/fam/meson.build	2023-06-26 07:42:21.397568522 -0700
+@@ -0,0 +1,36 @@
++if not get_option('fam')
++  subdir_done()
++endif
++
++fam_dep = cc.find_library('fam')
++fam_c_args = gio_c_args
++if cc.has_function('FAMNoExists', dependencies : fam_dep)
++  fam_c_args += '-DHAVE_FAM_NO_EXISTS=1'
++endif
++
++deps = [
++  fam_dep,
++  libglib_dep,
++  libgobject_dep,
++  libgio_dep,
++]
++
++symbol_map = join_paths(meson.current_source_dir(), 'gfamfilemonitor.map')
++fam_ldflags = cc.get_supported_link_arguments([
++  '-Wl,--version-script,' + symbol_map,
++  '-Wl,-no-undefined',
++])
++
++module = shared_module('giofam', 'gfamfilemonitor.c',
++  include_directories : [gmoduleinc],
++  dependencies : deps,
++  c_args : [fam_c_args, gio_c_args_internal],
++  link_args : fam_ldflags,
++  link_depends : symbol_map,
++  install_dir : glib_giomodulesdir,
++  install : true,
++)
++
++if not meson.is_cross_build()
++  meson.add_install_script('../gio-querymodules-wrapper.py', gio_querymodules.full_path(), glib_giomodulesdir)
++endif
+--- a/gio/gio-querymodules-wrapper.py	2023-06-26 08:02:42.885690403 -0700
++++ b/gio/gio-querymodules-wrapper.py	2023-06-26 08:02:36.411976824 -0700
+@@ -0,0 +1,9 @@
++#!/usr/bin/env python3
++
++import os
++import subprocess
++import sys
++
++if not os.environ.get("DESTDIR"):
++    print("GIO module cache creation...")
++    subprocess.call([sys.argv[1], sys.argv[2]])

--
Gitblit v1.9.3