aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gdb/ChangeLog7
-rw-r--r--gdb/disasm.c17
-rw-r--r--gdb/utils.c15
-rw-r--r--gdb/utils.h3
4 files changed, 26 insertions, 16 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index 8704fb0..e070b8c 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,3 +1,10 @@
+2017-01-26 Yao Qi <yao.qi@linaro.org>
+
+ * disasm.c (do_ui_file_delete): Delete.
+ (gdb_insn_length): Move code creating stream to ...
+ * utils.c (null_stream): ... here. New function.
+ * utils.h (null_stream): Declare.
+
2017-01-23 Simon Marchi <simon.marchi@polymtl.ca>
* python/py-inferior.c (find_thread_object): Return directly
diff --git a/gdb/disasm.c b/gdb/disasm.c
index f419501..ae3a2f1 100644
--- a/gdb/disasm.c
+++ b/gdb/disasm.c
@@ -838,28 +838,13 @@ gdb_print_insn (struct gdbarch *gdbarch, CORE_ADDR memaddr,
return length;
}
-static void
-do_ui_file_delete (void *arg)
-{
- ui_file_delete ((struct ui_file *) arg);
-}
-
/* Return the length in bytes of the instruction at address MEMADDR in
debugged memory. */
int
gdb_insn_length (struct gdbarch *gdbarch, CORE_ADDR addr)
{
- static struct ui_file *null_stream = NULL;
-
- /* Dummy file descriptor for the disassembler. */
- if (!null_stream)
- {
- null_stream = ui_file_new ();
- make_final_cleanup (do_ui_file_delete, null_stream);
- }
-
- return gdb_print_insn (gdbarch, addr, null_stream, NULL);
+ return gdb_print_insn (gdbarch, addr, null_stream (), NULL);
}
/* fprintf-function for gdb_buffered_insn_length. This function is a
diff --git a/gdb/utils.c b/gdb/utils.c
index f142ffe..ab87143 100644
--- a/gdb/utils.c
+++ b/gdb/utils.c
@@ -199,6 +199,21 @@ make_cleanup_ui_file_delete (struct ui_file *arg)
return make_cleanup (do_ui_file_delete, arg);
}
+struct ui_file *
+null_stream (void)
+{
+ /* A simple implementation of singleton pattern. */
+ static struct ui_file *stream = NULL;
+
+ if (stream == NULL)
+ {
+ stream = ui_file_new ();
+ /* Delete it on gdb exit. */
+ make_final_cleanup (do_ui_file_delete, stream);
+ }
+ return stream;
+}
+
/* Helper function for make_cleanup_ui_out_redirect_pop. */
static void
diff --git a/gdb/utils.h b/gdb/utils.h
index c548a50..9e71cc2 100644
--- a/gdb/utils.h
+++ b/gdb/utils.h
@@ -189,6 +189,9 @@ extern struct ui_file *gdb_stdtarg;
extern struct ui_file *gdb_stdtargerr;
extern struct ui_file *gdb_stdtargin;
+/* Return a null stream. */
+extern struct ui_file *null_stream (void);
+
/* Set the screen dimensions to WIDTH and HEIGHT. */
extern void set_screen_width_and_height (int width, int height);