From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 17324 invoked by alias); 20 Jul 2012 16:59:49 -0000 Received: (qmail 17316 invoked by uid 22791); 20 Jul 2012 16:59:47 -0000 X-SWARE-Spam-Status: No, hits=-7.5 required=5.0 tests=AWL,BAYES_00,KHOP_RCVD_UNTRUST,KHOP_THREADED,RCVD_IN_DNSWL_HI,RCVD_IN_HOSTKARMA_W,SPF_HELO_PASS,TW_EG,T_RP_MATCHES_RCVD X-Spam-Check-By: sourceware.org Received: from mx1.redhat.com (HELO mx1.redhat.com) (209.132.183.28) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Fri, 20 Jul 2012 16:59:33 +0000 Received: from int-mx11.intmail.prod.int.phx2.redhat.com (int-mx11.intmail.prod.int.phx2.redhat.com [10.5.11.24]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id q6KGxW2Q023355 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Fri, 20 Jul 2012 12:59:32 -0400 Received: from [127.0.0.1] (ovpn01.gateway.prod.ext.ams2.redhat.com [10.39.146.11]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id q6KGxUkV017363; Fri, 20 Jul 2012 12:59:31 -0400 Message-ID: <50098E72.7050002@redhat.com> Date: Fri, 20 Jul 2012 16:59:00 -0000 From: Pedro Alves User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:13.0) Gecko/20120615 Thunderbird/13.0.1 MIME-Version: 1.0 To: Tom Tromey CC: gdb-patches@sourceware.org Subject: Re: [PATCH] target_wait/linux_nat_wait: Dump the passed in target options. References: <20120720154934.25085.71708.stgit@brno.lan> <87a9yuwg7i.fsf@fleche.redhat.com> In-Reply-To: <87a9yuwg7i.fsf@fleche.redhat.com> Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org X-SW-Source: 2012-07/txt/msg00404.txt.bz2 On 07/20/2012 05:27 PM, Tom Tromey wrote: >>>>>> "Pedro" == Pedro Alves writes: > > Pedro> + if (list == NULL) > Pedro> + return xstrdup (elem); > Pedro> + else > Pedro> + return concat (list, ", ", elem, (char *) NULL); > > If list is non-NULL and allocated by malloc, then it will be leaked. Whoops. I somehow confused concat with reconcat. > > Pedro> +#define DO_TARG_OPTION(OPT) \ > Pedro> + ret = do_option (&target_options, ret, OPT, #OPT) > Pedro> + > Pedro> + DO_TARG_OPTION (TARGET_WNOHANG); > Pedro> + > Pedro> + if (target_options != 0) > Pedro> + ret = str_comma_list_concat_elem (ret, "unknown???"); > > That could conceivably happen here. > > I think the fix is just to use > > return reconcat (list, list, ", ", elem, (char *) NULL); That was indeed the intent. Thanks for spotting this. Here's the version I checked in. Also extended the comments a bit. 2012-07-20 Pedro Alves * linux-nat.c (linux_nat_wait): Dump the passed in target options. * target.c (target_wait): Likewise. (str_comma_list_concat_elem, do_option, target_options_to_string): New functions. * target.h (target_options_to_string): Declare. --- gdb/linux-nat.c | 12 +++++++++-- gdb/target.c | 58 ++++++++++++++++++++++++++++++++++++++++++++++++++++--- gdb/target.h | 4 ++++ 3 files changed, 69 insertions(+), 5 deletions(-) diff --git a/gdb/linux-nat.c b/gdb/linux-nat.c index d2a529a..c25f155 100644 --- a/gdb/linux-nat.c +++ b/gdb/linux-nat.c @@ -3929,8 +3929,16 @@ linux_nat_wait (struct target_ops *ops, ptid_t event_ptid; if (debug_linux_nat) - fprintf_unfiltered (gdb_stdlog, - "linux_nat_wait: [%s]\n", target_pid_to_str (ptid)); + { + char *options_string; + + options_string = target_options_to_string (target_options); + fprintf_unfiltered (gdb_stdlog, + "linux_nat_wait: [%s], [%s]\n", + target_pid_to_str (ptid), + options_string); + xfree (options_string); + } /* Flush the async file first. */ if (target_can_async_p ()) diff --git a/gdb/target.c b/gdb/target.c index bb8eae8..ae31415 100644 --- a/gdb/target.c +++ b/gdb/target.c @@ -2629,13 +2629,17 @@ target_wait (ptid_t ptid, struct target_waitstatus *status, int options) if (targetdebug) { char *status_string; + char *options_string; status_string = target_waitstatus_to_string (status); + options_string = target_options_to_string (options); fprintf_unfiltered (gdb_stdlog, - "target_wait (%d, status) = %d, %s\n", - PIDGET (ptid), PIDGET (retval), - status_string); + "target_wait (%d, status, options={%s})" + " = %d, %s\n", + PIDGET (ptid), options_string, + PIDGET (retval), status_string); xfree (status_string); + xfree (options_string); } return retval; @@ -3885,6 +3889,54 @@ target_waitstatus_to_string (const struct target_waitstatus *ws) } } +/* Concatenate ELEM to LIST, a comma separate list, and return the + result. The LIST incoming argument is released. */ + +static char * +str_comma_list_concat_elem (char *list, const char *elem) +{ + if (list == NULL) + return xstrdup (elem); + else + return reconcat (list, list, ", ", elem, (char *) NULL); +} + +/* Helper for target_options_to_string. If OPT is present in + TARGET_OPTIONS, append the OPT_STR (string version of OPT) in RET. + Returns the new resulting string. OPT is removed from + TARGET_OPTIONS. */ + +static char * +do_option (int *target_options, char *ret, + int opt, char *opt_str) +{ + if ((*target_options & opt) != 0) + { + ret = str_comma_list_concat_elem (ret, opt_str); + *target_options &= ~opt; + } + + return ret; +} + +char * +target_options_to_string (int target_options) +{ + char *ret = NULL; + +#define DO_TARG_OPTION(OPT) \ + ret = do_option (&target_options, ret, OPT, #OPT) + + DO_TARG_OPTION (TARGET_WNOHANG); + + if (target_options != 0) + ret = str_comma_list_concat_elem (ret, "unknown???"); + + if (ret == NULL) + ret = xstrdup (""); + return ret; +} + static void debug_print_register (const char * func, struct regcache *regcache, int regno) diff --git a/gdb/target.h b/gdb/target.h index 54c58d6..95cfbe2 100644 --- a/gdb/target.h +++ b/gdb/target.h @@ -198,6 +198,10 @@ struct syscall Space for the result is malloc'd, caller must free. */ extern char *target_waitstatus_to_string (const struct target_waitstatus *); +/* Return a pretty printed form of TARGET_OPTIONS. + Space for the result is malloc'd, caller must free. */ +extern char *target_options_to_string (int target_options); + /* Possible types of events that the inferior handler will have to deal with. */ enum inferior_event_type