summaryrefslogtreecommitdiff
path: root/plugins/housekeeping/msd-housekeeping-manager.c
diff options
context:
space:
mode:
Diffstat (limited to 'plugins/housekeeping/msd-housekeeping-manager.c')
-rw-r--r--plugins/housekeeping/msd-housekeeping-manager.c94
1 files changed, 55 insertions, 39 deletions
diff --git a/plugins/housekeeping/msd-housekeeping-manager.c b/plugins/housekeeping/msd-housekeeping-manager.c
index 4a76241..367cbb1 100644
--- a/plugins/housekeeping/msd-housekeeping-manager.c
+++ b/plugins/housekeeping/msd-housekeeping-manager.c
@@ -1,6 +1,7 @@
/*
* Copyright (C) 2008 Michael J. Chudobiak <[email protected]>
* Copyright (C) 2012 Jasmine Hassan <[email protected]>
+ * Copyright (C) 2012-2021 MATE Developers
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -28,7 +29,6 @@
#include "msd-housekeeping-manager.h"
#include "msd-disk-space.h"
-
/* General */
#define INTERVAL_ONCE_A_DAY 24*60*60
#define INTERVAL_TWO_MINUTES 2*60
@@ -38,17 +38,19 @@
#define THUMB_CACHE_KEY_AGE "maximum-age"
#define THUMB_CACHE_KEY_SIZE "maximum-size"
-struct MsdHousekeepingManagerPrivate {
- guint long_term_cb;
- guint short_term_cb;
+struct _MsdHousekeepingManager {
+ GObject parent;
+
+ guint long_term_cb;
+ guint short_term_cb;
GSettings *settings;
+ gulong config_listener_id;
};
-G_DEFINE_TYPE_WITH_PRIVATE (MsdHousekeepingManager, msd_housekeeping_manager, G_TYPE_OBJECT)
+G_DEFINE_TYPE (MsdHousekeepingManager, msd_housekeeping_manager, G_TYPE_OBJECT)
static gpointer manager_object = NULL;
-
typedef struct {
GDateTime *now;
GTimeSpan max_age;
@@ -56,14 +58,12 @@ typedef struct {
goffset max_size;
} PurgeData;
-
typedef struct {
GDateTime *mtime;
char *path;
glong size;
} ThumbData;
-
static void
thumb_data_free (gpointer data)
{
@@ -155,8 +155,8 @@ purge_thumbnail_cache (MsdHousekeepingManager *manager)
g_debug ("housekeeping: checking thumbnail cache size and freshness");
- purge_data.max_age = g_settings_get_int (manager->priv->settings, THUMB_CACHE_KEY_AGE) * G_TIME_SPAN_DAY;
- purge_data.max_size = g_settings_get_int (manager->priv->settings, THUMB_CACHE_KEY_SIZE) * 1024 * 1024;
+ purge_data.max_age = g_settings_get_int (manager->settings, THUMB_CACHE_KEY_AGE) * G_TIME_SPAN_DAY;
+ purge_data.max_size = g_settings_get_int (manager->settings, THUMB_CACHE_KEY_SIZE) * 1024 * 1024;
/* if both are set to -1, we don't need to read anything */
if ((purge_data.max_age < 0) && (purge_data.max_size < 0))
@@ -200,8 +200,7 @@ purge_thumbnail_cache (MsdHousekeepingManager *manager)
}
}
- g_list_foreach (files, (GFunc) thumb_data_free, NULL);
- g_list_free (files);
+ g_list_free_full (files, thumb_data_free);
g_date_time_unref (purge_data.now);
}
@@ -216,16 +215,16 @@ static gboolean
do_cleanup_once (MsdHousekeepingManager *manager)
{
do_cleanup (manager);
- manager->priv->short_term_cb = 0;
+ manager->short_term_cb = 0;
return FALSE;
}
static void
do_cleanup_soon (MsdHousekeepingManager *manager)
{
- if (manager->priv->short_term_cb == 0) {
+ if (manager->short_term_cb == 0) {
g_debug ("housekeeping: will tidy up in 2 minutes");
- manager->priv->short_term_cb = g_timeout_add_seconds (INTERVAL_TWO_MINUTES,
+ manager->short_term_cb = g_timeout_add_seconds (INTERVAL_TWO_MINUTES,
(GSourceFunc) do_cleanup_once,
manager);
}
@@ -246,18 +245,11 @@ msd_housekeeping_manager_start (MsdHousekeepingManager *manager,
g_debug ("Starting housekeeping manager");
mate_settings_profile_start (NULL);
- msd_ldsm_setup (FALSE);
-
- manager->priv->settings = g_settings_new (THUMB_CACHE_SCHEMA);
-
- g_signal_connect (manager->priv->settings, "changed",
- G_CALLBACK (settings_changed_callback), manager);
-
/* Clean once, a few minutes after start-up */
do_cleanup_soon (manager);
/* Clean periodically, on a daily basis. */
- manager->priv->long_term_cb = g_timeout_add_seconds (INTERVAL_ONCE_A_DAY,
+ manager->long_term_cb = g_timeout_add_seconds (INTERVAL_ONCE_A_DAY,
(GSourceFunc) do_cleanup,
manager);
mate_settings_profile_end (NULL);
@@ -265,46 +257,70 @@ msd_housekeeping_manager_start (MsdHousekeepingManager *manager,
return TRUE;
}
+static void
+msd_housekeeping_manager_finalize (GObject *object)
+{
+ MsdHousekeepingManager *manager = MSD_HOUSEKEEPING_MANAGER (object);
+ msd_housekeeping_manager_stop (manager);
+#if GLIB_CHECK_VERSION(2,62,0)
+ g_clear_signal_handler (&manager->config_listener_id,
+ manager->settings);
+#else
+ if (manager->config_listener_id != 0) {
+ g_signal_handler_disconnect (manager->settings,
+ manager->config_listener_id);
+ manager->config_listener_id = 0;
+ }
+#endif
+ g_object_unref (manager->settings);
+ manager->settings = NULL;
+
+ msd_ldsm_clean ();
+
+ G_OBJECT_CLASS (msd_housekeeping_manager_parent_class)->finalize (object);
+}
+
void
msd_housekeeping_manager_stop (MsdHousekeepingManager *manager)
{
- MsdHousekeepingManagerPrivate *p = manager->priv;
-
g_debug ("Stopping housekeeping manager");
- if (p->short_term_cb) {
- g_source_remove (p->short_term_cb);
- p->short_term_cb = 0;
+ if (manager->short_term_cb) {
+ g_source_remove (manager->short_term_cb);
+ manager->short_term_cb = 0;
}
- if (p->long_term_cb) {
- g_source_remove (p->long_term_cb);
- p->long_term_cb = 0;
+ if (manager->long_term_cb) {
+ g_source_remove (manager->long_term_cb);
+ manager->long_term_cb = 0;
/* Do a clean-up on shutdown if and only if the size or age
* limits have been set to a paranoid level of cleaning (zero)
*/
- if ((g_settings_get_int (p->settings, THUMB_CACHE_KEY_AGE) == 0) ||
- (g_settings_get_int (p->settings, THUMB_CACHE_KEY_SIZE) == 0)) {
+ if ((g_settings_get_int (manager->settings, THUMB_CACHE_KEY_AGE) == 0) ||
+ (g_settings_get_int (manager->settings, THUMB_CACHE_KEY_SIZE) == 0)) {
do_cleanup (manager);
}
}
-
- g_object_unref (p->settings);
- p->settings = NULL;
-
- msd_ldsm_clean ();
}
static void
msd_housekeeping_manager_class_init (MsdHousekeepingManagerClass *klass)
{
+ GObjectClass *object_class = G_OBJECT_CLASS (klass);
+
+ object_class->finalize = msd_housekeeping_manager_finalize;
}
static void
msd_housekeeping_manager_init (MsdHousekeepingManager *manager)
{
- manager->priv = msd_housekeeping_manager_get_instance_private (manager);
+ msd_ldsm_setup (FALSE);
+
+ manager->settings = g_settings_new (THUMB_CACHE_SCHEMA);
+ manager->config_listener_id = g_signal_connect (manager->settings, "changed",
+ G_CALLBACK (settings_changed_callback),
+ manager);
}
MsdHousekeepingManager *