From c824b74b9df1ffa41dc08a7fcf8684cda58e17d0 Mon Sep 17 00:00:00 2001 From: Soeren Sandmann Date: Sun, 17 Apr 2005 06:03:38 +0000 Subject: [PATCH] Factor out some stuff in their own functions. Sun Apr 17 00:20:41 2005 Soeren Sandmann * sysprof.c (on_open_clicked): Factor out some stuff in their own functions. * sysprof.c (load_file): Idle handler to load files given on the command line. * sysprof.c (main): If a filename is passed on the command line, load it in an idle handler. --- ChangeLog | 15 +++++ TODO | 34 +++++++---- sysprof.c | 165 +++++++++++++++++++++++++++++++++++++++++------------- 3 files changed, 164 insertions(+), 50 deletions(-) diff --git a/ChangeLog b/ChangeLog index e9447119..094fdfe1 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,18 @@ +Sun Apr 17 00:20:41 2005 Soeren Sandmann + + * sysprof.c (on_open_clicked): Factor out some stuff in their own + functions. + + * sysprof.c (load_file): Idle handler to load files given on the + command line. + + * sysprof.c (main): If a filename is passed on the command line, + load it in an idle handler. + +Sun Apr 17 00:19:03 2005 Soeren Sandmann + + * TODO: Updates + Sat Apr 16 19:51:48 2005 Soeren Sandmann * sysprof-module.c (read_user_space): Read a whole page at a time. diff --git a/TODO b/TODO index 152ddc4d..8b0f151e 100644 --- a/TODO +++ b/TODO @@ -4,23 +4,18 @@ Before 1.0: - grep FIXME - When the module is unloaded, kill all processes blocking in read - or block unloading until all processes have exited - - Find out what happened here: - - - Hopefully the oops at the end of this file is gone now that - we use mmput/get_task_mm. For older kernels those symbols - are not exported though, so we will probably have to either - use the old way (directly accessing the mm's) or just not - support those kernels. * Interface - If the current profile has a name, display it in the title bar - Sould just install the kernel module if it running as root, pop up a dialog if not. Note we must be able to start without module now, since it is useful to just load profiles from disk. + - Is there a portable way of asking for the root password? + - Install a small suid program that only inserts the module? + (instant security hole ..) - hook up menu items view/start etc (or possibly get rid of them or move them) - Consider expanding a few more levels of a new descendants tree - - give profiles on the command line * Build system - Need to make "make install" work (how do you know where to install @@ -34,6 +29,10 @@ Before 1.0: - .desktop file - translation should be hooked up + + + + Before 1.2: - Make busy cursors more intelligent @@ -91,9 +90,6 @@ Before 1.2: - speedprof seems to report that lots of time is spent in stack_stash_foreach() and also in generate_key() - add an 'everything' object. It is really needed for a lot of things -- make profile.c more agnostic to processes and functions etc. Ideally - it should just take a set of stack traces containing "presentation - objects" and do something sensible with it. - Non-GUI version that can save in a format the GUI can understand. Could be used for profiling startup etc. Would preferably be able to @@ -108,6 +104,9 @@ Before 1.2: - possibly add dependency on glib 2.8 if it is released at that point. (g_file_replace()) + + + Later: - Find out how to hack around gtk+ bug causing multiple double clicks @@ -196,8 +195,19 @@ Later: been read will stay in cache (for short profile runs you can assume that with disk, but not for long ones). + + + DONE: +- give profiles on the command line + +- Hopefully the oops at the end of this file is gone now that + we use mmput/get_task_mm. For older kernels those symbols + are not exported though, so we will probably have to either + use the old way (directly accessing the mm's) or just not + support those kernels. + - Need an icon - hook up about box @@ -297,6 +307,8 @@ It is possible that we simply need a better concept of Process: - fix leaks +- Find out what happened here: + Apr 11 15:42:08 great-sage-equal-to-heaven kernel: Unable to handle kernel NULL pointer dereference at virtual address 000001b8 Apr 11 15:42:08 great-sage-equal-to-heaven kernel: printing eip: Apr 11 15:42:08 great-sage-equal-to-heaven kernel: c017342c diff --git a/sysprof.c b/sysprof.c index 4dc46642..c286ec3f 100644 --- a/sysprof.c +++ b/sysprof.c @@ -68,8 +68,10 @@ struct Application GtkWidget * start_item; GtkWidget * profile_item; - GtkWidget * open_item; + GtkWidget * reset_item; GtkWidget * save_as_item; + GtkWidget * open_item; + GtkWidget * samples_label; Profile * profile; @@ -177,16 +179,24 @@ update_sensitivity (Application *app) break; } + gtk_toggle_tool_button_set_active (GTK_TOGGLE_TOOL_BUTTON (active_radio_button), TRUE); + + /* "profile" widgets */ gtk_widget_set_sensitive (GTK_WIDGET (app->profile_button), sensitive_profile_button); + gtk_widget_set_sensitive (GTK_WIDGET (app->profile_item), + sensitive_profile_button); - gtk_toggle_tool_button_set_active (GTK_TOGGLE_TOOL_BUTTON (active_radio_button), TRUE); - + /* "save as" widgets */ gtk_widget_set_sensitive (GTK_WIDGET (app->save_as_button), sensitive_save_as_button); - + gtk_widget_set_sensitive (app->save_as_item, sensitive_save_as_button); + + /* "start" widgets */ gtk_widget_set_sensitive (GTK_WIDGET (app->start_button), - sensitive_start_button); + sensitive_start_button); + gtk_widget_set_sensitive (GTK_WIDGET (app->start_item), + sensitive_start_button); #if 0 /* FIXME: gtk+ doesn't handle changes in sensitivity in response @@ -194,6 +204,8 @@ update_sensitivity (Application *app) */ gtk_widget_set_sensitive (GTK_WIDGET (app->reset_button), sensitive_reset_button); + gtk_widget_set_sensitive (GTK_WIDGET (app->reset_item), + sensitive_reset_button); #endif gtk_widget_set_sensitive (GTK_WIDGET (app->object_view), sensitive_tree_views); @@ -749,10 +761,7 @@ on_about_activated (GtkWidget *widget, gpointer data) gtk_show_about_dialog (GTK_WINDOW (app->main_window), "logo", app->icon, "name", APPLICATION_NAME, -#if 0 - "copyright", "Copyright S"OSLASH"ren Sandmann", -#endif - "comments", "FIXME, write something informative here", + "copyright", "Copyright 2004-2005, S"OSLASH"ren Sandmann", NULL); } @@ -836,7 +845,8 @@ overwrite_file (GtkWindow *window, } static void -on_save_as_clicked (gpointer widget, gpointer data) +on_save_as_clicked (gpointer widget, + gpointer data) { Application *app = data; GtkWidget *dialog; @@ -890,9 +900,48 @@ on_save_as_clicked (gpointer widget, gpointer data) } static void -on_open_clicked (gpointer widget, gpointer data) +set_loaded_profile (Application *app, + const char *name, + Profile *profile) +{ + g_return_if_fail (name != NULL); + g_return_if_fail (profile != NULL); + + set_busy (app->main_window, TRUE); + + delete_data (app); + + app->state = DISPLAYING; + + app->n_samples = profile_get_size (profile); + + app->profile = profile; + app->profile_from_file = TRUE; + + fill_lists (app); + + update_sensitivity (app); + + set_busy (app->main_window, FALSE); +} + +static void +show_could_not_open (Application *app, + const char *filename, + GError *err) +{ + sorry (app->main_window, + "Could not open %s: %s", + filename, + err->message); +} + +static void +on_open_clicked (gpointer widget, + gpointer data) { Application *app = data; + gchar *filename = NULL; Profile *profile = NULL; GtkWidget *dialog; @@ -913,7 +962,6 @@ on_open_clicked (gpointer widget, gpointer data) if (gtk_dialog_run (GTK_DIALOG (dialog)) == GTK_RESPONSE_ACCEPT) { GError *err = NULL; - gchar *filename; filename = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (dialog)); @@ -924,40 +972,27 @@ on_open_clicked (gpointer widget, gpointer data) if (!profile) { set_busy (dialog, FALSE); - - sorry (app->main_window, "Could not open %s: %s", - filename, err->message); - + + show_could_not_open (app, filename, err); + g_error_free (err); g_free (filename); + + filename = NULL; goto retry; } set_busy (dialog, FALSE); - - g_free (filename); } - + gtk_widget_destroy (dialog); - set_busy (app->main_window, TRUE); - if (profile) { - delete_data (app); - - app->state = DISPLAYING; - - app->n_samples = profile_get_size (profile); - - app->profile = profile; - app->profile_from_file = TRUE; - - fill_lists (app); - - update_sensitivity (app); - } + g_assert (filename); + set_loaded_profile (app, filename, profile); - set_busy (app->main_window, FALSE); + g_free (filename); + } } static void @@ -967,7 +1002,8 @@ on_delete (GtkWidget *window) } static void -on_object_selection_changed (GtkTreeSelection *selection, gpointer data) +on_object_selection_changed (GtkTreeSelection *selection, + gpointer data) { Application *app = data; GtkTreePath *path; @@ -991,7 +1027,8 @@ on_object_selection_changed (GtkTreeSelection *selection, gpointer data) } static void -really_goto_object (Application *app, ProfileObject *object) +really_goto_object (Application *app, + ProfileObject *object) { GtkTreeModel *profile_objects; GtkTreeIter iter; @@ -1139,6 +1176,7 @@ build_gui (Application *app) /* Menu items */ app->start_item = glade_xml_get_widget (xml, "start_item"); app->profile_item = glade_xml_get_widget (xml, "profile_item"); + app->reset_item = glade_xml_get_widget (xml, "reset_item"); app->open_item = glade_xml_get_widget (xml, "open_item"); app->save_as_item = glade_xml_get_widget (xml, "save_as_item"); @@ -1147,18 +1185,23 @@ build_gui (Application *app) g_assert (app->save_as_item); g_assert (app->open_item); +#if 0 g_signal_connect (G_OBJECT (app->start_item), "activate", - G_CALLBACK (on_start_toggled), app); + G_CALLBACK (toggle_start_button), app); g_signal_connect (G_OBJECT (app->profile_item), "activate", G_CALLBACK (on_profile_toggled), app); + g_signal_connect (G_OBJECT (app->reset_item), "activate", + G_CALLBACK (on_reset_clicked), app); +#endif + g_signal_connect (G_OBJECT (app->open_item), "activate", G_CALLBACK (on_open_clicked), app); g_signal_connect (G_OBJECT (app->save_as_item), "activate", G_CALLBACK (on_save_as_clicked), app); - + /* quit */ g_signal_connect (G_OBJECT (glade_xml_get_widget (xml, "quit")), "activate", G_CALLBACK (on_delete), NULL); @@ -1249,6 +1292,40 @@ application_new (void) return app; } +typedef struct +{ + const char *filename; + Application *app; +} FileOpenData; + +static gboolean +load_file (gpointer data) +{ + FileOpenData *file_open_data = data; + const char *filename = file_open_data->filename; + Application *app = file_open_data->app; + GError *err = NULL; + Profile *profile; + + set_busy (app->main_window, TRUE); + + profile = profile_load (filename, &err); + + set_busy (app->main_window, FALSE); + + if (profile) + { + set_loaded_profile (app, filename, profile); + } + else + { + show_could_not_open (app, filename, err); + g_error_free (err); + } + + return FALSE; +} + int main (int argc, char **argv) { @@ -1266,6 +1343,16 @@ main (int argc, char **argv) build_gui (app); update_sensitivity (app); + + if (argc > 1) + { + FileOpenData *file_open_data = g_new0 (FileOpenData, 1); + +file_open_data->filename = argv[1]; + file_open_data->app = app; + + g_idle_add (load_file, file_open_data); + } gtk_main ();