From 1ef8573cc77c91feeef3edab74d383d20809eb33 Mon Sep 17 00:00:00 2001
From: Andrew Burgess <andrew.burgess@embecosm.com>
Date: Wed, 9 Jan 2019 14:02:39 +0000
Subject: gdb: Improve scoped_switch_fork_info class

After committing this patch I got this feedback:

   https://sourceware.org/ml/gdb-patches/2019-01/msg00181.html

This patch makes the constructor of scoped_switch_fork_info explicit,
and wraps the core of the destructor in a TRY/CATCH block.

I've run this through the testsuite on X86-64/GNU Linux, however, this
code is not exercised, so this patch is untested.

gdb/ChangeLog:

	* linux-fork.c (scoped_switch_fork_info)
	<scoped_switch_fork_info>: Make explicit.
	<~scoped_switch_fork_info>: Wrap core in TRY/CATCH.
---
 gdb/ChangeLog    |  6 ++++++
 gdb/linux-fork.c | 17 +++++++++++++----
 2 files changed, 19 insertions(+), 4 deletions(-)

(limited to 'gdb')

diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index 32fe0bb..f449d68 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,3 +1,9 @@
+2019-01-10  Andrew Burgess  <andrew.burgess@embecosm.com>
+
+	* linux-fork.c (scoped_switch_fork_info)
+	<scoped_switch_fork_info>: Make explicit.
+	<~scoped_switch_fork_info>: Wrap core in TRY/CATCH.
+
 2019-01-10  Tom Tromey  <tom@tromey.com>
 
 	* objfiles.h (objfile::reset_psymtabs): Update.
diff --git a/gdb/linux-fork.c b/gdb/linux-fork.c
index f3231ba..9bbf9c4 100644
--- a/gdb/linux-fork.c
+++ b/gdb/linux-fork.c
@@ -446,7 +446,7 @@ class scoped_switch_fork_info
 public:
   /* Switch to the infrun state held on the fork_info identified by
      PPTID.  If PPTID is the current inferior then no switch is done.  */
-  scoped_switch_fork_info (ptid_t pptid)
+  explicit scoped_switch_fork_info (ptid_t pptid)
     : m_oldfp (nullptr)
   {
     if (pptid != inferior_ptid)
@@ -472,9 +472,18 @@ public:
     if (m_oldfp != nullptr)
       {
 	/* Switch back to inferior_ptid.  */
-	remove_breakpoints ();
-	fork_load_infrun_state (m_oldfp);
-	insert_breakpoints ();
+	TRY
+	  {
+	    remove_breakpoints ();
+	    fork_load_infrun_state (m_oldfp);
+	    insert_breakpoints ();
+	  }
+	CATCH (ex, RETURN_MASK_ALL)
+	  {
+	    warning (_("Couldn't restore checkpoint state in %s: %s"),
+		     target_pid_to_str (fp->ptid), ex.message);
+	  }
+	END_CATCH
       }
   }
 
-- 
cgit v1.1