From: Pedro Alves <palves@redhat.com>
To: Tom Tromey <tromey@redhat.com>
Cc: gdb-patches@sourceware.org
Subject: Re: [PATCH] target_wait/linux_nat_wait: Dump the passed in target options.
Date: Fri, 20 Jul 2012 16:59:00 -0000 [thread overview]
Message-ID: <50098E72.7050002@redhat.com> (raw)
In-Reply-To: <87a9yuwg7i.fsf@fleche.redhat.com>
On 07/20/2012 05:27 PM, Tom Tromey wrote:
>>>>>> "Pedro" == Pedro Alves <palves@redhat.com> 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 <palves@redhat.com>
* 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
prev parent reply other threads:[~2012-07-20 16:59 UTC|newest]
Thread overview: 3+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-07-20 15:49 Pedro Alves
2012-07-20 16:27 ` Tom Tromey
2012-07-20 16:59 ` Pedro Alves [this message]
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=50098E72.7050002@redhat.com \
--to=palves@redhat.com \
--cc=gdb-patches@sourceware.org \
--cc=tromey@redhat.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox