From 468a0e5dc0586cc6abefb1dcab1aa2c7fa4827a7 Mon Sep 17 00:00:00 2001 From: naba Date: Tue, 6 Feb 2007 13:07:53 +0000 Subject: [PATCH] Patch from James Liggett : * plugins/profiler/gprof-flat-profile.c, plugins/profiler/gprof-profile-data.c, plugins/profiler/gprof-call-graph.c, plugins/profiler/gprof-profile-data.h, plugins/profiler/plugin.c: Fixed infinite loop bug #403501, Show profiler view when target selected bug #403515. git-svn-id: http://svn.gnome.org/svn/anjuta/trunk@2792 1dbfb86a-d425-0410-a06b-cb591aac69f6 --- ChangeLog | 10 ++++++++++ plugins/profiler/gprof-call-graph.c | 5 ++++- plugins/profiler/gprof-flat-profile.c | 5 ++++- plugins/profiler/gprof-profile-data.c | 20 +++++++++++++++++--- plugins/profiler/gprof-profile-data.h | 7 +++++-- plugins/profiler/plugin.c | 19 ++++++++++++++++--- 6 files changed, 56 insertions(+), 10 deletions(-) diff --git a/ChangeLog b/ChangeLog index f05abb84..c6d1a6ce 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,13 @@ +2007-02-06 Naba Kumar + + Patch from James Liggett : + * plugins/profiler/gprof-flat-profile.c, + plugins/profiler/gprof-profile-data.c, + plugins/profiler/gprof-call-graph.c, + plugins/profiler/gprof-profile-data.h, + plugins/profiler/plugin.c: Fixed infinite loop bug #403501, + Show profiler view when target selected bug #403515. + 2007-02-05 Naba Kumar * configure.in: Enabled devhelp plugin by default now that diff --git a/plugins/profiler/gprof-call-graph.c b/plugins/profiler/gprof-call-graph.c index c45dd977..53ce73cc 100644 --- a/plugins/profiler/gprof-call-graph.c +++ b/plugins/profiler/gprof-call-graph.c @@ -245,7 +245,10 @@ gprof_call_graph_new (FILE *stream, GProfFlatProfile *flat_profile) * "index" */ do { - fgets (buffer, PATH_MAX, stream); + /* Don't loop infinitely if we don't have any data */ + if (!fgets (buffer, PATH_MAX, stream)) + return call_graph; + } while (strncmp ("index", buffer, 5) != 0); block = NULL; diff --git a/plugins/profiler/gprof-flat-profile.c b/plugins/profiler/gprof-flat-profile.c index cd978a76..fbd43c54 100644 --- a/plugins/profiler/gprof-flat-profile.c +++ b/plugins/profiler/gprof-flat-profile.c @@ -158,7 +158,10 @@ gprof_flat_profile_new (FILE *stream) /* Read to beginning of flat profile data */ do { - fgets (buffer, PATH_MAX, stream); + /* Don't loop infinitely if we don't have any data */ + if (!fgets (buffer, PATH_MAX, stream)) + return flat_profile; + } while (!strchr (buffer, '%')); /* Skip the second line of the column header */ diff --git a/plugins/profiler/gprof-profile-data.c b/plugins/profiler/gprof-profile-data.c index cec36437..1470118e 100644 --- a/plugins/profiler/gprof-profile-data.c +++ b/plugins/profiler/gprof-profile-data.c @@ -100,7 +100,7 @@ gprof_profile_data_free (GProfProfileData *self) g_object_unref (self); } -void +gboolean gprof_profile_data_init_profile (GProfProfileData *self, gchar *path, GPtrArray *options) { @@ -112,6 +112,8 @@ gprof_profile_data_init_profile (GProfProfileData *self, gchar *path, GPtrArray *gprof_args; gchar *mime_type; gboolean is_libtool_target = FALSE; + GPid gprof_pid; + gint gprof_status; /* Determine target mime type */ mime_type = gnome_vfs_get_mime_type (path); @@ -145,8 +147,12 @@ gprof_profile_data_init_profile (GProfProfileData *self, gchar *path, g_ptr_array_add (gprof_args, NULL); g_spawn_async_with_pipes (NULL, (gchar **) gprof_args->pdata, - NULL, G_SPAWN_SEARCH_PATH, NULL, - NULL, NULL, NULL, &stdout_pipe, NULL, NULL); + NULL, + G_SPAWN_SEARCH_PATH | + G_SPAWN_DO_NOT_REAP_CHILD | + G_SPAWN_STDERR_TO_DEV_NULL, + NULL, NULL, &gprof_pid, NULL, &stdout_pipe, + NULL, NULL); g_ptr_array_free (gprof_args, TRUE); g_free (gmon_out_path); @@ -167,6 +173,14 @@ gprof_profile_data_init_profile (GProfProfileData *self, gchar *path, fclose (stdout_stream); close (stdout_pipe); + + waitpid (gprof_pid, &gprof_status, 0); + g_spawn_close_pid (gprof_pid); + + if (WIFEXITED (gprof_status) && WEXITSTATUS (gprof_status) != 0) + return FALSE; + + return TRUE; } GProfFlatProfile * diff --git a/plugins/profiler/gprof-profile-data.h b/plugins/profiler/gprof-profile-data.h index 81f0c4f2..871b43cb 100644 --- a/plugins/profiler/gprof-profile-data.h +++ b/plugins/profiler/gprof-profile-data.h @@ -26,6 +26,9 @@ #include #include +#include +#include +#include #include "gprof-flat-profile.h" #include "gprof-call-graph.h" @@ -56,8 +59,8 @@ GType gprof_profile_data_get_type (); GProfProfileData *gprof_profile_data_new (); void gprof_profile_data_free (GProfProfileData *self); -void gprof_profile_data_init_profile (GProfProfileData *self, gchar *path, - GPtrArray *options); +gboolean gprof_profile_data_init_profile (GProfProfileData *self, gchar *path, + GPtrArray *options); GProfFlatProfile *gprof_profile_data_get_flat_profile (GProfProfileData *self); GProfCallGraph *gprof_profile_data_get_call_graph (GProfProfileData *self); diff --git a/plugins/profiler/plugin.c b/plugins/profiler/plugin.c index ed80986b..e18f2806 100644 --- a/plugins/profiler/plugin.c +++ b/plugins/profiler/plugin.c @@ -166,9 +166,16 @@ profiler_get_data (Profiler *profiler) { options = setup_options (profiler); - gprof_profile_data_init_profile (profiler->profile_data, - profiler->profile_target_path, - options); + if (!gprof_profile_data_init_profile (profiler->profile_data, + profiler->profile_target_path, + options)) + { + anjuta_util_dialog_error (ANJUTA_PLUGIN (profiler)->shell, + _("Could not get profiling data." + "\n\n" + "Please check the path to " + "this target's profiling data file")); + } option_strings = (gchar **) g_ptr_array_free (options, FALSE); g_strfreev (option_strings); @@ -244,6 +251,12 @@ profiler_set_target (Profiler *profiler, const gchar *profile_target_uri) on_profile_data_changed, (gpointer) profiler); } + + /* Show user the profiler views if they aren't visible so they + * know what happened */ + anjuta_shell_present_widget (ANJUTA_PLUGIN (profiler)->shell, + gprof_view_manager_get_notebook (profiler->view_manager), + NULL); } else { -- 2.11.4.GIT