From patchwork Tue Jun 30 02:32:12 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Patrick Palka X-Patchwork-Id: 7431 Received: (qmail 125101 invoked by alias); 30 Jun 2015 02:32:31 -0000 Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org Delivered-To: mailing list gdb-patches@sourceware.org Received: (qmail 125084 invoked by uid 89); 30 Jun 2015 02:32:31 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-1.6 required=5.0 tests=AWL, BAYES_00, KAM_LAZY_DOMAIN_SECURITY, RCVD_IN_DNSWL_LOW autolearn=no version=3.3.2 X-HELO: mail-qg0-f52.google.com Received: from mail-qg0-f52.google.com (HELO mail-qg0-f52.google.com) (209.85.192.52) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with (AES128-GCM-SHA256 encrypted) ESMTPS; Tue, 30 Jun 2015 02:32:29 +0000 Received: by qgem68 with SMTP id m68so23538952qge.0 for ; Mon, 29 Jun 2015 19:32:27 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=HospzzOBTH3JaqZcN0ENFd4qxtqmq3Fy7JQZiXnl52w=; b=H7rZWFW/FuUp0upoTFBDnsqyZkvwV8Xz3n5Q//V+mc8UaUWnS1Ah998QKxXwOoMQiI 0LfO2TdYo7/zPOBWdvethIT6VnCGhGO5mltp81AmfhP6D7blGNPHnRDCeJKEzxOttu09 PeCXbWy+sjNK/R52x++xuUJeY6yY0OVGfqvwuAKGxlpNusyQna4VN7VUNpkl0Wh9y9Ih GggX3yeKGBUSYf/ImSdTN7ZhBrgez9yl7nR/FPLS3nyGg4kgPcxs63FMBPVkAQ2Tr1Ef GC18mie24tzcK24hqt6TO6kFVZkT4N6DsDyOzXLefe/4jwp7p50K5U+vklu+/C8LaFOY tjyw== X-Gm-Message-State: ALoCoQnzZl0tZs3A8XiRe1GjrYGHQel14zR7UEPh7h3IIv8Yt2A59+PzTqawgAG2gcr6NBwC+RzG X-Received: by 10.55.33.38 with SMTP id h38mr37534490qkh.44.1435631547146; Mon, 29 Jun 2015 19:32:27 -0700 (PDT) Received: from localhost.localdomain (ool-4353acd8.dyn.optonline.net. [67.83.172.216]) by mx.google.com with ESMTPSA id f137sm12363666qhc.41.2015.06.29.19.32.26 (version=TLSv1.2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Mon, 29 Jun 2015 19:32:26 -0700 (PDT) From: Patrick Palka To: gdb-patches@sourceware.org Cc: Patrick Palka Subject: [PATCH] Be lazy about refreshing the windows in tui_show_frame_info (PR tui/13378) Date: Mon, 29 Jun 2015 22:32:12 -0400 Message-Id: <1435631532-32504-1-git-send-email-patrick@parcs.ath.cx> In-Reply-To: <1435372525-1374-2-git-send-email-patrick@parcs.ath.cx> References: <1435372525-1374-2-git-send-email-patrick@parcs.ath.cx> This revised patch makes sure that tui_set_locator_info returns 1 when the locator is first constructed, just in case none of the later checks trigger for some reason. gdb/ChangeLog: * tui/tui-stack.c (tui_set_locator_info): Change prototype to return an int instead of void. Return whether the locator window has changed. (tui_show_frame_info): If the locator info has not changed, then bail out early to avoid refreshing the windows. --- gdb/tui/tui-stack.c | 67 ++++++++++++++++++++++++++++++++++++++++------------- 1 file changed, 51 insertions(+), 16 deletions(-) diff --git a/gdb/tui/tui-stack.c b/gdb/tui/tui-stack.c index b17d303..e077245 100644 --- a/gdb/tui/tui-stack.c +++ b/gdb/tui/tui-stack.c @@ -48,10 +48,10 @@ static char *tui_get_function_from_frame (struct frame_info *fi); static void tui_set_locator_fullname (const char *fullname); /* Update the locator, with the provided arguments. */ -static void tui_set_locator_info (struct gdbarch *gdbarch, - const char *fullname, - const char *procname, - int lineno, CORE_ADDR addr); +static int tui_set_locator_info (struct gdbarch *gdbarch, + const char *fullname, + const char *procname, + int lineno, CORE_ADDR addr); static void tui_update_command (char *, int); @@ -292,8 +292,12 @@ tui_set_locator_fullname (const char *fullname) strcat_to_buf (element->full_name, MAX_LOCATOR_ELEMENT_LEN, fullname); } -/* Update the locator, with the provided arguments. */ -static void +/* Update the locator, with the provided arguments. + + Returns 1 if any of the locator's fields were actually changed, + and 0 otherwise. */ + +static int tui_set_locator_info (struct gdbarch *gdbarch, const char *fullname, const char *procname, @@ -302,21 +306,36 @@ tui_set_locator_info (struct gdbarch *gdbarch, { struct tui_gen_win_info *locator = tui_locator_win_info_ptr (); struct tui_locator_element *element; + int locator_changed_p = 0; /* Allocate the locator content if necessary. */ if (locator->content_size <= 0) { locator->content = tui_alloc_content (1, LOCATOR_WIN); locator->content_size = 1; + locator_changed_p = 1; } element = &locator->content[0]->which_element.locator; + + if (procname != NULL) + locator_changed_p |= strncmp (element->proc_name, procname, + MAX_LOCATOR_ELEMENT_LEN) != 0; + locator_changed_p |= lineno != element->line_no; + locator_changed_p |= addr != element->addr; + locator_changed_p |= gdbarch != element->gdbarch; + if (fullname != NULL) + locator_changed_p |= strncmp (element->full_name, fullname, + MAX_LOCATOR_ELEMENT_LEN) != 0; + element->proc_name[0] = (char) 0; strcat_to_buf (element->proc_name, MAX_LOCATOR_ELEMENT_LEN, procname); element->line_no = lineno; element->addr = addr; element->gdbarch = gdbarch; tui_set_locator_fullname (fullname); + + return locator_changed_p; } /* Update only the full_name portion of the locator. */ @@ -327,11 +346,14 @@ tui_update_locator_fullname (const char *fullname) tui_show_locator_content (); } -/* Function to print the frame information for the TUI. */ +/* Function to print the frame information for the TUI. The windows are + refreshed only if frame information has changed since the last refresh. */ + void tui_show_frame_info (struct frame_info *fi) { struct tui_win_info *win_info; + int locator_changed_p; int i; if (fi) @@ -349,15 +371,23 @@ tui_show_frame_info (struct frame_info *fi) && tui_source_is_displayed (symtab_to_fullname (sal.symtab)); if (get_frame_pc_if_available (fi, &pc)) - tui_set_locator_info (get_frame_arch (fi), - (sal.symtab == 0 - ? "??" : symtab_to_fullname (sal.symtab)), - tui_get_function_from_frame (fi), - sal.line, - pc); + locator_changed_p + = tui_set_locator_info (get_frame_arch (fi), + (sal.symtab == 0 + ? "??" : symtab_to_fullname (sal.symtab)), + tui_get_function_from_frame (fi), + sal.line, + pc); else - tui_set_locator_info (get_frame_arch (fi), - "??", _(""), sal.line, 0); + locator_changed_p + = tui_set_locator_info (get_frame_arch (fi), + "??", _(""), sal.line, 0); + + /* If the locator information has not changed, then frame information has + not changed. If frame information has not changed, then the windows' + contents will not change. So don't bother refreshing the windows. */ + if (!locator_changed_p) + return; tui_show_locator_content (); start_line = 0; @@ -431,7 +461,12 @@ tui_show_frame_info (struct frame_info *fi) } else { - tui_set_locator_info (NULL, NULL, NULL, 0, (CORE_ADDR) 0); + locator_changed_p + = tui_set_locator_info (NULL, NULL, NULL, 0, (CORE_ADDR) 0); + + if (!locator_changed_p) + return; + tui_show_locator_content (); for (i = 0; i < (tui_source_windows ())->count; i++) {