From 0d6c7518d2cd66ba15ca7b8628d7b1e40e9ba875 Mon Sep 17 00:00:00 2001 From: Jasmine Hassan Date: Fri, 14 Dec 2012 21:38:42 +0200 Subject: [housekeeping] Use g_settings_get_mapped, fix paranoid cleanup on shutdown 1. Use g_settings_get_mapped instead of our own hack get_gsettings_int_with_default. 2. Don't force hard-coded default when value is 0, as that's used to allow paranoid scanning on shutdown. 3. Only unref the settings object at the end of _stop routine, not before do_cleanup is potentially called, since purge_thumbnail_cache uses the settings. This was also causing asserts when killing msd, as described in (now closed) #23. These are regressions introduced by the gsettings port of the plugin -- 03478b4d --- plugins/housekeeping/msd-housekeeping-manager.c | 106 ++++++++++++++---------- 1 file changed, 62 insertions(+), 44 deletions(-) (limited to 'plugins/housekeeping') diff --git a/plugins/housekeeping/msd-housekeeping-manager.c b/plugins/housekeeping/msd-housekeeping-manager.c index e9e27c9..cbb1143 100644 --- a/plugins/housekeeping/msd-housekeeping-manager.c +++ b/plugins/housekeeping/msd-housekeeping-manager.c @@ -1,5 +1,6 @@ /* * Copyright (C) 2008 Michael J. Chudobiak + * Copyright (C) 2012 Jasmine Hassan * * 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 @@ -32,14 +33,12 @@ #define INTERVAL_ONCE_A_DAY 24*60*60 #define INTERVAL_TWO_MINUTES 2*60 - /* Thumbnail cleaner */ -#define GSETTINGS_THUMB_SCHEMA "org.mate.thumbnail-cache" -#define GSETTINGS_THUMB_AGE "maximum-age" -#define DEFAULT_MAX_AGE_IN_DAYS 180 -#define GSETTINGS_THUMB_SIZE "maximum-size" -#define DEFAULT_MAX_SIZE_IN_MB 512 - +#define THUMB_CACHE_SCHEMA "org.mate.thumbnail-cache" +#define THUMB_CACHE_KEY_AGE "maximum-age" +#define THUMB_CACHE_KEY_SIZE "maximum-size" +#define DEFAULT_MAX_AGE 180 /* in Days */ +#define DEFAULT_MAX_SIZE 512 /* in MB */ struct MsdHousekeepingManagerPrivate { guint long_term_cb; @@ -47,7 +46,6 @@ struct MsdHousekeepingManagerPrivate { GSettings *settings; }; - #define MSD_HOUSEKEEPING_MANAGER_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), MSD_TYPE_HOUSEKEEPING_MANAGER, MsdHousekeepingManagerPrivate)) static void msd_housekeeping_manager_class_init (MsdHousekeepingManagerClass *klass); @@ -84,7 +82,6 @@ thumb_data_free (gpointer data) } } - static GList * read_dir_for_purge (const char *path, GList *files) { @@ -134,7 +131,6 @@ read_dir_for_purge (const char *path, GList *files) return files; } - static void purge_old_thumbnails (ThumbData *info, PurgeData *purge_data) { @@ -146,29 +142,55 @@ purge_old_thumbnails (ThumbData *info, PurgeData *purge_data) } } - static int sort_file_mtime (ThumbData *file1, ThumbData *file2) { return file1->mtime - file2->mtime; } +static gboolean +int_gsettings_mapping (GVariant *value, + gpointer *result, + gpointer int_ptr) +{ + gint32 key_value = g_variant_get_int32 (value); + + /* NULL value means the "last chance" for us to return a valid value */ + if (value == NULL) { + *result = int_ptr; /* use the supplied default value */ + return TRUE; + } + + /* For either AGE/SIZE keys, -1 disables cleaning. + * A zero value corresponds to an extra-paranoid level of cleaning + */ + if (key_value >= -1) { + *result = &key_value; + return TRUE; + } + + return FALSE; +} static int -get_gsettings_int_with_default (GSettings *settings, char *key, int default_value) +get_max_age (MsdHousekeepingManager *manager) { - /* If the key is unset, we use a non-zero default value. - A zero value corresponds to an extra-paranoid level - of cleaning - it deletes all files. We don't want that - as a default condition. */ - int value = g_settings_get_int (settings, key); - - if (value == NULL || value == 0) - value = default_value; - - return value; + int *age = g_settings_get_mapped (manager->priv->settings, + THUMB_CACHE_KEY_AGE, + int_gsettings_mapping, + GINT_TO_POINTER(DEFAULT_MAX_AGE)); + return *age * 24 * 60 * 60; } +static int +get_max_size (MsdHousekeepingManager *manager) +{ + int *size = g_settings_get_mapped (manager->priv->settings, + THUMB_CACHE_KEY_SIZE, + int_gsettings_mapping, + GINT_TO_POINTER(DEFAULT_MAX_SIZE)); + return *size * 1024 * 1024; +} static void purge_thumbnail_cache (MsdHousekeepingManager *manager) @@ -206,8 +228,8 @@ purge_thumbnail_cache (MsdHousekeepingManager *manager) g_get_current_time (¤t_time); purge_data.now = current_time.tv_sec; - purge_data.max_age = get_gsettings_int_with_default (manager->priv->settings, GSETTINGS_THUMB_AGE, DEFAULT_MAX_AGE_IN_DAYS) * 24 * 60 * 60; - purge_data.max_size = get_gsettings_int_with_default (manager->priv->settings, GSETTINGS_THUMB_SIZE, DEFAULT_MAX_SIZE_IN_MB) * 1024 * 1024; + purge_data.max_age = get_max_age (manager); + purge_data.max_size = get_max_size (manager); purge_data.total_size = 0; if (purge_data.max_age >= 0) @@ -227,7 +249,6 @@ purge_thumbnail_cache (MsdHousekeepingManager *manager) g_list_free (files); } - static gboolean do_cleanup (MsdHousekeepingManager *manager) { @@ -235,7 +256,6 @@ do_cleanup (MsdHousekeepingManager *manager) return TRUE; } - static gboolean do_cleanup_once (MsdHousekeepingManager *manager) { @@ -244,7 +264,6 @@ do_cleanup_once (MsdHousekeepingManager *manager) return FALSE; } - static void do_cleanup_soon (MsdHousekeepingManager *manager) { @@ -256,14 +275,14 @@ do_cleanup_soon (MsdHousekeepingManager *manager) } } - static void -bindings_callback (GSettings *settings, gchar *key, MsdHousekeepingManager *manager) +settings_changed_callback (GSettings *settings, + const char *key, + MsdHousekeepingManager *manager) { do_cleanup_soon (manager); } - gboolean msd_housekeeping_manager_start (MsdHousekeepingManager *manager, GError **error) @@ -273,9 +292,10 @@ msd_housekeeping_manager_start (MsdHousekeepingManager *manager, msd_ldsm_setup (FALSE); - manager->priv->settings = g_settings_new (GSETTINGS_THUMB_SCHEMA); + manager->priv->settings = g_settings_new (THUMB_CACHE_SCHEMA); - g_signal_connect (manager->priv->settings, "changed", G_CALLBACK (bindings_callback), manager); + 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); @@ -289,7 +309,6 @@ msd_housekeeping_manager_start (MsdHousekeepingManager *manager, return TRUE; } - void msd_housekeeping_manager_stop (MsdHousekeepingManager *manager) { @@ -297,8 +316,6 @@ msd_housekeeping_manager_stop (MsdHousekeepingManager *manager) g_debug ("Stopping housekeeping manager"); - g_object_unref (p->settings); - if (p->short_term_cb) { g_source_remove (p->short_term_cb); p->short_term_cb = 0; @@ -308,32 +325,33 @@ msd_housekeeping_manager_stop (MsdHousekeepingManager *manager) g_source_remove (p->long_term_cb); p->long_term_cb = 0; - /* Do a clean-up on shutdown if and only if the size or age - limits have been set to paranoid levels (zero) */ - if ((get_gsettings_int_with_default (p->settings, GSETTINGS_THUMB_AGE, DEFAULT_MAX_AGE_IN_DAYS) == 0) || - (get_gsettings_int_with_default (p->settings, GSETTINGS_THUMB_SIZE, DEFAULT_MAX_SIZE_IN_MB) == 0)) { - do_cleanup (manager); - } + /* 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 (get_max_age (manager) == 0 || get_max_size (manager) == 0) + { + do_cleanup (manager); + } } + g_object_unref (p->settings); + p->settings = NULL; + msd_ldsm_clean (); } - static void msd_housekeeping_manager_class_init (MsdHousekeepingManagerClass *klass) { g_type_class_add_private (klass, sizeof (MsdHousekeepingManagerPrivate)); } - static void msd_housekeeping_manager_init (MsdHousekeepingManager *manager) { manager->priv = MSD_HOUSEKEEPING_MANAGER_GET_PRIVATE (manager); } - MsdHousekeepingManager * msd_housekeeping_manager_new (void) { -- cgit v1.2.1