]> err.no Git - dpkg/commitdiff
Reduce dselect memory usage
authorMichel Lespinasse <walken@zoy.org>
Sun, 6 Jul 2008 18:45:48 +0000 (20:45 +0200)
committerRaphael Hertzog <hertzog@debian.org>
Sun, 6 Jul 2008 18:46:31 +0000 (20:46 +0200)
* dselect/baselist.cc (baselist::startdisplay): Create the
pad with the list of the size of the display and not of the
size of the list content itself.
* dselect/basetop.cc (baselist::refreshlist): The part to
display is always at the top of the pad.
(baselist::redrawitemsrange): Simplified to redraw the real
range only.
* dselect/pkglist.cc (packagelist::sortmakeheads): No need to reallocate
the pad when the list changes.
* dselect/pkgtop.cc (packagelist::redraw1itemsel): The line
of the item in the infopad doesn't correspond to its index in
the list any more. Adjust accordingly.

ChangeLog
THANKS
debian/changelog
dselect/baselist.cc
dselect/basetop.cc
dselect/pkglist.cc
dselect/pkgtop.cc

index d00287653d7fe7d946fb6940202c3cd96951237d..a7a2094e219666fac0bbc7f75a1a7f3f4a8af8c4 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,18 @@
+2008-07-06  Michel Lespinasse  <walken@zoy.org>
+
+       * dselect/baselist.cc (baselist::startdisplay): Create the
+       pad with the list of the size of the display and not of the
+       size of the list content itself.
+       * dselect/basetop.cc (baselist::refreshlist): The part to
+       display is always at the top of the pad.
+       (baselist::redrawitemsrange): Simplified to redraw the real
+       range only.
+       * dselect/pkglist.cc (packagelist::sortmakeheads): No need to reallocate
+       the pad when the list changes.
+       * dselect/pkgtop.cc (packagelist::redraw1itemsel): The line
+       of the item in the infopad doesn't correspond to its index in
+       the list any more. Adjust accordingly.
+
 2008-07-05  Guillem Jover  <guillem@debian.org>
 
        * src/archives.c (filesavespackage): Do not mark debug message for
diff --git a/THANKS b/THANKS
index 9fe83024e76cff9ca6d290371a9b3b9eb6a670b0..81fd913b6650e6279dc873731e8885dd901328b5 100644 (file)
--- a/THANKS
+++ b/THANKS
@@ -121,6 +121,7 @@ Michael Alan Dorman <mdorman@calder.med.miami.edu>
 Michael Shields <shields@crosslink.net>
 Michael Sobolev <mss@transas.com>
 Michael Vogt <mvo@ubuntu.com>
+Michel Lespinasse <walken@zoy.org>
 Miguel Figueiredo <elmig@debianpt.org>
 Miquel van Smoorenburg <miquels@cistron.nl>
 Miroslav Kure <kurem@debian.cz>
index 40bbb89838639f1a94b05d8e1dc72f4b69f4b444..eecb539a3301b6d3377e72b6bfa9c1bb36b3ad22 100644 (file)
@@ -64,6 +64,9 @@ dpkg (1.15.0) UNRELEASED; urgency=low
     Thanks to Thomas Hood <jdthood@yahoo.co.uk>. Closes: #107098
   * Use description of installed package as fallback in dselect.
     Based on a patch from Bruce Sass <bmsass@shaw.ca>. Closes: #21659
+  * Reduce memory usage of dselect by avoiding usage of a big infopad.
+    Thanks to Michel Lespinasse <walken@zoy.org> for the patch.
+    Closes: #395140
 
   [ Pierre Habouzit ]
   * Add a --query option to update-alternatives. Closes: #336091, #441904
index e7768a3fb77c2c5de99ddeb4c6659a5c2ebc549e..82ce4fa2c95f7334ff7e13833ffc5ca5266d7888 100644 (file)
@@ -171,7 +171,7 @@ void baselist::startdisplay() {
   if (!whatinfowin) ohshite(_("failed to create whatinfo window"));
   wattrset(whatinfowin,whatinfo_attr);
   
-  listpad= newpad(nitems+1, total_width);
+  listpad = newpad(ymax, total_width);
   if (!listpad) ohshite(_("failed to create baselist pad"));
   
   colheadspad= newpad(1, total_width);
index 6297ba89eb6a11b0252d17b3610e9c2c1c1e6868..85b63ed2b9698e5fbd6701b9cbc3ec64db3a71c8 100644 (file)
@@ -39,7 +39,7 @@ void baselist::refreshlist() {
                list_row + nitems - topofscreen - 1);
   x= lesserint(total_width - leftofscreen - 1,
                xmax - 1);
-  pnoutrefresh(listpad, topofscreen,leftofscreen, list_row,0, y,x);
+  pnoutrefresh(listpad, 0, leftofscreen, list_row, 0, y, x);
   getmaxyx(listpad,maxy,maxx);
   y++;
   while (y < list_row + list_height - 1) {
@@ -49,9 +49,10 @@ void baselist::refreshlist() {
 }
 
 void baselist::redrawitemsrange(int start, int end) {
-  if (ldrawnstart==-1) { ldrawnstart= ldrawnend= end; }
-  while (ldrawnstart > start) { ldrawnstart--; redraw1item(ldrawnstart); }
-  while (ldrawnend < end) { redraw1item(ldrawnend); ldrawnend++; }
+  int i;
+  for (i = start; i < end; i++) {
+    redraw1item(i);
+  }
 }
 
 void baselist::refreshcolheads() {
index 53bf43a57f8b06816475195cf530f37b1442c1b1..062181953c79ef24daff8907026a8eb041bcf6cc 100644 (file)
@@ -344,15 +344,7 @@ void packagelist::sortmakeheads() {
   }
 
   if (listpad) {
-    int maxx, maxy;
-    getmaxyx(listpad,maxx,maxy);
-    if (nitems > maxy) {
-      delwin(listpad);
-      listpad= newpad(nitems+1, total_width);
-      if (!listpad) ohshite("failed to create larger baselist pad");
-    } else if (nitems < maxy) {
-      werase(listpad);
-    }
+    werase(listpad);
   }
   
   sortinplace();
index 3022c50b20c64880885934acb053bfa2384900e3..8876e7db324e21b84981718ad6cd6620a0b375fc 100644 (file)
@@ -139,6 +139,7 @@ void packagelist::redraw1itemsel(int index, int selected) {
   const char *p;
   const struct pkginfo *pkg= table[index]->pkg;
   const struct pkginfoperfile *info= &pkg->available;
+  int screenline = index - topofscreen;
 
   wattrset(listpad, selected ? listsel_attr : list_attr);
 
@@ -146,7 +147,7 @@ void packagelist::redraw1itemsel(int index, int selected) {
 
     if (verbose) {
 
-      mvwprintw(listpad,index,0, "%-*.*s ",
+      mvwprintw(listpad, screenline, 0, "%-*.*s ",
                 status_hold_width, status_hold_width,
                 gettext(eflagstrings[pkg->eflag]));
       wprintw(listpad, "%-*.*s ",
@@ -164,14 +165,14 @@ void packagelist::redraw1itemsel(int index, int selected) {
       wattrset(listpad, selected ? listsel_attr : list_attr);
       waddch(listpad, ' ');
   
-      mvwprintw(listpad,index,priority_column-1, " %-*.*s",
+      mvwprintw(listpad, screenline, priority_column - 1, " %-*.*s",
                 priority_width, priority_width,
                 pkg->priority == pkginfo::pri_other ? pkg->otherpriority :
                 gettext(prioritystrings[pkg->priority]));
 
     } else {
 
-      mvwaddch(listpad,index,0, eflagchars[pkg->eflag]);
+      mvwaddch(listpad, screenline, 0, eflagchars[pkg->eflag]);
       waddch(listpad, statuschars[pkg->status]);
       waddch(listpad,
              /* fixme: keep this feature? */
@@ -182,7 +183,8 @@ void packagelist::redraw1itemsel(int index, int selected) {
       waddch(listpad, wantchars[table[index]->selected]);
       wattrset(listpad, selected ? listsel_attr : list_attr);
       
-      wmove(listpad,index,priority_column-1); waddch(listpad,' ');
+      wmove(listpad, screenline, priority_column - 1);
+      waddch(listpad, ' ');
       if (pkg->priority == pkginfo::pri_other) {
         int i;
         const char *p;
@@ -198,22 +200,22 @@ void packagelist::redraw1itemsel(int index, int selected) {
 
     }
 
-    mvwprintw(listpad,index,section_column-1, " %-*.*s",
+    mvwprintw(listpad, screenline, section_column - 1, " %-*.*s",
               section_width, section_width,
               pkg->section ? pkg->section : "?");
   
-    mvwprintw(listpad,index,package_column-1, " %-*.*s ",
+    mvwprintw(listpad, screenline, package_column - 1, " %-*.*s ",
               package_width, package_width, pkg->name);
 
     if (versioninstalled_width)
-      mvwprintw(listpad,index,versioninstalled_column, "%-*.*s ",
+      mvwprintw(listpad, screenline, versioninstalled_column, "%-*.*s ",
                 versioninstalled_width, versioninstalled_width,
                 versiondescribe(&pkg->installed.version, vdew_nonambig));
     if (versionavailable_width) {
       if (informativeversion(&pkg->available.version) &&
           versioncompare(&pkg->available.version,&pkg->installed.version) > 0)
         wattrset(listpad, selected ? selstatesel_attr : selstate_attr);
-      mvwprintw(listpad,index,versionavailable_column, "%-*.*s",
+      mvwprintw(listpad, screenline, versionavailable_column, "%-*.*s",
                 versionavailable_width, versionavailable_width,
                 versiondescribe(&pkg->available.version, vdew_nonambig));
       wattrset(listpad, selected ? listsel_attr : list_attr);
@@ -236,7 +238,7 @@ void packagelist::redraw1itemsel(int index, int selected) {
     
     indent= describemany(buf,priority,section,pkg->clientdata);
 
-    mvwaddstr(listpad,index,0, "    ");
+    mvwaddstr(listpad, screenline, 0, "    ");
     i= total_width-7;
     j= (indent<<1) + 1;
     while (j-- >0) { waddch(listpad,ACS_HLINE); i--; }