diff --git a/src/freebsd/up-backend.c b/src/freebsd/up-backend.c index 868d171..69bc154 100644 --- a/src/freebsd/up-backend.c +++ b/src/freebsd/up-backend.c @@ -351,6 +351,7 @@ up_backend_has_encrypted_swap (UpBackend *backend) return FALSE; } +/* Return value: a percentage value */ gfloat up_backend_get_used_swap (UpBackend *backend) { diff --git a/src/linux/up-backend.c b/src/linux/up-backend.c index b528c67..c12102d 100644 --- a/src/linux/up-backend.c +++ b/src/linux/up-backend.c @@ -459,6 +459,68 @@ out: return encrypted_swap; } +/** + * up_backend_get_used_swap: + * + * Return value: a percentage value + **/ +gfloat +up_backend_get_used_swap (UpBackend *backend) +{ + gchar *contents = NULL; + gchar **lines = NULL; + GError *error = NULL; + gchar **tokens; + gboolean ret; + guint active = 0; + guint swap_free = 0; + guint swap_total = 0; + guint len; + guint i; + gfloat percentage = 0.0f; + const gchar *filename = "/proc/meminfo"; + + /* get memory data */ + ret = g_file_get_contents (filename, &contents, NULL, &error); + if (!ret) { + egg_warning ("failed to open %s: %s", filename, error->message); + g_error_free (error); + goto out; + } + + /* process each line */ + lines = g_strsplit (contents, "\n", -1); + for (i=1; lines[i] != NULL; i++) { + tokens = g_strsplit_set (lines[i], ": ", -1); + len = g_strv_length (tokens); + if (len > 3) { + if (g_strcmp0 (tokens[0], "SwapFree") == 0) + swap_free = atoi (tokens[len-2]); + if (g_strcmp0 (tokens[0], "SwapTotal") == 0) + swap_total = atoi (tokens[len-2]); + else if (g_strcmp0 (tokens[0], "Active") == 0) + active = atoi (tokens[len-2]); + } + g_strfreev (tokens); + } + + /* first check if we even have swap, if not consider all swap space used */ + if (swap_total == 0) { + egg_debug ("no swap space found"); + percentage = 100.0f; + goto out; + } + + /* work out how close to the line we are */ + if (swap_free > 0 && active > 0) + percentage = (active * 100) / swap_free; + egg_debug ("total swap available %i kb, active memory %i kb (%.1f%%)", swap_free, active, percentage); +out: + g_free (contents); + g_strfreev (lines); + return percentage; +} + /** * up_backend_class_init: * @klass: The UpBackendClass diff --git a/src/up-backend.h b/src/up-backend.h index 823ab95..2384388 100644 --- a/src/up-backend.h +++ b/src/up-backend.h @@ -70,6 +70,7 @@ gboolean up_backend_coldplug (UpBackend *backend, gboolean up_backend_kernel_can_suspend (UpBackend *backend); gboolean up_backend_kernel_can_hibernate (UpBackend *backend); gboolean up_backend_has_encrypted_swap (UpBackend *backend); +gfloat up_backend_get_used_swap (UpBackend *backend); G_END_DECLS diff --git a/src/up-daemon.c b/src/up-daemon.c index cf65ba2..c2ba877 100644 --- a/src/up-daemon.c +++ b/src/up-daemon.c @@ -107,66 +107,6 @@ G_DEFINE_TYPE (UpDaemon, up_daemon, G_TYPE_OBJECT) #define UP_DAEMON_ON_BATTERY_REFRESH_DEVICES_DELAY 1 /* seconds */ #define UP_DAEMON_POLL_BATTERY_NUMBER_TIMES 5 -/** - * up_daemon_check_swap_space: - **/ -static gfloat -up_daemon_check_swap_space (UpDaemon *daemon) -{ - gchar *contents = NULL; - gchar **lines = NULL; - GError *error = NULL; - gchar **tokens; - gboolean ret; - guint active = 0; - guint swap_free = 0; - guint swap_total = 0; - guint len; - guint i; - gfloat percentage = 0.0f; - const gchar *filename = "/proc/meminfo"; - - /* get memory data */ - ret = g_file_get_contents (filename, &contents, NULL, &error); - if (!ret) { - egg_warning ("failed to open %s: %s", filename, error->message); - g_error_free (error); - goto out; - } - - /* process each line */ - lines = g_strsplit (contents, "\n", -1); - for (i=1; lines[i] != NULL; i++) { - tokens = g_strsplit_set (lines[i], ": ", -1); - len = g_strv_length (tokens); - if (len > 3) { - if (g_strcmp0 (tokens[0], "SwapFree") == 0) - swap_free = atoi (tokens[len-2]); - if (g_strcmp0 (tokens[0], "SwapTotal") == 0) - swap_total = atoi (tokens[len-2]); - else if (g_strcmp0 (tokens[0], "Active") == 0) - active = atoi (tokens[len-2]); - } - g_strfreev (tokens); - } - - /* first check if we even have swap, if not consider all swap space used */ - if (swap_total == 0) { - egg_debug ("no swap space found"); - percentage = 100.0f; - goto out; - } - - /* work out how close to the line we are */ - if (swap_free > 0 && active > 0) - percentage = (active * 100) / swap_free; - egg_debug ("total swap available %i kb, active memory %i kb (%.1f%%)", swap_free, active, percentage); -out: - g_free (contents); - g_strfreev (lines); - return percentage; -} - /** * up_daemon_get_on_battery_local: * @@ -952,7 +892,7 @@ up_daemon_init (UpDaemon *daemon) /* do we have enough swap? */ if (daemon->priv->kernel_can_hibernate) { - waterline = up_daemon_check_swap_space (daemon); + waterline = up_backend_get_used_swap (daemon->priv->backend); if (waterline < UP_DAEMON_SWAP_WATERLINE) daemon->priv->hibernate_has_swap_space = TRUE; else