summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJan Görig <jgorig@redhat.com>2011-04-18 16:06:54 +0200
committerJan Görig <jgorig@redhat.com>2011-04-18 16:06:54 +0200
commit2a2fa20656d77014cf28ecfeaef30293c0ec3985 (patch)
tree800607b48bc237ff8e9220a829c70036f03cc36c
parentaac0de89941681e1e5580756a0e89bd274178a9c (diff)
downloadprocps-ng-2a2fa20656d77014cf28ecfeaef30293c0ec3985.tar.gz
Fixed initialization and thread problems in top - changed by Jim
-rw-r--r--top.c42
1 files changed, 22 insertions, 20 deletions
diff --git a/top.c b/top.c
index 434cc1b..6f46207 100644
--- a/top.c
+++ b/top.c
@@ -194,7 +194,7 @@ static int *PHash_sav = HHash_one, // alternating 'old/new' hash tables
* Create string from cgroup array --
* ( eventually to find a home in libproc ? ) */
static void parse_cgroup (char *dst, size_t max, const proc_t *p) {
- int whackable_int;
+ int whackable_int = max;
char *ccgroup, *endp = dst;
*dst = '\0';
@@ -1025,7 +1025,7 @@ static char *linein (const char *prompt) {
}
putp(fmtmk("%s%s%s", tg2(beg, Msg_row), Cap_clr_eol, buf));
putp(tg2(beg+pos, Msg_row));
- } while (kbd_ENTER != key && kbd_ESC != key);
+ } while (key && kbd_ENTER != key && kbd_ESC != key);
return buf;
#undef sqzSTR
@@ -1661,7 +1661,7 @@ static void fields_utility (void) {
default: // keep gcc happy
break;
}
- } while ('q' != key && kbd_ESC != key);
+ } while (key && 'q' != key && kbd_ESC != key);
putp(Cap_curs_norm);
#undef unSCRL
#undef swapEM
@@ -1939,15 +1939,16 @@ static proc_t **procs_refresh (proc_t **ppt) {
// i) Allocated Chunks: *Existing* table; refresh + reuse
if (!Thread_mode) {
while (curmax < savmax) {
- if (ppt[curmax]->cmdline) {
- // skip if thread mode was never enabled (see note below)
- if (threadshown) {
- for (i = curmax + 1; i < savmax; i++)
- if (ppt[i]->cmdline == ppt[curmax]->cmdline)
- ppt[i]->cmdline = NULL;
+ if (ppt[curmax]->cmdline || ppt[curmax]->cgroup) {
+ if (threadshown) { // skip if never used (see note below)
+ for (i = curmax + 1; i < savmax; i++) {
+ if (ppt[i]->cmdline == ppt[curmax]->cmdline) ppt[i]->cmdline = NULL;
+ if (ppt[i]->cgroup == ppt[curmax]->cgroup) ppt[i]->cgroup = NULL;
+ }
}
- free(*ppt[curmax]->cmdline);
- ppt[curmax]->cmdline = NULL;
+ if (ppt[curmax]->cmdline) free(*ppt[curmax]->cmdline);
+ if (ppt[curmax]->cgroup) free(*ppt[curmax]->cgroup);
+ ppt[curmax]->cmdline = ppt[curmax]->cgroup = NULL;
}
if (!(ptask = readproc(PT, ppt[curmax]))) break;
prochlp(ptask); // tally & complete this proc_t
@@ -1958,15 +1959,16 @@ static proc_t **procs_refresh (proc_t **ppt) {
while (curmax < savmax) {
if (!(ptask = readproc(PT, NULL))) break;
while (curmax < savmax) {
- if (ppt[curmax]->cmdline) {
- /* note: threads share the same cmdline storage. so we must look
+ if (ppt[curmax]->cmdline || ppt[curmax]->cgroup) {
+ /* note: threads share some of the same storage, so we must look
through the rest of our table for duplicate ref's... */
- for (i = curmax + 1; i < savmax; i++)
- if (ppt[i]->cmdline == ppt[curmax]->cmdline)
- ppt[i]->cmdline = NULL;
- /* ...but free only once ! */
- free(*ppt[curmax]->cmdline);
- ppt[curmax]->cmdline = NULL;
+ for (i = curmax + 1; i < savmax; i++) {
+ if (ppt[i]->cmdline == ppt[curmax]->cmdline) ppt[i]->cmdline = NULL;
+ if (ppt[i]->cgroup == ppt[curmax]->cgroup) ppt[i]->cgroup = NULL;
+ } /* ...but free only once ! */
+ if (ppt[curmax]->cmdline) free(*ppt[curmax]->cmdline);
+ if (ppt[curmax]->cgroup) free(*ppt[curmax]->cgroup);
+ ppt[curmax]->cmdline = ppt[curmax]->cgroup = NULL;
}
if (!(pthrd = readtask(PT, ptask, ppt[curmax]))) break;
threadshown = 1;
@@ -3402,7 +3404,7 @@ static int window_show (proc_t **ppt, WIN_t *q, int wmax) {
qsort(ppt, Frame_maxtask, sizeof(proc_t *), Fieldstab[q->rc.sortindx].sort);
i = q->begtask;
- if (i > Frame_maxtask - 1) i = q->begtask = Frame_maxtask - 1;
+ if (i >= Frame_maxtask) i = q->begtask = Frame_maxtask - 1;
lwin = 1; // 1 for the ol' column header
wmax = winMIN(wmax, q->winlines+1); // ditto for winlines, too