[maemo-commits] [maemo-commits] r18704 - in projects/haf/trunk/hildon-thumbnail: . daemon
From: subversion at stage.maemo.org subversion at stage.maemo.orgDate: Thu Jun 11 16:33:09 EEST 2009
- Previous message: [maemo-commits] r18703 - in projects/haf/trunk/hildon-thumbnail: . daemon/plugins
- Next message: [maemo-commits] r18705 - projects/haf/trunk/hildon-thumbnail
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]
Author: pvanhoof Date: 2009-06-11 16:32:56 +0300 (Thu, 11 Jun 2009) New Revision: 18704 Modified: projects/haf/trunk/hildon-thumbnail/ChangeLog projects/haf/trunk/hildon-thumbnail/daemon/hildon-thumbnail-daemon.c Log: * daemon/hildon-thumbnail-daemon.c: Setting rlimit on memory usage Modified: projects/haf/trunk/hildon-thumbnail/ChangeLog =================================================================== --- projects/haf/trunk/hildon-thumbnail/ChangeLog 2009-06-11 12:01:37 UTC (rev 18703) +++ projects/haf/trunk/hildon-thumbnail/ChangeLog 2009-06-11 13:32:56 UTC (rev 18704) @@ -2,6 +2,7 @@ * daemon/plugins/gdkpixbuf-plugin.c: Detect animated GIF, and block support for it + * daemon/hildon-thumbnail-daemon.c: Setting rlimit on memory usage 2009-06-11 Philip Van Hoof <philip at codeminded.be> Modified: projects/haf/trunk/hildon-thumbnail/daemon/hildon-thumbnail-daemon.c =================================================================== --- projects/haf/trunk/hildon-thumbnail/daemon/hildon-thumbnail-daemon.c 2009-06-11 12:01:37 UTC (rev 18703) +++ projects/haf/trunk/hildon-thumbnail/daemon/hildon-thumbnail-daemon.c 2009-06-11 13:32:56 UTC (rev 18704) @@ -45,6 +45,10 @@ #include <fcntl.h> #include <stdlib.h> #include <unistd.h> +#include <string.h> +#include <stdlib.h> +#include <errno.h> +#include <sys/resource.h> #include <glib.h> #include <dbus/dbus-glib-bindings.h> @@ -58,6 +62,22 @@ #include "albumart-manager.h" #include "thumb-hal.h" +/* Maximum here is a G_MAXLONG, so if you want to use > 2GB, you have + * to set MEM_LIMIT to RLIM_INFINITY + */ +#ifdef __x86_64__ +#define MEM_LIMIT 512 * 1024 * 1024 +#else +#define MEM_LIMIT 80 * 1024 * 1024 +#endif + +#if defined(__OpenBSD__) && !defined(RLIMIT_AS) +#define RLIMIT_AS RLIMIT_DATA +#endif + +#undef DISABLE_MEM_LIMITS + + void keep_alive (void); static GHashTable *registrations; @@ -153,6 +173,108 @@ #endif } +static guint +get_memory_total (void) +{ + GError *error = NULL; + const gchar *filename; + gchar *contents = NULL; + glong total = 0; + + filename = "/proc/meminfo"; + + if (!g_file_get_contents (filename, + &contents, + NULL, + &error)) { + g_critical ("Couldn't get memory information:'%s', %s", + filename, + error ? error->message : "no error given"); + g_clear_error (&error); + } else { + gchar *start, *end, *p; + + start = "MemTotal:"; + end = "kB"; + + p = strstr (contents, start); + if (p) { + p += strlen (start); + end = strstr (p, end); + + if (end) { + *end = '\0'; + total = 1024 * atol (p); + } + } + + g_free (contents); + } + + if (!total) { + /* Setting limit to an arbitary limit */ + total = RLIM_INFINITY; + } + + return total; +} + +static gboolean +memory_setrlimits (void) +{ +#ifndef DISABLE_MEM_LIMITS + struct rlimit rl; + glong total; + glong limit; + + total = get_memory_total (); + limit = CLAMP (MEM_LIMIT, 0, total); + + /* We want to limit the max virtual memory + * most extractors use mmap() so only virtual memory can be + * effectively limited. + */ + getrlimit (RLIMIT_AS, &rl); + rl.rlim_cur = limit; + + if (setrlimit (RLIMIT_AS, &rl) == -1) { + const gchar *str = g_strerror (errno); + + g_critical ("Could not set virtual memory limit with setrlimit(RLIMIT_AS), %s", + str ? str : "no error given"); + + return FALSE; + } else { + getrlimit (RLIMIT_DATA, &rl); + rl.rlim_cur = limit; + + if (setrlimit (RLIMIT_DATA, &rl) == -1) { + const gchar *str = g_strerror (errno); + + g_critical ("Could not set heap memory limit with setrlimit(RLIMIT_DATA), %s", + str ? str : "no error given"); + + return FALSE; + } else { + gchar *str1, *str2; + + str1 = g_format_size_for_display (total); + str2 = g_format_size_for_display (limit); + + g_message ("Setting memory limitations: total is %s, virtual/heap set to %s", + str1, + str2); + + g_free (str2); + g_free (str1); + } + } +#endif /* DISABLE_MEM_LIMITS */ + + return TRUE; +} + + void keep_alive (void) { @@ -438,6 +560,8 @@ if (!g_thread_supported ()) g_thread_init (NULL); + memory_setrlimits (); + create_dummy_files (); connection = dbus_g_bus_get (DBUS_BUS_SESSION, &error);
- Previous message: [maemo-commits] r18703 - in projects/haf/trunk/hildon-thumbnail: . daemon/plugins
- Next message: [maemo-commits] r18705 - projects/haf/trunk/hildon-thumbnail
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]