From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 31720 invoked by alias); 2 Dec 2009 03:23:14 -0000 Received: (qmail 31711 invoked by uid 22791); 2 Dec 2009 03:23:11 -0000 X-SWARE-Spam-Status: No, hits=-1.7 required=5.0 tests=AWL,BAYES_00,SARE_MSGID_LONG40,SPF_PASS X-Spam-Check-By: sourceware.org Received: from mail-pw0-f49.google.com (HELO mail-pw0-f49.google.com) (209.85.160.49) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Wed, 02 Dec 2009 03:23:06 +0000 Received: by pwi1 with SMTP id 1so2869733pwi.8 for ; Tue, 01 Dec 2009 19:23:04 -0800 (PST) MIME-Version: 1.0 Received: by 10.142.248.2 with SMTP id v2mr706843wfh.177.1259724184631; Tue, 01 Dec 2009 19:23:04 -0800 (PST) In-Reply-To: References: <20091125162458.GF26004@adacore.com> From: Hui Zhu Date: Wed, 02 Dec 2009 03:23:00 -0000 Message-ID: Subject: Re: [RFA] let record_resume fail immediately on error To: Tom Tromey , Joel Brobecker , Michael Snyder Cc: "gdb-patches@sourceware.org" Content-Type: text/plain; charset=ISO-8859-1 X-IsSubscribed: yes 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: 2009-12/txt/msg00010.txt.bz2 Thanks Tom, I make a new patch according it. Please help me review it. Thanks, Hui 2009-12-02 Hui Zhu * record.c (record_message): Change argument. (record_message_wrapper): New function. (do_record_message): Change it name to "record_message_wrapper_safe". Let it call "record_message_wrapper". (record_resume_error): Deleted. (record_resume): Call "record_message". (record_wait): Deleted record_resume_error. Call "record_message_wrapper_safe". Set status when do_record_message need stop the inferior. 2009-12-02 Hui Zhu * gdb.reverse/sigall-reverse.exp: Adjust. --- record.c | 70 ++++++++++++++----------------- testsuite/gdb.reverse/sigall-reverse.exp | 2 2 files changed, 34 insertions(+), 38 deletions(-) --- a/record.c +++ b/record.c @@ -572,17 +572,11 @@ record_arch_list_cleanups (void *ignore) record the running message of inferior and set them to record_arch_list, and add it to record_list. */ -struct record_message_args { - struct regcache *regcache; - enum target_signal signal; -}; - static int -record_message (void *args) +record_message (struct regcache *regcache, enum target_signal signal) { int ret; - struct record_message_args *myargs = args; - struct gdbarch *gdbarch = get_regcache_arch (myargs->regcache); + struct gdbarch *gdbarch = get_regcache_arch (regcache); struct cleanup *old_cleanups = make_cleanup (record_arch_list_cleanups, 0); record_arch_list_head = NULL; @@ -616,18 +610,18 @@ record_message (void *args) if (record_list != &record_first) /* FIXME better way to check */ { gdb_assert (record_list->type == record_end); - record_list->u.end.sigval = myargs->signal; + record_list->u.end.sigval = signal; } - if (myargs->signal == TARGET_SIGNAL_0 + if (signal == TARGET_SIGNAL_0 || !gdbarch_process_record_signal_p (gdbarch)) ret = gdbarch_process_record (gdbarch, - myargs->regcache, - regcache_read_pc (myargs->regcache)); + regcache, + regcache_read_pc (regcache)); else ret = gdbarch_process_record_signal (gdbarch, - myargs->regcache, - myargs->signal); + regcache, + signal); if (ret > 0) error (_("Process record: inferior program stopped.")); @@ -648,15 +642,29 @@ record_message (void *args) return 1; } +struct record_message_args { + struct regcache *regcache; + enum target_signal signal; +}; + static int -do_record_message (struct regcache *regcache, - enum target_signal signal) +record_message_wrapper (void *args) +{ + struct record_message_args *record_args = args; + + return record_message (record_args->regcache, record_args->signal); +} + +static int +record_message_wrapper_safe (struct regcache *regcache, + enum target_signal signal) { struct record_message_args args; args.regcache = regcache; args.signal = signal; - return catch_errors (record_message, &args, NULL, RETURN_MASK_ALL); + + return catch_errors (record_message_wrapper, &args, NULL, RETURN_MASK_ALL); } /* Set to 1 if record_store_registers and record_xfer_partial @@ -983,7 +991,6 @@ record_close (int quitting) } static int record_resume_step = 0; -static int record_resume_error; /* "to_resume" target method. Resume the process record target. */ @@ -995,15 +1002,7 @@ record_resume (struct target_ops *ops, p if (!RECORD_IS_REPLAY) { - if (do_record_message (get_current_regcache (), signal)) - { - record_resume_error = 0; - } - else - { - record_resume_error = 1; - return; - } + record_message (get_current_regcache (), signal); record_beneath_to_resume (record_beneath_to_resume_ops, ptid, 1, signal); } @@ -1067,14 +1066,6 @@ record_wait (struct target_ops *ops, if (!RECORD_IS_REPLAY && ops != &record_core_ops) { - if (record_resume_error) - { - /* If record_resume get error, return directly. */ - status->kind = TARGET_WAITKIND_STOPPED; - status->value.sig = TARGET_SIGNAL_ABRT; - return inferior_ptid; - } - if (record_resume_step) { /* This is a single step. */ @@ -1130,8 +1121,13 @@ record_wait (struct target_ops *ops, { /* This must be a single-step trap. Record the insn and issue another step. */ - if (!do_record_message (regcache, TARGET_SIGNAL_0)) - break; + if (!record_message_wrapper_safe (regcache, + TARGET_SIGNAL_0)) + { + status->kind = TARGET_WAITKIND_STOPPED; + status->value.sig = TARGET_SIGNAL_0; + break; + } record_beneath_to_resume (record_beneath_to_resume_ops, ptid, 1, --- a/testsuite/gdb.reverse/sigall-reverse.exp +++ b/testsuite/gdb.reverse/sigall-reverse.exp @@ -262,7 +262,7 @@ gdb_test "continue" \ "get signal TERM" gdb_test "continue" "Breakpoint.*handle_TERM.*" "send signal TERM" -gdb_test "continue" "Program received .*" "continue to sigall exit" \ +gdb_test "continue" "\[process \[0-9\]+ .*" "continue to sigall exit" \ "The next instruction is syscall exit_group.* program...y. or n. " \ "yes"