Disassembly: Improve reliability of client-side address navigation


diff --git a/dsf/org.eclipse.cdt.dsf.ui/src/org/eclipse/cdt/dsf/debug/internal/ui/disassembly/DisassemblyPart.java b/dsf/org.eclipse.cdt.dsf.ui/src/org/eclipse/cdt/dsf/debug/internal/ui/disassembly/DisassemblyPart.java
index 269700a..9444726 100644
--- a/dsf/org.eclipse.cdt.dsf.ui/src/org/eclipse/cdt/dsf/debug/internal/ui/disassembly/DisassemblyPart.java
+++ b/dsf/org.eclipse.cdt.dsf.ui/src/org/eclipse/cdt/dsf/debug/internal/ui/disassembly/DisassemblyPart.java
@@ -1380,8 +1380,17 @@
 	 */
 	@Override
 	public final void gotoAddress(IAddress address) {
+		assert isGuiThread();
 		if (address != null) {
-			gotoAddress(address.getValue());
+			final BigInteger addr = address.getValue();
+			startUpdate(new Runnable() {
+				@Override
+				public void run() {
+					fGotoFramePending = false;
+					fGotoAddressPending = PC_UNKNOWN;
+					gotoAddress(addr);
+				}
+			});
 		}
 	}
 	
@@ -1933,9 +1942,7 @@
 		final SafeRunnable safeUpdate = new SafeRunnable() {
 			@Override
 			public void run() {
-				if (updateCount == fUpdateCount && fViewer != null) {
-					update.run();
-				}
+				update.run();
 			}
 			@Override
 			public void handleException(Throwable e) {
@@ -1946,7 +1953,12 @@
 			invokeLater(new Runnable() {
 				@Override
 				public void run() {
-					SafeRunner.run(safeUpdate);
+					if (updateCount == fUpdateCount && fViewer != null) {
+						if (fUpdatePending)
+							invokeLater(this);
+						else
+							SafeRunner.run(safeUpdate);
+					}
 				}
 			});
 		} else {