From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 25606 invoked by alias); 11 Jul 2008 11:16:41 -0000 Received: (qmail 25532 invoked by uid 22791); 11 Jul 2008 11:16:37 -0000 X-Spam-Check-By: sourceware.org Received: from mail.codesourcery.com (HELO mail.codesourcery.com) (65.74.133.4) by sourceware.org (qpsmtpd/0.31) with ESMTP; Fri, 11 Jul 2008 11:16:19 +0000 Received: (qmail 21388 invoked from network); 11 Jul 2008 11:16:17 -0000 Received: from unknown (HELO orlando.local) (pedro@127.0.0.2) by mail.codesourcery.com with ESMTPA; 11 Jul 2008 11:16:17 -0000 From: Pedro Alves To: Daniel Jacobowitz Subject: Re: [non-stop] 10/10 handle exited threads [was: Re: [non-stop] 10/10 split user/internal threads] Date: Fri, 11 Jul 2008 11:16:00 -0000 User-Agent: KMail/1.9.9 Cc: gdb-patches@sourceware.org References: <200806152209.45049.pedro@codesourcery.com> <200807020439.07288.pedro@codesourcery.com> <20080707185930.GF1778@caradoc.them.org> In-Reply-To: <20080707185930.GF1778@caradoc.them.org> MIME-Version: 1.0 Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: 7bit Content-Disposition: inline Message-Id: <200807111216.16162.pedro@codesourcery.com> 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: 2008-07/txt/msg00184.txt.bz2 A Monday 07 July 2008 19:59:30, Daniel Jacobowitz wrote: > On Wed, Jul 02, 2008 at 04:39:07AM +0100, Pedro Alves wrote: > > (print_thread_info): Update. Account for exited threads. Don't > > warn about missed frame restoring here, it's done in the cleanup. > > its Fixed. > > > + /* Since the context is already set to this new thread, > > + reset it's ptid, and reswitch inferior_ptid to it. */ > > and here, too. Fixed. > > > @@ -163,6 +223,10 @@ add_thread (ptid_t ptid) > > return add_thread_with_info (ptid, NULL); > > } > > > > +/* Delete thread PTID and notify of thread exit. If this is > > + inferior_ptid, don't actually delete it, but tag it as exited and > > + do the notification. If PTID is the user selected thread, clear > > + it. */ > > void > > delete_thread (ptid_t ptid) > > { > > @@ -177,12 +241,35 @@ delete_thread (ptid_t ptid) > > if (!tp) > > return; > > > > + /* If this is the current thread, or there's code out there that > > + relies on it existing (refcout > 0) we can't delete yet. Mark it > > + as exited, and notify it. */ > > refcount Fixed. > > + count = frame_level; > > + frame = find_relative_frame (get_current_frame (), &count); > > + if (count == 0 > > + && frame != NULL > > + /* Either the frame ids match, of they're both invalid. > > + The later case is not failsafe, but since it's highly > > + unlikelly the search by level finds the wrong frame, > > + it's 99.9(9)% of the times (for all practical > > + purposes) safe. */ > > + && (frame_id_eq (get_frame_id (frame), a_frame_id) > > + /* Note: could be better to check every frame_id > > + member for equality here. */ > > + || (!frame_id_p (get_frame_id (frame)) > > + && !frame_id_p (a_frame_id)))) > > Indentation, spelling; "latter" and "unlikely" and "of the time". Fixed. > > > @@ -877,18 +1057,10 @@ thread_apply_command (char *tidlist, int > > if (*cmd == '\000') > > error (_("Please specify a command following the thread ID list")); > > > > - current_ptid = inferior_ptid; > > - > > - if (!is_running (inferior_ptid)) > > - saved_frame_id = get_frame_id (get_selected_frame (NULL)); > > - else > > - saved_frame_id = null_frame_id; > > - old_chain = make_cleanup_restore_current_thread (inferior_ptid, > > saved_frame_id); - > > /* Save a copy of the command in case it is clobbered by > > execute_command */ > > saved_cmd = xstrdup (cmd); > > - saved_cmd_cleanup_chain = make_cleanup (xfree, (void *) saved_cmd); > > + old_chain = make_cleanup (xfree, saved_cmd); > > while (tidlist < cmd) > > { > > struct thread_info *tp; > > @@ -926,26 +1098,24 @@ thread_apply_command (char *tidlist, int > > warning (_("Thread %d has terminated."), start); > > else > > { > > + make_cleanup_restore_current_thread (); > > + > > if (non_stop) > > context_switch_to (tp->ptid); > > else > > switch_to_thread (tp->ptid); > > + > > printf_filtered (_("\nThread %d (%s):\n"), tp->num, > > target_tid_to_str (inferior_ptid)); > > execute_command (cmd, from_tty); > > - strcpy (cmd, saved_cmd); /* Restore exact command used previously > > */ + > > + /* Restore exact command used previously. */ > > + strcpy (cmd, saved_cmd); > > } > > } > > } > > > > - if (!ptid_equal (current_ptid, inferior_ptid)) > > - thread_has_changed = 1; > > - > > - do_cleanups (saved_cmd_cleanup_chain); > > do_cleanups (old_chain); > > - /* Print stack frame only if we changed thread. */ > > - if (thread_has_changed) > > - print_stack_frame (get_current_frame (), 1, SRC_LINE); > > } > > > > /* Switch to the specified thread. Will dispatch off to > > thread_apply_command > > You've moved creation of the cleanup into the loop, but not moved the > call to do_cleanups. Do we ever need more than one cleanup for a > thread apply command? > Ooops, sorry, I missed this, and committed without taking care of it. Let me come back to it in a sec, should be a minor change. > > + /* In non-stop mode, we don't want GDB to switch threads on the > > + user's back, to avoid races where the user is typing a command to > > + apply to thread x, but GDB switches to thread y before the user > > + finishes entering the command. */ > > behind the user's back Fixed. > Otherwise, OK. Thanks! I've checked it in. Next up, docs. -- Pedro Alves