From cf6b114b9b21840a55d5618910be6f4db1a9295c Mon Sep 17 00:00:00 2001 From: Michel Lespinasse Date: Sun, 6 Jul 2008 20:45:48 +0200 Subject: [PATCH] Reduce dselect memory usage * 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 | 15 +++++++++++++++ THANKS | 1 + debian/changelog | 3 +++ dselect/baselist.cc | 2 +- dselect/basetop.cc | 9 +++++---- dselect/pkglist.cc | 10 +--------- dselect/pkgtop.cc | 20 +++++++++++--------- 7 files changed, 37 insertions(+), 23 deletions(-) diff --git a/ChangeLog b/ChangeLog index d0028765..a7a2094e 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,18 @@ +2008-07-06 Michel Lespinasse + + * 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 * src/archives.c (filesavespackage): Do not mark debug message for diff --git a/THANKS b/THANKS index 9fe83024..81fd913b 100644 --- a/THANKS +++ b/THANKS @@ -121,6 +121,7 @@ Michael Alan Dorman Michael Shields Michael Sobolev Michael Vogt +Michel Lespinasse Miguel Figueiredo Miquel van Smoorenburg Miroslav Kure diff --git a/debian/changelog b/debian/changelog index 40bbb898..eecb539a 100644 --- a/debian/changelog +++ b/debian/changelog @@ -64,6 +64,9 @@ dpkg (1.15.0) UNRELEASED; urgency=low Thanks to Thomas Hood . Closes: #107098 * Use description of installed package as fallback in dselect. Based on a patch from Bruce Sass . Closes: #21659 + * Reduce memory usage of dselect by avoiding usage of a big infopad. + Thanks to Michel Lespinasse for the patch. + Closes: #395140 [ Pierre Habouzit ] * Add a --query option to update-alternatives. Closes: #336091, #441904 diff --git a/dselect/baselist.cc b/dselect/baselist.cc index e7768a3f..82ce4fa2 100644 --- a/dselect/baselist.cc +++ b/dselect/baselist.cc @@ -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); diff --git a/dselect/basetop.cc b/dselect/basetop.cc index 6297ba89..85b63ed2 100644 --- a/dselect/basetop.cc +++ b/dselect/basetop.cc @@ -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() { diff --git a/dselect/pkglist.cc b/dselect/pkglist.cc index 53bf43a5..06218195 100644 --- a/dselect/pkglist.cc +++ b/dselect/pkglist.cc @@ -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(); diff --git a/dselect/pkgtop.cc b/dselect/pkgtop.cc index 3022c50b..8876e7db 100644 --- a/dselect/pkgtop.cc +++ b/dselect/pkgtop.cc @@ -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--; } -- 2.39.5