summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMilan Crha <mcrha@redhat.com>2023-01-18 17:30:40 +0100
committerMilan Crha <mcrha@redhat.com>2023-01-18 17:30:40 +0100
commitdf4ef1432576132ac9039679a58dd814102c0bf2 (patch)
tree1b5f1fceec01a01b7f79013b9cc701972170bf0d /src
parent4b20b265bb433d83d434280e86fbbdfa5950e76d (diff)
downloadevolution-data-server-df4ef1432576132ac9039679a58dd814102c0bf2.tar.gz
I#231 - Release unused memory in factories after certain operations
Closes https://gitlab.gnome.org/GNOME/evolution-data-server/-/issues/231
Diffstat (limited to 'src')
-rw-r--r--src/addressbook/libedata-book/e-book-backend.c8
-rw-r--r--src/addressbook/libedata-book/e-data-book-view.c2
-rw-r--r--src/calendar/libedata-cal/e-cal-backend.c8
-rw-r--r--src/calendar/libedata-cal/e-data-cal-view.c2
-rw-r--r--src/libedataserver/e-data-server-util.c23
-rw-r--r--src/libedataserver/e-data-server-util.h1
6 files changed, 44 insertions, 0 deletions
diff --git a/src/addressbook/libedata-book/e-book-backend.c b/src/addressbook/libedata-book/e-book-backend.c
index cde26456e..aaa08822c 100644
--- a/src/addressbook/libedata-book/e-book-backend.c
+++ b/src/addressbook/libedata-book/e-book-backend.c
@@ -552,6 +552,8 @@ book_backend_finalize (GObject *object)
/* Chain up to parent's finalize() method. */
G_OBJECT_CLASS (e_book_backend_parent_class)->finalize (object);
+
+ e_util_call_malloc_trim ();
}
static void
@@ -693,6 +695,8 @@ book_backend_shutdown (EBookBackend *backend)
"The %s instance for \"%s\" is shutting down.\n",
G_OBJECT_TYPE_NAME (backend),
e_source_get_display_name (source));
+
+ e_util_call_malloc_trim ();
}
static void
@@ -2778,6 +2782,8 @@ e_book_backend_start_view (EBookBackend *backend,
g_return_if_fail (class->impl_start_view);
class->impl_start_view (backend, view);
+
+ e_util_call_malloc_trim ();
}
/**
@@ -2801,6 +2807,8 @@ e_book_backend_stop_view (EBookBackend *backend,
g_return_if_fail (class->impl_stop_view != NULL);
class->impl_stop_view (backend, view);
+
+ e_util_call_malloc_trim ();
}
/**
diff --git a/src/addressbook/libedata-book/e-data-book-view.c b/src/addressbook/libedata-book/e-data-book-view.c
index e16c27526..911a56356 100644
--- a/src/addressbook/libedata-book/e-data-book-view.c
+++ b/src/addressbook/libedata-book/e-data-book-view.c
@@ -1179,6 +1179,8 @@ e_data_book_view_notify_complete (EDataBookView *view,
g_free (error_name);
g_free (error_message);
+
+ e_util_call_malloc_trim ();
}
/**
diff --git a/src/calendar/libedata-cal/e-cal-backend.c b/src/calendar/libedata-cal/e-cal-backend.c
index 5eda277e9..eb2a3dff5 100644
--- a/src/calendar/libedata-cal/e-cal-backend.c
+++ b/src/calendar/libedata-cal/e-cal-backend.c
@@ -910,6 +910,8 @@ cal_backend_finalize (GObject *object)
/* Chain up to parent's finalize() method. */
G_OBJECT_CLASS (e_cal_backend_parent_class)->finalize (object);
+
+ e_util_call_malloc_trim ();
}
static void
@@ -998,6 +1000,8 @@ cal_backend_shutdown (ECalBackend *backend)
"The %s instance for \"%s\" is shutting down.\n",
G_OBJECT_TYPE_NAME (backend),
e_source_get_display_name (source));
+
+ e_util_call_malloc_trim ();
}
/* Private function, not meant to be part of the public API */
@@ -4672,6 +4676,8 @@ e_cal_backend_start_view (ECalBackend *backend,
g_return_if_fail (klass->impl_start_view != NULL);
klass->impl_start_view (backend, view);
+
+ e_util_call_malloc_trim ();
}
/**
@@ -4698,6 +4704,8 @@ e_cal_backend_stop_view (ECalBackend *backend,
/* backward compatibility, do not force each backend define this function */
if (klass->impl_stop_view)
klass->impl_stop_view (backend, view);
+
+ e_util_call_malloc_trim ();
}
/**
diff --git a/src/calendar/libedata-cal/e-data-cal-view.c b/src/calendar/libedata-cal/e-data-cal-view.c
index bd63317ea..570d14b8e 100644
--- a/src/calendar/libedata-cal/e-data-cal-view.c
+++ b/src/calendar/libedata-cal/e-data-cal-view.c
@@ -1468,5 +1468,7 @@ e_data_cal_view_notify_complete (EDataCalView *view,
g_free (error_message);
g_mutex_unlock (&view->priv->pending_mutex);
+
+ e_util_call_malloc_trim ();
}
diff --git a/src/libedataserver/e-data-server-util.c b/src/libedataserver/e-data-server-util.c
index b938f1752..e3d085993 100644
--- a/src/libedataserver/e-data-server-util.c
+++ b/src/libedataserver/e-data-server-util.c
@@ -21,6 +21,10 @@
#include "evolution-data-server-config.h"
+#ifdef HAVE_MALLOC_TRIM
+#include <malloc.h>
+#endif
+
#include <string.h>
#include <sys/stat.h>
#include <time.h>
@@ -3060,3 +3064,22 @@ e_util_change_uri_port (GUri **inout_uri,
g_uri_unref (*inout_uri);
*inout_uri = tmp;
}
+
+/**
+ * e_util_call_malloc_trim: (skip)
+ *
+ * Calls malloc_trim() to free unused heap memory. The function
+ * does nothing, when the malloc_trim() is not available.
+ *
+ * This might be called after some operations which may use a lot
+ * of memory temporarily.
+ *
+ * Since: 3.48
+ **/
+void
+e_util_call_malloc_trim (void)
+{
+#ifdef HAVE_MALLOC_TRIM
+ malloc_trim (0);
+#endif
+}
diff --git a/src/libedataserver/e-data-server-util.h b/src/libedataserver/e-data-server-util.h
index b9fc1ddb0..c1d3e9163 100644
--- a/src/libedataserver/e-data-server-util.h
+++ b/src/libedataserver/e-data-server-util.h
@@ -262,6 +262,7 @@ void e_util_change_uri_component (GUri **inout_uri,
const gchar *value);
void e_util_change_uri_port (GUri **inout_uri,
gint port);
+void e_util_call_malloc_trim (void);
G_END_DECLS