static int chainlist_show(sym_chainlist_t *chainlist, win_reg_t *reg) { sym_callchain_t *chain; int nentry, nchain; int i, j = 0, k, nlines; char content[WIN_LINECHAR_MAX]; callchain_line_t *buf, *line; sym_callchain_resort(chainlist); nentry = sym_chainlist_nentry(chainlist, &nchain); reg_erase(reg); if (nentry == 0) { snprintf(content, WIN_LINECHAR_MAX, "<- Detecting call-chain ... -> "); reg_line_write(reg, 0, ALIGN_LEFT, content); dump_write("%s\n", content); reg_refresh_nout(reg); return (0); } nlines = nentry + 2 * nchain; if ((buf = zalloc(nlines * sizeof (callchain_line_t))) == NULL) { return (-1); } for (i = 0; i < nchain; i++) { if ((chain = sym_callchain_detach(chainlist)) == NULL) { break; } line = &buf[j++]; snprintf(line->content, WIN_LINECHAR_MAX, "<- call-chain %d: ->", i + 1); for (k = 0; k < chain->nentry; k++) { line = &buf[j++]; strncpy(line->content, chain->entry_arr[k].name, WIN_LINECHAR_MAX); line->content[WIN_LINECHAR_MAX - 1] = 0; } line = &buf[j++]; strcpy(line->content, ""); sym_callchain_free(chain); } if (reg->buf != NULL) { free(reg->buf); } reg->buf = (void *)buf; reg->nlines_total = nlines - 1; reg_scroll_show(reg, (void *)(reg->buf), nlines - 1, callchain_str_build); reg_refresh_nout(reg); sym_chainlist_free(chainlist); return (0); }
void sym_callchain_resort(sym_chainlist_t *list) { sym_chainlist_t sortlist; sym_callchain_t *p; memset(&sortlist, 0, sizeof (sym_chainlist_t)); while (list->num > 0) { if ((p = max_access_chain(list)) == NULL) { break; } /* * Remove the found node from list */ chainlist_detach(list, p); chainlist_attach_tail(&sortlist, p); } sym_chainlist_free(list); memcpy(list, &sortlist, sizeof (sym_chainlist_t)); }