From: Hui Zhu <teawater@gmail.com>
To: Michael Snyder <msnyder@vmware.com>
Cc: Joel Brobecker <brobecker@adacore.com>,
"gdb-patches@sourceware.org" <gdb-patches@sourceware.org>
Subject: Re: [RFA] Structure and simplify record log in record.c
Date: Fri, 16 Oct 2009 02:52:00 -0000 [thread overview]
Message-ID: <daef60380910151951q68e8962fx8d792e551ee4dc24@mail.gmail.com> (raw)
In-Reply-To: <4AD75788.9050409@vmware.com>
Thanks Michael.
Hui
On Fri, Oct 16, 2009 at 01:10, Michael Snyder <msnyder@vmware.com> wrote:
> Hui Zhu wrote:
>>
>> Thanks Michaael and Joel,
>>
>> I think the other part of this patch is OK with me.
>>
>> But you still has 2 patches "[RFA] Fix off-by-one error in record.c
>> (record_list_release_first)" and "[RFA] Expand "info record" will
>> change the code of record list.
>> So maybe this patch need some update according to these patches.
>
> Don't worry -- it's my responsibility to keep it in sync.
> Committed as below, with Joel's suggestions and sync
> (test suites passed on x86).
>
>
>
> 2009-10-15 Michael Snyder <msnyder@vmware.com>
>
> * record.c (record_reg_alloc): New function.
> (record_reg_release): New function.
> (record_mem_alloc): New function.
> (record_mem_release): New function.
> (record_end_alloc): New function.
> (record_end_release): New function.
> (record_entry_release): New function.
> (record_list_release): Simplify, call record_entry_release.
> (record_list_release_next): Rename to record_list_release_following.
> Simplify and call record_entry_release.
> (record_list_release_first): Simplify, comment, and use
> record_entry_release.
> (record_arch_list_add_reg): Simplify, call record_reg_alloc.
> (record_arch_list_add_mem): Simplify, call record_mem_alloc.
> (record_arch_list_add_end): Simplify, call record_end_alloc.
>
> Index: record.c
> ===================================================================
> RCS file: /cvs/src/src/gdb/record.c,v
> retrieving revision 1.21
> diff -u -p -r1.21 record.c
> --- record.c 15 Oct 2009 16:57:36 -0000 1.21
> +++ record.c 15 Oct 2009 17:14:30 -0000
> @@ -129,50 +129,143 @@ static int (*record_beneath_to_insert_br
> static int (*record_beneath_to_remove_breakpoint) (struct gdbarch *,
> struct bp_target_info *);
>
> +/* Alloc and free functions for record_reg, record_mem, and record_end
> + entries. */
> +
> +/* Alloc a record_reg record entry. */
> +
> +static inline struct record_entry *
> +record_reg_alloc (struct regcache *regcache, int regnum)
> +{
> + struct record_entry *rec;
> + struct gdbarch *gdbarch = get_regcache_arch (regcache);
> +
> + rec = (struct record_entry *) xcalloc (1, sizeof (struct record_entry));
> + rec->type = record_reg;
> + rec->u.reg.num = regnum;
> + rec->u.reg.val = (gdb_byte *) xmalloc (MAX_REGISTER_SIZE);
> +
> + return rec;
> +}
> +
> +/* Free a record_reg record entry. */
> +
> +static inline void
> +record_reg_release (struct record_entry *rec)
> +{
> + gdb_assert (rec->type == record_reg);
> + xfree (rec->u.reg.val);
> + xfree (rec);
> +}
> +
> +/* Alloc a record_mem record entry. */
> +
> +static inline struct record_entry *
> +record_mem_alloc (CORE_ADDR addr, int len)
> +{
> + struct record_entry *rec;
> +
> + rec = (struct record_entry *) xcalloc (1, sizeof (struct record_entry));
> + rec->type = record_mem;
> + rec->u.mem.addr = addr;
> + rec->u.mem.len = len;
> + rec->u.mem.val = (gdb_byte *) xmalloc (len);
> +
> + return rec;
> +}
> +
> +/* Free a record_mem record entry. */
> +
> +static inline void
> +record_mem_release (struct record_entry *rec)
> +{
> + gdb_assert (rec->type == record_mem);
> + xfree (rec->u.mem.val);
> + xfree (rec);
> +}
> +
> +/* Alloc a record_end record entry. */
> +
> +static inline struct record_entry *
> +record_end_alloc (void)
> +{
> + struct record_entry *rec;
> +
> + rec = (struct record_entry *) xcalloc (1, sizeof (struct record_entry));
> + rec->type = record_end;
> +
> + return rec;
> +}
> +
> +/* Free a record_end record entry. */
> +
> +static inline void
> +record_end_release (struct record_entry *rec)
> +{
> + xfree (rec);
> +}
> +
> +/* Free one record entry, any type.
> + Return entry->type, in case caller wants to know. */
> +
> +static inline enum record_type
> +record_entry_release (struct record_entry *rec)
> +{
> + enum record_type type = rec->type;
> +
> + switch (type) {
> + case record_reg:
> + record_reg_release (rec);
> + break;
> + case record_mem:
> + record_mem_release (rec);
> + break;
> + case record_end:
> + record_end_release (rec);
> + break;
> + }
> + return type;
> +}
> +
> +/* Free all record entries in list pointed to by REC. */
> +
> static void
> record_list_release (struct record_entry *rec)
> {
> - struct record_entry *tmp;
> -
> if (!rec)
> return;
>
> while (rec->next)
> - {
> - rec = rec->next;
> - }
> + rec = rec->next;
>
> while (rec->prev)
> {
> - tmp = rec;
> rec = rec->prev;
> - if (tmp->type == record_reg)
> - xfree (tmp->u.reg.val);
> - else if (tmp->type == record_mem)
> - xfree (tmp->u.mem.val);
> - xfree (tmp);
> + record_entry_release (rec->next);
> }
>
> - if (rec != &record_first)
> - xfree (rec);
> + if (rec == &record_first)
> + {
> + record_insn_num = 0;
> + record_first.next = NULL;
> + }
> + else
> + record_entry_release (rec);
> }
>
> +/* Free all record entries forward of the given list position. */
> +
> static void
> -record_list_release_next (void)
> +record_list_release_following (struct record_entry *rec)
> {
> - struct record_entry *rec = record_list;
> struct record_entry *tmp = rec->next;
> +
> rec->next = NULL;
> while (tmp)
> {
> rec = tmp->next;
> - if (tmp->type == record_end)
> + if (record_entry_release (tmp) == record_end)
> record_insn_num--;
> - else if (tmp->type == record_reg)
> - xfree (tmp->u.reg.val);
> - else if (tmp->type == record_mem)
> - xfree (tmp->u.mem.val);
> - xfree (tmp);
> tmp = rec;
> }
> }
> @@ -185,34 +278,31 @@ record_list_release_next (void)
> static void
> record_list_release_first (void)
> {
> - struct record_entry *tmp = NULL;
> - enum record_type type;
> + struct record_entry *tmp;
>
> if (!record_first.next)
> return;
>
> + /* Loop until a record_end. */
> while (1)
> {
> - type = record_first.next->type;
> -
> - if (type == record_reg)
> - xfree (record_first.next->u.reg.val);
> - else if (type == record_mem)
> - xfree (record_first.next->u.mem.val);
> + /* Cut record_first.next out of the linked list. */
> tmp = record_first.next;
> record_first.next = tmp->next;
> - xfree (tmp);
> + tmp->next->prev = &record_first;
> +
> + /* tmp is now isolated, and can be deleted. */
> + if (record_entry_release (tmp) == record_end)
> + {
> + record_insn_num--;
> + break; /* End loop at first record_end. */
> + }
>
> if (!record_first.next)
> {
> gdb_assert (record_insn_num == 1);
> - break;
> + break; /* End loop when list is empty. */
> }
> -
> - record_first.next->prev = &record_first;
> -
> - if (type == record_end)
> - break;
> }
> }
>
> @@ -239,10 +329,10 @@ record_arch_list_add (struct record_entr
> }
> }
>
> -/* Record the value of a register NUM to record_arch_list. */
> +/* Record the value of a register REGNUM to record_arch_list. */
>
> int
> -record_arch_list_add_reg (struct regcache *regcache, int num)
> +record_arch_list_add_reg (struct regcache *regcache, int regnum)
> {
> struct record_entry *rec;
>
> @@ -250,16 +340,11 @@ record_arch_list_add_reg (struct regcach
> fprintf_unfiltered (gdb_stdlog,
> "Process record: add register num = %d to "
> "record list.\n",
> - num);
> + regnum);
>
> - rec = (struct record_entry *) xmalloc (sizeof (struct record_entry));
> - rec->u.reg.val = (gdb_byte *) xmalloc (MAX_REGISTER_SIZE);
> - rec->prev = NULL;
> - rec->next = NULL;
> - rec->type = record_reg;
> - rec->u.reg.num = num;
> + rec = record_reg_alloc (regcache, regnum);
>
> - regcache_raw_read (regcache, num, rec->u.reg.val);
> + regcache_raw_read (regcache, regnum, rec->u.reg.val);
>
> record_arch_list_add (rec);
>
> @@ -280,17 +365,10 @@ record_arch_list_add_mem (CORE_ADDR addr
> "record list.\n",
> paddress (target_gdbarch, addr), len);
>
> - if (!addr)
> + if (!addr) /* FIXME: Why? Some arch must permit it... */
> return 0;
>
> - rec = (struct record_entry *) xmalloc (sizeof (struct record_entry));
> - rec->u.mem.val = (gdb_byte *) xmalloc (len);
> - rec->prev = NULL;
> - rec->next = NULL;
> - rec->type = record_mem;
> - rec->u.mem.addr = addr;
> - rec->u.mem.len = len;
> - rec->u.mem.mem_entry_not_accessible = 0;
> + rec = record_mem_alloc (addr, len);
>
> if (target_read_memory (addr, rec->u.mem.val, len))
> {
> @@ -299,8 +377,7 @@ record_arch_list_add_mem (CORE_ADDR addr
> "Process record: error reading memory at "
> "addr = %s len = %d.\n",
> paddress (target_gdbarch, addr), len);
> - xfree (rec->u.mem.val);
> - xfree (rec);
> + record_mem_release (rec);
> return -1;
> }
>
> @@ -320,10 +397,7 @@ record_arch_list_add_end (void)
> fprintf_unfiltered (gdb_stdlog,
> "Process record: add end to arch list.\n");
>
> - rec = (struct record_entry *) xmalloc (sizeof (struct record_entry));
> - rec->prev = NULL;
> - rec->next = NULL;
> - rec->type = record_end;
> + rec = record_end_alloc ();
> rec->u.end.sigval = TARGET_SIGNAL_0;
>
> record_arch_list_add (rec);
> @@ -818,7 +892,7 @@ record_wait (struct target_ops *ops,
> else
> {
> if (target_write_memory (record_list->u.mem.addr,
> - record_list->u.mem.val,
> + record_list->u.mem.val,
> record_list->u.mem.len))
> {
> if (execution_direction != EXEC_REVERSE)
> @@ -1059,7 +1133,7 @@ record_store_registers (struct target_op
> }
>
> /* Destroy the record from here forward. */
> - record_list_release_next ();
> + record_list_release_following (record_list);
> }
>
> record_registers_change (regcache, regno);
> @@ -1091,7 +1165,7 @@ record_xfer_partial (struct target_ops *
> error (_("Process record canceled the operation."));
>
> /* Destroy the record from here forward. */
> - record_list_release_next ();
> + record_list_release_following (record_list);
> }
>
> /* Check record_insn_num */
> @@ -1231,7 +1305,7 @@ cmd_record_delete (char *args, int from_
> if (!from_tty || query (_("Delete the log from this point forward "
> "and begin to record the running message
> "
> "at current PC?")))
> - record_list_release_next ();
> + record_list_release_following (record_list);
> }
> else
> printf_unfiltered (_("Already at end of record list.\n"));
>
>
prev parent reply other threads:[~2009-10-16 2:52 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2009-10-12 17:36 Michael Snyder
2009-10-12 23:12 ` Joel Brobecker
2009-10-15 6:43 ` Hui Zhu
2009-10-15 17:16 ` Michael Snyder
2009-10-16 2:52 ` Hui Zhu [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=daef60380910151951q68e8962fx8d792e551ee4dc24@mail.gmail.com \
--to=teawater@gmail.com \
--cc=brobecker@adacore.com \
--cc=gdb-patches@sourceware.org \
--cc=msnyder@vmware.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