From 1abc26d7a2b7172184c64d2151bf4803699993da Mon Sep 17 00:00:00 2001
From: Øyvind Harboe <oyvind.harboe@zylin.com>
Date: Mon, 20 Sep 2010 11:50:32 +0200
Subject: helper: fix flaky capture command
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

capture of progress output would get polling
results. This will break in the example below
where polling output would override the tcl
return value.

capture {sleep 10000; set abc def}

Signed-off-by: Øyvind Harboe <oyvind.harboe@zylin.com>
---
 src/helper/command.c | 16 ++++++++++++++++
 1 file changed, 16 insertions(+)

diff --git a/src/helper/command.c b/src/helper/command.c
index 086b03d3..1bd8c429 100644
--- a/src/helper/command.c
+++ b/src/helper/command.c
@@ -36,6 +36,7 @@
 #endif
 
 // @todo the inclusion of target.h here is a layering violation
+#include <jtag/jtag.h>
 #include <target/target.h>
 #include "command.h"
 #include "configuration.h"
@@ -867,6 +868,9 @@ static char* openocd_jim_fgets(char *s, int size, void *cookie)
 	return NULL;
 }
 
+/* Capture progress output and return as tcl return value. If the
+ * progress output was empty, return tcl return value.
+ */
 static int jim_capture(Jim_Interp *interp, int argc, Jim_Obj *const *argv)
 {
 	if (argc != 2)
@@ -874,9 +878,21 @@ static int jim_capture(Jim_Interp *interp, int argc, Jim_Obj *const *argv)
 
 	struct log_capture_state *state = command_log_capture_start(interp);
 
+	/* disable polling during capture. This avoids capturing output
+	 * from polling.
+	 *
+	 * This is necessary in order to avoid accidentially getting a non-empty
+	 * string for tcl fn's.
+	 */
+	bool save_poll = jtag_poll_get_enabled();
+
+	jtag_poll_set_enabled(false);
+
 	const char *str = Jim_GetString(argv[1], NULL);
 	int retcode = Jim_Eval_Named(interp, str, __THIS__FILE__, __LINE__);
 
+	jtag_poll_set_enabled(save_poll);
+
 	command_log_capture_finish(state);
 
 	return retcode;
-- 
cgit v1.2.3