diff options
-rw-r--r-- | shell/ChangeLog | 7 | ||||
-rw-r--r-- | shell/e-component-registry.c | 45 |
2 files changed, 37 insertions, 15 deletions
diff --git a/shell/ChangeLog b/shell/ChangeLog index a2e060900c..8a1ff8c643 100644 --- a/shell/ChangeLog +++ b/shell/ChangeLog @@ -1,5 +1,12 @@ 2001-10-25 Ettore Perazzoli <ettore@ximian.com> + * e-component-registry.c (wait_for_corba_object_to_die): New + helper function. + (e_component_registry_restart_component): Use it. + (component_free): Call it to wait for the unowned object to die. + +2001-10-25 Ettore Perazzoli <ettore@ximian.com> + * e-shell.c (impl_Shell_selectUserFolder): Handle failure from XGetClassHint properly. Also, free res_name and res_class in case of success. Fixes #13554. diff --git a/shell/e-component-registry.c b/shell/e-component-registry.c index ffa3769000..7448e1b4a8 100644 --- a/shell/e-component-registry.c +++ b/shell/e-component-registry.c @@ -59,6 +59,28 @@ struct _EComponentRegistryPrivate { }; +/* Utility functions. */ + +static void +wait_for_corba_object_to_die (Bonobo_Unknown corba_objref, + const char *id) +{ + gboolean alive; + int count; + + count = 1; + while (1) { + alive = bonobo_unknown_ping (corba_objref); + if (! alive) + break; + + g_print ("Waiting for component to die -- %s (%d)\n", id, count); + sleep (1); + count ++; + } +} + + /* Component information handling. */ static Component * @@ -84,9 +106,11 @@ component_free (Component *component) CORBA_Environment ev; gboolean retval; + CORBA_exception_init (&ev); + corba_shell_component = bonobo_object_corba_objref (BONOBO_OBJECT (component->client)); + corba_shell_component = CORBA_Object_duplicate (corba_shell_component, &ev); - CORBA_exception_init (&ev); GNOME_Evolution_ShellComponent_unsetOwner (corba_shell_component, &ev); if (ev._major == CORBA_NO_EXCEPTION) retval = TRUE; @@ -94,11 +118,13 @@ component_free (Component *component) retval = FALSE; CORBA_exception_free (&ev); - g_free (component->id); - bonobo_object_unref (BONOBO_OBJECT (component->client)); + wait_for_corba_object_to_die (corba_shell_component, component->id); + CORBA_Object_release (corba_shell_component, &ev); + e_free_string_list (component->folder_type_names); + g_free (component->id); g_free (component); @@ -419,8 +445,6 @@ e_component_registry_restart_component (EComponentRegistry *component_registry, Component *component; CORBA_Environment ev; CORBA_Object corba_objref; - gboolean alive; - int count; g_return_val_if_fail (component_registry != NULL, NULL); g_return_val_if_fail (E_IS_COMPONENT_REGISTRY (component_registry), NULL); @@ -440,16 +464,7 @@ e_component_registry_restart_component (EComponentRegistry *component_registry, component_free (component); - count = 1; - while (1) { - alive = bonobo_unknown_ping (corba_objref); - if (! alive) - break; - - g_print ("Waiting for component to die -- %s (%d)\n", id, count); - sleep (1); - count ++; - } + wait_for_corba_object_to_die (component, id); CORBA_exception_free (&ev); |