[Aptitude-svn-commit] r3759 - in branches/aptitude-0.3/aptitude: . src src/vscreen

Daniel Burrows dburrows at costa.debian.org
Mon Aug 8 22:37:53 UTC 2005


Author: dburrows
Date: Mon Aug  8 22:37:49 2005
New Revision: 3759

Modified:
   branches/aptitude-0.3/aptitude/ChangeLog
   branches/aptitude-0.3/aptitude/src/download_list.cc
   branches/aptitude-0.3/aptitude/src/download_manager.h
   branches/aptitude-0.3/aptitude/src/ui.cc
   branches/aptitude-0.3/aptitude/src/vscreen/vs_bin.cc
   branches/aptitude-0.3/aptitude/src/vscreen/vs_menubar.cc
   branches/aptitude-0.3/aptitude/src/vscreen/vs_minibuf_win.cc
   branches/aptitude-0.3/aptitude/src/vscreen/vs_multiplex.cc
   branches/aptitude-0.3/aptitude/src/vscreen/vs_stacked.cc
   branches/aptitude-0.3/aptitude/src/vscreen/vs_table.cc
   branches/aptitude-0.3/aptitude/src/vscreen/vscreen_widget.cc
   branches/aptitude-0.3/aptitude/src/vscreen/vscreen_widget.h
Log:
Make all containers destroy their contents in their own destroy routines.

Modified: branches/aptitude-0.3/aptitude/ChangeLog
==============================================================================
--- branches/aptitude-0.3/aptitude/ChangeLog	(original)
+++ branches/aptitude-0.3/aptitude/ChangeLog	Mon Aug  8 22:37:49 2005
@@ -1,5 +1,12 @@
 2005-08-08  Daniel Burrows  <dburrows at debian.org>
 
+	* src/vscreen/vs_bin.cc, src/vscreen/vscreen_widget.cc, src/vscreen/vscreen_widget.h, src/vscreen/vs_menubar.cc, src/vscreen/vs_minibuf_win.cc, src/vscreen/vs_multiplex.cc, src/vscreen/vs_stacked.cc, src/vscreen/vs_table.cc:
+
+	  Make sure that all containers destroy their contents in their
+	  own destroy() routines.  NB: since destroy() has a side effect
+	  of "remove me from my parent", the actual form of these routines
+	  may be a bit surprising!.
+
 	* src/ui.cc, src/vscreen/testvscreen.cc, src/vscreen/vscreen.cc, src/vscreen/vscreen.h:
 
 	  Update the handling of the top-level widget: you should now call

Modified: branches/aptitude-0.3/aptitude/src/download_list.cc
==============================================================================
--- branches/aptitude-0.3/aptitude/src/download_list.cc	(original)
+++ branches/aptitude-0.3/aptitude/src/download_list.cc	Mon Aug  8 22:37:49 2005
@@ -124,11 +124,11 @@
   do_layout.connect(sigc::mem_fun(*this, &download_list::layout_me));
 }
 
-// FIXME: just discarding this is not only bad -- it's also dangerous: it's a
-// *huge* potential memory leak.
 void download_list::destroy()
 {
   cancel();
+
+  vscreen_widget::destroy();
 }
 
 // all that CRITICAL_ENTER/CRITICAL_EXIT stuff is left out until I'm sure I
@@ -395,7 +395,7 @@
 void download_list::Complete(download_manager &manager)
 {
   // Really destroy ourselves.
-  vscreen_widget::destroy();
+  //vscreen_widget::destroy();
 }
 
 bool download_list::Pulse(pkgAcquire *Owner, download_manager &manager)

Modified: branches/aptitude-0.3/aptitude/src/download_manager.h
==============================================================================
--- branches/aptitude-0.3/aptitude/src/download_manager.h	(original)
+++ branches/aptitude-0.3/aptitude/src/download_manager.h	Mon Aug  8 22:37:49 2005
@@ -13,10 +13,32 @@
 #include <sigc++/signal.h>
 
 #include "aptitude.h"
+#include "vscreen/ref_ptr.h"
+
+class vscreen_widget;
+typedef ref_ptr<vscreen_widget> vs_widget_ref;
 
 class download_manager:public pkgAcquireStatus
 {
+  // A widget which should live in memory at least as long as this
+  // download does.  Used to ensure that widgets which are responsible
+  // for handling callbacks stick around long enough. (HACK?)
+  vs_widget_ref w;
 public:
+  download_manager() : w(NULL)
+  {
+  }
+
+  download_manager(const vs_widget_ref &_w)
+    :w(_w)
+  {
+  }
+
+  void set_widget(const vs_widget_ref &_w)
+  {
+    w = _w;
+  }
+
   // Private variables?  Bah, I'll give you private variables..
 
   struct timeval &get_time() {return Time;}

Modified: branches/aptitude-0.3/aptitude/src/ui.cc
==============================================================================
--- branches/aptitude-0.3/aptitude/src/ui.cc	(original)
+++ branches/aptitude-0.3/aptitude/src/ui.cc	Mon Aug  8 22:37:49 2005
@@ -1865,11 +1865,7 @@
       p->destroy();
     }
 
-  rootwin.bkgdset(' ');
-  rootwin.clear();
-  rootwin.refresh();
-
-  endwin();
+  vscreen_shutdown();
 }
 
 void popup_widget(vscreen_widget *w, bool do_show_all)

Modified: branches/aptitude-0.3/aptitude/src/vscreen/vs_bin.cc
==============================================================================
--- branches/aptitude-0.3/aptitude/src/vscreen/vs_bin.cc	(original)
+++ branches/aptitude-0.3/aptitude/src/vscreen/vs_bin.cc	Mon Aug  8 22:37:49 2005
@@ -55,7 +55,9 @@
 
 void vs_bin::destroy()
 {
-  set_subwidget(NULL);
+  if(subwidget.valid())
+    subwidget->destroy();
+  assert(!subwidget.valid());
 
   vs_container::destroy();
 }

Modified: branches/aptitude-0.3/aptitude/src/vscreen/vs_menubar.cc
==============================================================================
--- branches/aptitude-0.3/aptitude/src/vscreen/vs_menubar.cc	(original)
+++ branches/aptitude-0.3/aptitude/src/vscreen/vs_menubar.cc	Mon Aug  8 22:37:49 2005
@@ -32,14 +32,21 @@
 
 void vs_menubar::destroy()
 {
-  set_subwidget(NULL);
+  if(subwidget.valid())
+    subwidget->destroy();
+  assert(!subwidget.valid());
 
-  for(vector<item>::const_iterator i = items.begin();
-      i != items.end(); ++i)
-    i->menu->set_owner(NULL);
+  // ew.  You see, we need to individually destroy the subwidgets, but
+  // doing so will cause them to be removed, so we can't iterate over
+  // the main list...
+  vector<item> curr_items(items);
+
+  for(vector<item>::const_iterator i = curr_items.begin();
+      i != curr_items.end(); ++i)
+    i->menu->destroy();
 
-  items.clear();
-  active_menus.clear();
+  assert(items.empty());
+  assert(active_menus.empty());
 
   vs_container::destroy();
 }

Modified: branches/aptitude-0.3/aptitude/src/vscreen/vs_minibuf_win.cc
==============================================================================
--- branches/aptitude-0.3/aptitude/src/vscreen/vs_minibuf_win.cc	(original)
+++ branches/aptitude-0.3/aptitude/src/vscreen/vs_minibuf_win.cc	Mon Aug  8 22:37:49 2005
@@ -51,13 +51,15 @@
 
 void vs_minibuf_win::destroy()
 {
-  set_main_widget(NULL);
+  if(main_widget.valid())
+    main_widget->destroy();
+  assert(!main_widget.valid());
 
-  header->set_owner(NULL);
-  status->set_owner(NULL);
+  header->destroy();
+  status->destroy();
 
-  header = NULL;
-  status = NULL;
+  assert(!header.valid());
+  assert(!status.valid());
 
   vs_container::destroy();
 }
@@ -149,9 +151,18 @@
 
 void vs_minibuf_win::rem_widget(const vs_widget_ref &widget)
 {
-  defocus();
-  status->rem_widget(widget);
-  refocus();
+  if(widget == header)
+    header = NULL;
+  else if(widget == status)
+    status = NULL;
+  else if(widget == main_widget)
+    main_widget = NULL;
+  else
+    {
+      defocus();
+      status->rem_widget(widget);
+      refocus();
+    }
 }
 
 void vs_minibuf_win::show_all()

Modified: branches/aptitude-0.3/aptitude/src/vscreen/vs_multiplex.cc
==============================================================================
--- branches/aptitude-0.3/aptitude/src/vscreen/vs_multiplex.cc	(original)
+++ branches/aptitude-0.3/aptitude/src/vscreen/vs_multiplex.cc	Mon Aug  8 22:37:49 2005
@@ -45,12 +45,8 @@
 
 void vs_multiplex::destroy()
 {
-  for(list<child_info>::iterator i=children.begin();
-      i!=children.end();
-      i++)
-    i->w->set_owner(NULL);
-
-  children.clear();
+  while(!children.empty())
+    children.front().w->destroy();
 
   vs_passthrough::destroy();
 }

Modified: branches/aptitude-0.3/aptitude/src/vscreen/vs_stacked.cc
==============================================================================
--- branches/aptitude-0.3/aptitude/src/vscreen/vs_stacked.cc	(original)
+++ branches/aptitude-0.3/aptitude/src/vscreen/vs_stacked.cc	Mon Aug  8 22:37:49 2005
@@ -19,13 +19,8 @@
 
 void vs_stacked::destroy()
 {
-  for(std::list<child_info>::const_iterator i = children.begin();
-      i != children.end(); ++i)
-    {
-      assert(i->w->get_owner() == this);
-      i->w->set_owner(NULL);
-    }
-  children.clear();
+  while(!children.empty())
+    children.front().w->destroy();
 
   vs_passthrough::destroy();
 }

Modified: branches/aptitude-0.3/aptitude/src/vscreen/vs_table.cc
==============================================================================
--- branches/aptitude-0.3/aptitude/src/vscreen/vs_table.cc	(original)
+++ branches/aptitude-0.3/aptitude/src/vscreen/vs_table.cc	Mon Aug  8 22:37:49 2005
@@ -66,12 +66,8 @@
 
 void vs_table::destroy()
 {
-  // Delete all our children.
-  for(childlist::const_iterator i=children.begin();
-      i!=children.end(); ++i)
-    i->w->set_owner(NULL);
-
-  children.clear();
+  while(!children.empty())
+    children.front().w->destroy();
 
   vs_passthrough::destroy();
 }

Modified: branches/aptitude-0.3/aptitude/src/vscreen/vscreen_widget.cc
==============================================================================
--- branches/aptitude-0.3/aptitude/src/vscreen/vscreen_widget.cc	(original)
+++ branches/aptitude-0.3/aptitude/src/vscreen/vscreen_widget.cc	Mon Aug  8 22:37:49 2005
@@ -122,6 +122,11 @@
 
 void vscreen_widget::destroy()
 {
+  assert(refcount > 0);
+
+  // Make sure we don't die during the destroy routine.
+  vs_widget_ref this_ref = this;
+
   if(is_destroyed)
     return;
 

Modified: branches/aptitude-0.3/aptitude/src/vscreen/vscreen_widget.h
==============================================================================
--- branches/aptitude-0.3/aptitude/src/vscreen/vscreen_widget.h	(original)
+++ branches/aptitude-0.3/aptitude/src/vscreen/vscreen_widget.h	Mon Aug  8 22:37:49 2005
@@ -88,7 +88,7 @@
   friend bool vscreen_poll();
   friend void vscreen_mainloop(int);
   friend void vscreen_redraw();
-  friend void vscreen_settoplevel(const ref_ptr<vscreen_widget> &);
+  friend ref_ptr<vscreen_widget> vscreen_settoplevel(const ref_ptr<vscreen_widget> &);
   friend void vscreen_suspend_without_signals();
   friend void vscreen_resume();
   friend void vscreen_updatecursornow();



More information about the Aptitude-svn-commit mailing list