From 4a5321319dde40c2a597563b3ef2e75e40cb1717 Mon Sep 17 00:00:00 2001 From: Pedro Alves Date: Fri, 20 Aug 2010 18:52:11 +0000 Subject: [PATCH] * python/python.c: Include "serial.h". (gdbpy_event_fds): Change type to `struct serial *' a array from int array. (gdbpy_run_events): Change parameters. Use serial_readchar in place of read. (gdbpy_post_event): Use serial_write in place of write. (gdbpy_initialize_events): Use serial_pipe instead of pipe, and serial_async in place of add_file_handler. --- gdb/ChangeLog | 11 +++++++++++ gdb/python/python.c | 22 +++++++++++++--------- 2 files changed, 24 insertions(+), 9 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index c999f446139..e74be9726b7 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,14 @@ +2010-08-20 Pedro Alves + + * python/python.c: Include "serial.h". + (gdbpy_event_fds): Change type to `struct serial *' a array from + int array. + (gdbpy_run_events): Change parameters. Use serial_readchar in + place of read. + (gdbpy_post_event): Use serial_write in place of write. + (gdbpy_initialize_events): Use serial_pipe instead of pipe, and + serial_async in place of add_file_handler. + 2010-08-20 Pedro Alves * serial.h (gdb_pipe, serial_pipe): Declare. diff --git a/gdb/python/python.c b/gdb/python/python.c index 0f39120b18b..1cd1503fe25 100644 --- a/gdb/python/python.c +++ b/gdb/python/python.c @@ -29,6 +29,7 @@ #include "language.h" #include "exceptions.h" #include "event-loop.h" +#include "serial.h" #include @@ -568,23 +569,25 @@ static struct gdbpy_event **gdbpy_event_list_end; /* We use a file handler, and not an async handler, so that we can wake up the main thread even when it is blocked in poll(). */ -static int gdbpy_event_fds[2]; +static struct serial *gdbpy_event_fds[2]; /* The file handler callback. This reads from the internal pipe, and then processes the Python event queue. This will always be run in the main gdb thread. */ + static void -gdbpy_run_events (int err, gdb_client_data ignore) +gdbpy_run_events (struct serial *scb, void *context) { struct cleanup *cleanup; - char buffer[100]; int r; cleanup = ensure_python_env (get_current_arch (), current_language); - /* Just read whatever is available on the fd. It is relatively - harmless if there are any bytes left over. */ - r = read (gdbpy_event_fds[0], buffer, sizeof (buffer)); + /* Flush the fd. Do this before flushing the events list, so that + any new event post afterwards is sure to re-awake the event + loop. */ + while (serial_readchar (gdbpy_event_fds[0], 0) >= 0) + ; while (gdbpy_event_list) { @@ -640,7 +643,8 @@ gdbpy_post_event (PyObject *self, PyObject *args) if (wakeup) { char c = 'q'; /* Anything. */ - if (write (gdbpy_event_fds[1], &c, 1) != 1) + + if (serial_write (gdbpy_event_fds[1], &c, 1)) return PyErr_SetFromErrno (PyExc_IOError); } @@ -651,10 +655,10 @@ gdbpy_post_event (PyObject *self, PyObject *args) static void gdbpy_initialize_events (void) { - if (!pipe (gdbpy_event_fds)) + if (serial_pipe (gdbpy_event_fds) == 0) { gdbpy_event_list_end = &gdbpy_event_list; - add_file_handler (gdbpy_event_fds[0], gdbpy_run_events, NULL); + serial_async (gdbpy_event_fds[0], gdbpy_run_events, NULL); } } -- 2.30.2