* 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.
This commit is contained in:
Pedro Alves 2010-08-20 18:52:11 +00:00
parent 58f07bae95
commit 4a5321319d
2 changed files with 24 additions and 9 deletions

View file

@ -1,3 +1,14 @@
2010-08-20 Pedro Alves <pedro@codesourcery.com>
* 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 <pedro@codesourcery.com> 2010-08-20 Pedro Alves <pedro@codesourcery.com>
* serial.h (gdb_pipe, serial_pipe): Declare. * serial.h (gdb_pipe, serial_pipe): Declare.

View file

@ -29,6 +29,7 @@
#include "language.h" #include "language.h"
#include "exceptions.h" #include "exceptions.h"
#include "event-loop.h" #include "event-loop.h"
#include "serial.h"
#include <ctype.h> #include <ctype.h>
@ -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 /* 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(). */ 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 /* The file handler callback. This reads from the internal pipe, and
then processes the Python event queue. This will always be run in then processes the Python event queue. This will always be run in
the main gdb thread. */ the main gdb thread. */
static void static void
gdbpy_run_events (int err, gdb_client_data ignore) gdbpy_run_events (struct serial *scb, void *context)
{ {
struct cleanup *cleanup; struct cleanup *cleanup;
char buffer[100];
int r; int r;
cleanup = ensure_python_env (get_current_arch (), current_language); cleanup = ensure_python_env (get_current_arch (), current_language);
/* Just read whatever is available on the fd. It is relatively /* Flush the fd. Do this before flushing the events list, so that
harmless if there are any bytes left over. */ any new event post afterwards is sure to re-awake the event
r = read (gdbpy_event_fds[0], buffer, sizeof (buffer)); loop. */
while (serial_readchar (gdbpy_event_fds[0], 0) >= 0)
;
while (gdbpy_event_list) while (gdbpy_event_list)
{ {
@ -640,7 +643,8 @@ gdbpy_post_event (PyObject *self, PyObject *args)
if (wakeup) if (wakeup)
{ {
char c = 'q'; /* Anything. */ 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); return PyErr_SetFromErrno (PyExc_IOError);
} }
@ -651,10 +655,10 @@ gdbpy_post_event (PyObject *self, PyObject *args)
static void static void
gdbpy_initialize_events (void) gdbpy_initialize_events (void)
{ {
if (!pipe (gdbpy_event_fds)) if (serial_pipe (gdbpy_event_fds) == 0)
{ {
gdbpy_event_list_end = &gdbpy_event_list; 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);
} }
} }