[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