mirror of
https://github.com/varun-r-mallya/sysprof.git
synced 2025-12-31 20:36:25 +00:00
Factor out some stuff in their own functions.
Sun Apr 17 00:20:41 2005 Soeren Sandmann <sandmann@redhat.com> * 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.
This commit is contained in:
committed by
Søren Sandmann Pedersen
parent
023ce06615
commit
c824b74b9d
15
ChangeLog
15
ChangeLog
@ -1,3 +1,18 @@
|
|||||||
|
Sun Apr 17 00:20:41 2005 Soeren Sandmann <sandmann@redhat.com>
|
||||||
|
|
||||||
|
* 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 <sandmann@redhat.com>
|
||||||
|
|
||||||
|
* TODO: Updates
|
||||||
|
|
||||||
Sat Apr 16 19:51:48 2005 Soeren Sandmann <sandmann@redhat.com>
|
Sat Apr 16 19:51:48 2005 Soeren Sandmann <sandmann@redhat.com>
|
||||||
|
|
||||||
* sysprof-module.c (read_user_space): Read a whole page at a time.
|
* sysprof-module.c (read_user_space): Read a whole page at a time.
|
||||||
|
|||||||
34
TODO
34
TODO
@ -4,23 +4,18 @@ Before 1.0:
|
|||||||
- grep FIXME
|
- grep FIXME
|
||||||
- When the module is unloaded, kill all processes blocking in read
|
- When the module is unloaded, kill all processes blocking in read
|
||||||
- or block unloading until all processes have exited
|
- 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
|
* Interface
|
||||||
- If the current profile has a name, display it in the title bar
|
- 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
|
- 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,
|
a dialog if not. Note we must be able to start without module now,
|
||||||
since it is useful to just load profiles from disk.
|
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
|
- hook up menu items view/start etc (or possibly get rid of them or
|
||||||
move them)
|
move them)
|
||||||
- Consider expanding a few more levels of a new descendants tree
|
- Consider expanding a few more levels of a new descendants tree
|
||||||
- give profiles on the command line
|
|
||||||
|
|
||||||
* Build system
|
* Build system
|
||||||
- Need to make "make install" work (how do you know where to install
|
- Need to make "make install" work (how do you know where to install
|
||||||
@ -34,6 +29,10 @@ Before 1.0:
|
|||||||
- .desktop file
|
- .desktop file
|
||||||
- translation should be hooked up
|
- translation should be hooked up
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Before 1.2:
|
Before 1.2:
|
||||||
|
|
||||||
- Make busy cursors more intelligent
|
- Make busy cursors more intelligent
|
||||||
@ -91,9 +90,6 @@ Before 1.2:
|
|||||||
- speedprof seems to report that lots of time is spent in
|
- speedprof seems to report that lots of time is spent in
|
||||||
stack_stash_foreach() and also in generate_key()
|
stack_stash_foreach() and also in generate_key()
|
||||||
- add an 'everything' object. It is really needed for a lot of things
|
- 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.
|
- 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
|
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.
|
- possibly add dependency on glib 2.8 if it is released at that point.
|
||||||
(g_file_replace())
|
(g_file_replace())
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Later:
|
Later:
|
||||||
|
|
||||||
- Find out how to hack around gtk+ bug causing multiple double clicks
|
- 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,
|
been read will stay in cache (for short profile runs you can assume that with disk,
|
||||||
but not for long ones).
|
but not for long ones).
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
DONE:
|
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
|
- Need an icon
|
||||||
|
|
||||||
- hook up about box
|
- hook up about box
|
||||||
@ -297,6 +307,8 @@ It is possible that we simply need a better concept of Process:
|
|||||||
- fix leaks
|
- 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: 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: printing eip:
|
||||||
Apr 11 15:42:08 great-sage-equal-to-heaven kernel: c017342c
|
Apr 11 15:42:08 great-sage-equal-to-heaven kernel: c017342c
|
||||||
|
|||||||
165
sysprof.c
165
sysprof.c
@ -68,8 +68,10 @@ struct Application
|
|||||||
|
|
||||||
GtkWidget * start_item;
|
GtkWidget * start_item;
|
||||||
GtkWidget * profile_item;
|
GtkWidget * profile_item;
|
||||||
GtkWidget * open_item;
|
GtkWidget * reset_item;
|
||||||
GtkWidget * save_as_item;
|
GtkWidget * save_as_item;
|
||||||
|
GtkWidget * open_item;
|
||||||
|
|
||||||
GtkWidget * samples_label;
|
GtkWidget * samples_label;
|
||||||
|
|
||||||
Profile * profile;
|
Profile * profile;
|
||||||
@ -177,16 +179,24 @@ update_sensitivity (Application *app)
|
|||||||
break;
|
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),
|
gtk_widget_set_sensitive (GTK_WIDGET (app->profile_button),
|
||||||
sensitive_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),
|
gtk_widget_set_sensitive (GTK_WIDGET (app->save_as_button),
|
||||||
sensitive_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),
|
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
|
#if 0
|
||||||
/* FIXME: gtk+ doesn't handle changes in sensitivity in response
|
/* 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),
|
gtk_widget_set_sensitive (GTK_WIDGET (app->reset_button),
|
||||||
sensitive_reset_button);
|
sensitive_reset_button);
|
||||||
|
gtk_widget_set_sensitive (GTK_WIDGET (app->reset_item),
|
||||||
|
sensitive_reset_button);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
gtk_widget_set_sensitive (GTK_WIDGET (app->object_view), sensitive_tree_views);
|
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),
|
gtk_show_about_dialog (GTK_WINDOW (app->main_window),
|
||||||
"logo", app->icon,
|
"logo", app->icon,
|
||||||
"name", APPLICATION_NAME,
|
"name", APPLICATION_NAME,
|
||||||
#if 0
|
"copyright", "Copyright 2004-2005, S"OSLASH"ren Sandmann",
|
||||||
"copyright", "Copyright S"OSLASH"ren Sandmann",
|
|
||||||
#endif
|
|
||||||
"comments", "FIXME, write something informative here",
|
|
||||||
NULL);
|
NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -836,7 +845,8 @@ overwrite_file (GtkWindow *window,
|
|||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
on_save_as_clicked (gpointer widget, gpointer data)
|
on_save_as_clicked (gpointer widget,
|
||||||
|
gpointer data)
|
||||||
{
|
{
|
||||||
Application *app = data;
|
Application *app = data;
|
||||||
GtkWidget *dialog;
|
GtkWidget *dialog;
|
||||||
@ -890,9 +900,48 @@ on_save_as_clicked (gpointer widget, gpointer data)
|
|||||||
}
|
}
|
||||||
|
|
||||||
static void
|
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;
|
Application *app = data;
|
||||||
|
gchar *filename = NULL;
|
||||||
Profile *profile = NULL;
|
Profile *profile = NULL;
|
||||||
GtkWidget *dialog;
|
GtkWidget *dialog;
|
||||||
|
|
||||||
@ -913,7 +962,6 @@ on_open_clicked (gpointer widget, gpointer data)
|
|||||||
if (gtk_dialog_run (GTK_DIALOG (dialog)) == GTK_RESPONSE_ACCEPT)
|
if (gtk_dialog_run (GTK_DIALOG (dialog)) == GTK_RESPONSE_ACCEPT)
|
||||||
{
|
{
|
||||||
GError *err = NULL;
|
GError *err = NULL;
|
||||||
gchar *filename;
|
|
||||||
|
|
||||||
filename = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (dialog));
|
filename = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (dialog));
|
||||||
|
|
||||||
@ -924,40 +972,27 @@ on_open_clicked (gpointer widget, gpointer data)
|
|||||||
if (!profile)
|
if (!profile)
|
||||||
{
|
{
|
||||||
set_busy (dialog, FALSE);
|
set_busy (dialog, FALSE);
|
||||||
|
|
||||||
sorry (app->main_window, "Could not open %s: %s",
|
show_could_not_open (app, filename, err);
|
||||||
filename, err->message);
|
g_error_free (err);
|
||||||
|
|
||||||
g_free (filename);
|
g_free (filename);
|
||||||
|
|
||||||
|
filename = NULL;
|
||||||
goto retry;
|
goto retry;
|
||||||
}
|
}
|
||||||
|
|
||||||
set_busy (dialog, FALSE);
|
set_busy (dialog, FALSE);
|
||||||
|
|
||||||
g_free (filename);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
gtk_widget_destroy (dialog);
|
gtk_widget_destroy (dialog);
|
||||||
|
|
||||||
set_busy (app->main_window, TRUE);
|
|
||||||
|
|
||||||
if (profile)
|
if (profile)
|
||||||
{
|
{
|
||||||
delete_data (app);
|
g_assert (filename);
|
||||||
|
set_loaded_profile (app, filename, profile);
|
||||||
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);
|
g_free (filename);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@ -967,7 +1002,8 @@ on_delete (GtkWidget *window)
|
|||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
on_object_selection_changed (GtkTreeSelection *selection, gpointer data)
|
on_object_selection_changed (GtkTreeSelection *selection,
|
||||||
|
gpointer data)
|
||||||
{
|
{
|
||||||
Application *app = data;
|
Application *app = data;
|
||||||
GtkTreePath *path;
|
GtkTreePath *path;
|
||||||
@ -991,7 +1027,8 @@ on_object_selection_changed (GtkTreeSelection *selection, gpointer data)
|
|||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
really_goto_object (Application *app, ProfileObject *object)
|
really_goto_object (Application *app,
|
||||||
|
ProfileObject *object)
|
||||||
{
|
{
|
||||||
GtkTreeModel *profile_objects;
|
GtkTreeModel *profile_objects;
|
||||||
GtkTreeIter iter;
|
GtkTreeIter iter;
|
||||||
@ -1139,6 +1176,7 @@ build_gui (Application *app)
|
|||||||
/* Menu items */
|
/* Menu items */
|
||||||
app->start_item = glade_xml_get_widget (xml, "start_item");
|
app->start_item = glade_xml_get_widget (xml, "start_item");
|
||||||
app->profile_item = glade_xml_get_widget (xml, "profile_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->open_item = glade_xml_get_widget (xml, "open_item");
|
||||||
app->save_as_item = glade_xml_get_widget (xml, "save_as_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->save_as_item);
|
||||||
g_assert (app->open_item);
|
g_assert (app->open_item);
|
||||||
|
|
||||||
|
#if 0
|
||||||
g_signal_connect (G_OBJECT (app->start_item), "activate",
|
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_signal_connect (G_OBJECT (app->profile_item), "activate",
|
||||||
G_CALLBACK (on_profile_toggled), app);
|
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_signal_connect (G_OBJECT (app->open_item), "activate",
|
||||||
G_CALLBACK (on_open_clicked), app);
|
G_CALLBACK (on_open_clicked), app);
|
||||||
|
|
||||||
g_signal_connect (G_OBJECT (app->save_as_item), "activate",
|
g_signal_connect (G_OBJECT (app->save_as_item), "activate",
|
||||||
G_CALLBACK (on_save_as_clicked), app);
|
G_CALLBACK (on_save_as_clicked), app);
|
||||||
|
|
||||||
/* quit */
|
/* quit */
|
||||||
g_signal_connect (G_OBJECT (glade_xml_get_widget (xml, "quit")), "activate",
|
g_signal_connect (G_OBJECT (glade_xml_get_widget (xml, "quit")), "activate",
|
||||||
G_CALLBACK (on_delete), NULL);
|
G_CALLBACK (on_delete), NULL);
|
||||||
@ -1249,6 +1292,40 @@ application_new (void)
|
|||||||
return app;
|
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
|
int
|
||||||
main (int argc, char **argv)
|
main (int argc, char **argv)
|
||||||
{
|
{
|
||||||
@ -1266,6 +1343,16 @@ main (int argc, char **argv)
|
|||||||
build_gui (app);
|
build_gui (app);
|
||||||
|
|
||||||
update_sensitivity (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 ();
|
gtk_main ();
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user