From 352d3c7d3b080850f4fc81b502a0f0b0d3c2369d Mon Sep 17 00:00:00 2001 From: JP Rosevear Date: Wed, 14 May 2003 18:45:55 +0000 Subject: guard against multiple destroys 2003-05-14 JP Rosevear * gui/e-tasks.c (e_tasks_destroy): guard against multiple destroys * cal-client/cal-client.c (cal_client_finalize): unref the bonobo listener * gui/gnome-cal.c (gnome_calendar_destroy): guard against multiple destroy calls * gui/e-week-view.c (e_week_view_init): connect after destroy (invisible_destroyed): don't unref, its already destroyed * gui/e-day-view.c (e_day_view_init): connect after destroy (invisible_destroyed): don't unref, its already destroyed * gui/e-calendar-table.c (e_calendar_table_class_init): make sure we set the parent class (e_calendar_table_init): connect after the destroy handler runs (e_calendar_table_destroy): guard against multiple destroys (invisible_destroyed): don't unref the invisible, its already being destroyed * gui/calendar-offline-handler.c (backend_cal_set_mode): unref the client, we are done with it now (backend_cal_opened_online): ditto (impl_dispose): unref our main client * gui/calendar-commands.c (control_util_set_folder_bar_label): release/unref the shell view once we are done with it (control_util_show_settings): ditto svn path=/trunk/; revision=21180 --- calendar/ChangeLog | 32 ++++++++++++ calendar/cal-client/cal-client.c | 2 +- calendar/gui/calendar-commands.c | 4 ++ calendar/gui/calendar-offline-handler.c | 8 ++- calendar/gui/e-calendar-table.c | 14 +++--- calendar/gui/e-day-view.c | 5 +- calendar/gui/e-tasks.c | 18 ++++--- calendar/gui/e-week-view.c | 5 +- calendar/gui/gnome-cal.c | 86 +++++++++++++++++---------------- 9 files changed, 109 insertions(+), 65 deletions(-) (limited to 'calendar') diff --git a/calendar/ChangeLog b/calendar/ChangeLog index d6d1941969..2907b7db2a 100644 --- a/calendar/ChangeLog +++ b/calendar/ChangeLog @@ -1,3 +1,35 @@ +2003-05-14 JP Rosevear + + * gui/e-tasks.c (e_tasks_destroy): guard against multiple destroys + + * cal-client/cal-client.c (cal_client_finalize): unref the + bonobo listener + + * gui/gnome-cal.c (gnome_calendar_destroy): guard against multiple + destroy calls + + * gui/e-week-view.c (e_week_view_init): connect after destroy + (invisible_destroyed): don't unref, its already destroyed + + * gui/e-day-view.c (e_day_view_init): connect after destroy + (invisible_destroyed): don't unref, its already destroyed + + * gui/e-calendar-table.c (e_calendar_table_class_init): make sure + we set the parent class + (e_calendar_table_init): connect after the destroy handler runs + (e_calendar_table_destroy): guard against multiple destroys + (invisible_destroyed): don't unref the invisible, its already + being destroyed + + * gui/calendar-offline-handler.c (backend_cal_set_mode): unref the + client, we are done with it now + (backend_cal_opened_online): ditto + (impl_dispose): unref our main client + + * gui/calendar-commands.c (control_util_set_folder_bar_label): + release/unref the shell view once we are done with it + (control_util_show_settings): ditto + 2003-05-13 Rodrigo Moya * gui/alarm-notify/alarm-queue.c (notify_dialog_cb): fixed memory diff --git a/calendar/cal-client/cal-client.c b/calendar/cal-client/cal-client.c index b6e042cd58..b80e8ce809 100644 --- a/calendar/cal-client/cal-client.c +++ b/calendar/cal-client/cal-client.c @@ -425,9 +425,9 @@ cal_client_finalize (GObject *object) client = CAL_CLIENT (object); priv = client->priv; - /* The server unrefs the query listener, so we just NULL it out here */ if (priv->listener) { cal_listener_stop_notification (priv->listener); + bonobo_object_unref (priv->listener); priv->listener = NULL; } diff --git a/calendar/gui/calendar-commands.c b/calendar/gui/calendar-commands.c index 6dac8ec8a5..0f2f35a527 100644 --- a/calendar/gui/calendar-commands.c +++ b/calendar/gui/calendar-commands.c @@ -482,6 +482,8 @@ control_util_set_folder_bar_label (BonoboControl *control, char *label) g_message ("control_util_set_folder_bar_label(): Could not set the folder bar label"); CORBA_exception_free (&ev); + + bonobo_object_release_unref (shell_view, NULL); } void @@ -507,6 +509,8 @@ control_util_show_settings (GnomeCalendar *gcal) g_message ("control_util_show_settings(): Could not show settings"); CORBA_exception_free (&ev); + + bonobo_object_release_unref (shell_view, NULL); } /* Sensitizes the UI Component menu/toolbar calendar commands based on the diff --git a/calendar/gui/calendar-offline-handler.c b/calendar/gui/calendar-offline-handler.c index c5b742d614..894f3cf560 100644 --- a/calendar/gui/calendar-offline-handler.c +++ b/calendar/gui/calendar-offline-handler.c @@ -39,7 +39,7 @@ static BonoboObjectClass *parent_class = NULL; struct _CalendarOfflineHandlerPrivate { CalClient *client; - + GNOME_Evolution_OfflineProgressListener listener_interface; gboolean is_offline; @@ -143,6 +143,7 @@ backend_cal_set_mode (CalClient *client, CalClientSetModeStatus status, CalMode CalendarOfflineHandler *offline_handler = data; update_offline (offline_handler); + g_object_unref (client); } static void @@ -171,6 +172,7 @@ backend_cal_opened_online (CalClient *client, CalClientOpenStatus status, gpoint } cal_client_set_mode (client, CAL_MODE_REMOTE); + g_object_unref (client); } static void @@ -188,7 +190,7 @@ backend_go_offline (gpointer data, gpointer user_data) update_offline (offline_handler); g_object_unref (client); return; - } + } } static void @@ -256,6 +258,8 @@ impl_dispose (GObject *object) offline_handler = CALENDAR_OFFLINE_HANDLER (object); priv = offline_handler->priv; + g_object_unref (priv->client); + if (priv->listener_interface != CORBA_OBJECT_NIL) { CORBA_Environment ev; diff --git a/calendar/gui/e-calendar-table.c b/calendar/gui/e-calendar-table.c index b3ac35e045..6f31455fb8 100644 --- a/calendar/gui/e-calendar-table.c +++ b/calendar/gui/e-calendar-table.c @@ -135,6 +135,7 @@ e_calendar_table_class_init (ECalendarTableClass *class) GtkObjectClass *object_class; GtkWidgetClass *widget_class; + parent_class = g_type_class_peek_parent (class); object_class = (GtkObjectClass *) class; widget_class = (GtkWidgetClass *) class; @@ -533,8 +534,8 @@ e_calendar_table_init (ECalendarTable *cal_table) G_CALLBACK (selection_clear_event), cal_table); g_signal_connect (cal_table->invisible, "selection_received", G_CALLBACK (selection_received), cal_table); - g_signal_connect (cal_table->invisible, "destroy", - G_CALLBACK (invisible_destroyed), cal_table); + g_signal_connect_after (cal_table->invisible, "destroy", + G_CALLBACK (invisible_destroyed), cal_table); cal_table->clipboard_selection = NULL; } @@ -582,9 +583,11 @@ e_calendar_table_destroy (GtkObject *object) cal_table = E_CALENDAR_TABLE (object); - g_object_unref (cal_table->model); - cal_table->model = NULL; - + if (cal_table->model) { + g_object_unref (cal_table->model); + cal_table->model = NULL; + } + if (cal_table->invisible) gtk_widget_destroy (cal_table->invisible); if (cal_table->clipboard_selection) { @@ -1175,7 +1178,6 @@ e_calendar_table_save_state (ECalendarTable *cal_table, static void invisible_destroyed (GtkWidget *invisible, ECalendarTable *cal_table) { - g_object_unref (cal_table->invisible); cal_table->invisible = NULL; } diff --git a/calendar/gui/e-day-view.c b/calendar/gui/e-day-view.c index ed6cc4f5cb..9c29b00356 100644 --- a/calendar/gui/e-day-view.c +++ b/calendar/gui/e-day-view.c @@ -843,8 +843,8 @@ e_day_view_init (EDayView *day_view) G_CALLBACK (selection_clear_event), (gpointer) day_view); g_signal_connect (day_view->invisible, "selection_received", G_CALLBACK (selection_received), (gpointer) day_view); - g_signal_connect (day_view->invisible, "destroy", - G_CALLBACK (invisible_destroyed), (gpointer) day_view); + g_signal_connect_after (day_view->invisible, "destroy", + G_CALLBACK (invisible_destroyed), (gpointer) day_view); day_view->clipboard_selection = NULL; @@ -7574,7 +7574,6 @@ e_day_view_get_time_string_width (EDayView *day_view) static void invisible_destroyed (GtkWidget *invisible, EDayView *day_view) { - g_object_unref (day_view->invisible); day_view->invisible = NULL; } diff --git a/calendar/gui/e-tasks.c b/calendar/gui/e-tasks.c index 38035400da..df434a28aa 100644 --- a/calendar/gui/e-tasks.c +++ b/calendar/gui/e-tasks.c @@ -306,16 +306,18 @@ e_tasks_destroy (GtkObject *object) tasks = E_TASKS (object); priv = tasks->priv; - if (priv->client) { - g_object_unref (priv->client); - priv->client = NULL; + if (priv) { + if (priv->client) { + g_object_unref (priv->client); + priv->client = NULL; + } + + g_free (priv); + tasks->priv = NULL; + + all_tasks = g_list_remove (all_tasks, tasks); } - g_free (priv); - tasks->priv = NULL; - - all_tasks = g_list_remove (all_tasks, tasks); - if (GTK_OBJECT_CLASS (parent_class)->destroy) (* GTK_OBJECT_CLASS (parent_class)->destroy) (object); } diff --git a/calendar/gui/e-week-view.c b/calendar/gui/e-week-view.c index 406a3876d1..2ca52c8ca7 100644 --- a/calendar/gui/e-week-view.c +++ b/calendar/gui/e-week-view.c @@ -434,8 +434,8 @@ e_week_view_init (EWeekView *week_view) G_CALLBACK (selection_clear_event), (gpointer) week_view); g_signal_connect (week_view->invisible, "selection_received", G_CALLBACK (selection_received), (gpointer) week_view); - g_signal_connect (week_view->invisible, "destroy", - G_CALLBACK (invisible_destroyed), (gpointer) week_view); + g_signal_connect_after (week_view->invisible, "destroy", + G_CALLBACK (invisible_destroyed), (gpointer) week_view); week_view->clipboard_selection = NULL; @@ -4220,7 +4220,6 @@ e_week_view_get_time_string_width (EWeekView *week_view) static void invisible_destroyed (GtkWidget *invisible, EWeekView *week_view) { - gtk_object_unref (GTK_OBJECT (week_view->invisible)); week_view->invisible = NULL; } diff --git a/calendar/gui/gnome-cal.c b/calendar/gui/gnome-cal.c index bd480381a8..6dc44e5e78 100644 --- a/calendar/gui/gnome-cal.c +++ b/calendar/gui/gnome-cal.c @@ -916,56 +916,58 @@ gnome_calendar_destroy (GtkObject *object) gcal = GNOME_CALENDAR (object); priv = gcal->priv; - free_categories (priv->cal_categories); - priv->cal_categories = NULL; - - free_categories (priv->tasks_categories); - priv->tasks_categories = NULL; + if (priv) { + free_categories (priv->cal_categories); + priv->cal_categories = NULL; - /* Save the TaskPad layout. */ - filename = g_strdup_printf ("%s/config/TaskPad", evolution_dir); - e_calendar_table_save_state (E_CALENDAR_TABLE (priv->todo), filename); - g_free (filename); + free_categories (priv->tasks_categories); + priv->tasks_categories = NULL; + + /* Save the TaskPad layout. */ + filename = g_strdup_printf ("%s/config/TaskPad", evolution_dir); + e_calendar_table_save_state (E_CALENDAR_TABLE (priv->todo), filename); + g_free (filename); + + if (priv->dn_query) { + g_signal_handlers_disconnect_matched (priv->dn_query, G_SIGNAL_MATCH_DATA, + 0, 0, NULL, NULL, gcal); + g_object_unref (priv->dn_query); + priv->dn_query = NULL; + } - if (priv->dn_query) { - g_signal_handlers_disconnect_matched (priv->dn_query, G_SIGNAL_MATCH_DATA, - 0, 0, NULL, NULL, gcal); - g_object_unref (priv->dn_query); - priv->dn_query = NULL; - } + if (priv->sexp) { + g_free (priv->sexp); + priv->sexp = NULL; + } - if (priv->sexp) { - g_free (priv->sexp); - priv->sexp = NULL; - } + if (priv->client) { + g_signal_handlers_disconnect_matched (priv->client, G_SIGNAL_MATCH_DATA, + 0, 0, NULL, NULL, gcal); + g_object_unref (priv->client); + priv->client = NULL; + } - if (priv->client) { - g_signal_handlers_disconnect_matched (priv->client, G_SIGNAL_MATCH_DATA, - 0, 0, NULL, NULL, gcal); - g_object_unref (priv->client); - priv->client = NULL; - } + if (priv->task_pad_client) { + g_signal_handlers_disconnect_matched (priv->task_pad_client, G_SIGNAL_MATCH_DATA, + 0, 0, NULL, NULL, gcal); + g_object_unref (priv->task_pad_client); + priv->task_pad_client = NULL; + } - if (priv->task_pad_client) { - g_signal_handlers_disconnect_matched (priv->task_pad_client, G_SIGNAL_MATCH_DATA, - 0, 0, NULL, NULL, gcal); - g_object_unref (priv->task_pad_client); - priv->task_pad_client = NULL; - } + if (priv->view_instance) { + g_object_unref (priv->view_instance); + priv->view_instance = NULL; + } - if (priv->view_instance) { - g_object_unref (priv->view_instance); - priv->view_instance = NULL; - } + if (priv->view_menus) { + g_object_unref (priv->view_menus); + priv->view_menus = NULL; + } - if (priv->view_menus) { - g_object_unref (priv->view_menus); - priv->view_menus = NULL; + g_free (priv); + gcal->priv = NULL; } - - g_free (priv); - gcal->priv = NULL; - + if (GTK_OBJECT_CLASS (parent_class)->destroy) (* GTK_OBJECT_CLASS (parent_class)->destroy) (object); } -- cgit v1.2.3