diff --git a/ChangeLog b/ChangeLog index d05cbe55b..965d0965f 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,14 @@ +2009-03-02 Bastien Nocera + + * font-viewer/Makefile.am: + * font-viewer/font-thumbnailer.c (main): + * font-viewer/totem-resources.c (set_resource_limits), + (time_monitor), (totem_resources_monitor_start), + (totem_resources_monitor_stop): + * font-viewer/totem-resources.h: Stop the font thumbnailer + eating all the CPU, and limit the resources to 30 seconds + and 256MB of RAM, which should be plenty (Closes: #573795) + ==================== 2.25.92 ==================== 2009-03-02 Jens Granseuer diff --git a/font-viewer/Makefile.am b/font-viewer/Makefile.am index e31fb693f..3255cd762 100644 --- a/font-viewer/Makefile.am +++ b/font-viewer/Makefile.am @@ -5,7 +5,7 @@ INCLUDES = $(FONT_VIEWER_CFLAGS) $(GNOMECC_CAPPLETS_CFLAGS) -DDIRECTORY_DIR=\"$( bin_PROGRAMS = gnome-thumbnail-font gnome-font-viewer gnome_thumbnail_font_LDADD = $(GNOMECC_CAPPLETS_LIBS) $(FONT_VIEWER_LIBS) -gnome_thumbnail_font_SOURCES = ftstream-vfs.c font-thumbnailer.c +gnome_thumbnail_font_SOURCES = ftstream-vfs.c font-thumbnailer.c totem-resources.c totem-resources.h gnome_font_viewer_LDADD = $(GNOMECC_CAPPLETS_LIBS) $(FONT_VIEWER_LIBS) gnome_font_viewer_SOURCES = ftstream-vfs.c font-view.c diff --git a/font-viewer/font-thumbnailer.c b/font-viewer/font-thumbnailer.c index 074a7f903..d498ea1a1 100644 --- a/font-viewer/font-thumbnailer.c +++ b/font-viewer/font-thumbnailer.c @@ -32,6 +32,8 @@ #include #include +#include "totem-resources.h" + static const gchar * get_ft_error(FT_Error error) { @@ -255,6 +257,7 @@ main(int argc, char **argv) setlocale (LC_ALL, ""); g_type_init (); + g_thread_init (NULL); context = g_option_context_new (NULL); g_option_context_add_main_entries (context, options, GETTEXT_PACKAGE); @@ -294,6 +297,8 @@ main(int argc, char **argv) goto out; } + totem_resources_monitor_start (arguments[0], 30); + file = g_file_new_for_commandline_arg (arguments[0]); uri = g_file_get_uri (file); g_object_unref (file); @@ -367,6 +372,8 @@ main(int argc, char **argv) save_pixbuf(pixbuf, arguments[1]); g_object_unref(pixbuf); + totem_resources_monitor_stop (); + /* freeing the face causes a crash I haven't tracked down yet */ error = FT_Done_Face(face); if (error) { diff --git a/font-viewer/totem-resources.c b/font-viewer/totem-resources.c new file mode 100644 index 000000000..3d1077370 --- /dev/null +++ b/font-viewer/totem-resources.c @@ -0,0 +1,123 @@ +/* + * Copyright (C) 2007 Bastien Nocera + * + * 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 + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + * + * The Totem project hereby grant permission for non-gpl compatible GStreamer + * plugins to be used and distributed together with GStreamer and Totem. This + * permission are above and beyond the permissions granted by the GPL license + * Totem is covered by. + * + * Monday 7th February 2005: Christian Schaller: Add exception clause. + * See license_change file for details. + * + */ + +#include "config.h" + +#include +#include + +#include +#include +#include +#include +#include + +#include "totem-resources.h" + +#define MAX_HELPER_MEMORY (256 * 1024 * 1024) /* 256 MB */ +#define MAX_HELPER_SECONDS (15) /* 15 seconds */ +#define DEFAULT_SLEEP_TIME (30 * G_USEC_PER_SEC) /* 30 seconds */ + +static guint sleep_time = DEFAULT_SLEEP_TIME; +static gboolean finished = TRUE; + +static void +set_resource_limits (const char *input) +{ + struct rlimit limit; + struct stat buf; + rlim_t max; + + max = MAX_HELPER_MEMORY; + + /* Set the maximum virtual size depending on the size + * of the file to process, as we wouldn't be able to + * mmap it otherwise */ + if (input == NULL) { + max = MAX_HELPER_MEMORY; + } else if (g_stat (input, &buf) == 0) { + max = MAX_HELPER_MEMORY + buf.st_size; + } else if (g_str_has_prefix (input, "file://") != FALSE) { + char *file; + file = g_filename_from_uri (input, NULL, NULL); + if (file != NULL && g_stat (file, &buf) == 0) + max = MAX_HELPER_MEMORY + buf.st_size; + g_free (file); + } + + limit.rlim_cur = max; + limit.rlim_max = max; + + setrlimit (RLIMIT_DATA, &limit); + + limit.rlim_cur = MAX_HELPER_SECONDS; + limit.rlim_max = MAX_HELPER_SECONDS; + setrlimit (RLIMIT_CPU, &limit); +} + +G_GNUC_NORETURN static gpointer +time_monitor (gpointer data) +{ + const char *app_name; + + g_usleep (sleep_time); + + if (finished != FALSE) + g_thread_exit (NULL); + + app_name = g_get_application_name (); + if (app_name == NULL) + app_name = g_get_prgname (); + g_print ("%s couldn't process file: '%s'\n" + "Reason: Took too much time to process.\n", + app_name, + (const char *) data); + + exit (0); +} + +void +totem_resources_monitor_start (const char *input, gint wall_clock_time) +{ + set_resource_limits (input); + + if (wall_clock_time < 0) + return; + + if (wall_clock_time > 0) + sleep_time = wall_clock_time; + + finished = FALSE; + g_thread_create (time_monitor, (gpointer) input, FALSE, NULL); +} + +void +totem_resources_monitor_stop (void) +{ + finished = TRUE; +} + diff --git a/font-viewer/totem-resources.h b/font-viewer/totem-resources.h new file mode 100644 index 000000000..421a03caf --- /dev/null +++ b/font-viewer/totem-resources.h @@ -0,0 +1,33 @@ +/* + * Copyright (C) 2007 Bastien Nocera + * + * 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 + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + * + * The Totem project hereby grant permission for non-gpl compatible GStreamer + * plugins to be used and distributed together with GStreamer and Totem. This + * permission are above and beyond the permissions granted by the GPL license + * Totem is covered by. + * + * Monday 7th February 2005: Christian Schaller: Add exception clause. + * See license_change file for details. + * + */ + +#include + +void totem_resources_monitor_start (const char *input, + gint wall_clock_time); +void totem_resources_monitor_stop (void); +