tags 395140 patch thanks The following patch seems to reduce dselect memory usage by using a smaller ncurses buffer size. Interactive performance is useable again on my 32MB test box.
Thanks, -- Michel "Walken" Lespinasse "Bill Gates is a monocle and a Persian cat away from being the villain in a James Bond movie." -- Dennis Miller
diff -ru dpkg-1.13.24.orig/dselect/baselist.cc dpkg-1.13.24/dselect/baselist.cc --- dpkg-1.13.24.orig/dselect/baselist.cc 2006-06-21 06:41:12.000000000 -0700 +++ dpkg-1.13.24/dselect/baselist.cc 2006-10-25 04:08:19.000000000 -0700 @@ -170,7 +170,7 @@ 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 -ru dpkg-1.13.24.orig/dselect/basetop.cc dpkg-1.13.24/dselect/basetop.cc --- dpkg-1.13.24.orig/dselect/basetop.cc 2006-06-21 06:41:12.000000000 -0700 +++ dpkg-1.13.24/dselect/basetop.cc 2006-10-25 04:23:55.000000000 -0700 @@ -39,7 +39,7 @@ 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::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 -ru dpkg-1.13.24.orig/dselect/pkglist.cc dpkg-1.13.24/dselect/pkglist.cc --- dpkg-1.13.24.orig/dselect/pkglist.cc 2006-06-21 06:41:12.000000000 -0700 +++ dpkg-1.13.24/dselect/pkglist.cc 2006-10-25 04:24:09.000000000 -0700 @@ -340,15 +340,7 @@ } 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 -ru dpkg-1.13.24.orig/dselect/pkgtop.cc dpkg-1.13.24/dselect/pkgtop.cc --- dpkg-1.13.24.orig/dselect/pkgtop.cc 2006-06-21 06:41:12.000000000 -0700 +++ dpkg-1.13.24/dselect/pkgtop.cc 2006-10-25 03:47:51.000000000 -0700 @@ -139,6 +139,7 @@ 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 @@ 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 @@ 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,7 @@ 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 +199,22 @@ } - 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_never)); 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_never)); wattrset(listpad, selected ? listsel_attr : list_attr); @@ -235,7 +236,7 @@ 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--; }