Make Python use a struct serial event

Now that we have an abstract for wakeable events, use it instead of a
(heavier) serial pipe.

gdb/ChangeLog:
2016-04-12  Pedro Alves  <palves@redhat.com>

	* python/python.c: Include "ser-event.h".
	(gdbpy_event_fds): Delete.
	(gdbpy_serial_event): New.
	(gdbpy_run_events): Change prototype.  Use serial_event_clear
	instead of serial_readchar.
	(gdbpy_post_event): Use serial_event_set instead of serial_write.
	(gdbpy_initialize_events): Use make_serial_event instead of
	serial_pipe.
This commit is contained in:
Pedro Alves 2016-04-12 16:49:30 +01:00
parent f0881b37b6
commit 6eddd09a12
2 changed files with 25 additions and 19 deletions

View File

@ -1,3 +1,14 @@
2016-04-12 Pedro Alves <palves@redhat.com>
* python/python.c: Include "ser-event.h".
(gdbpy_event_fds): Delete.
(gdbpy_serial_event): New.
(gdbpy_run_events): Change prototype. Use serial_event_clear
instead of serial_readchar.
(gdbpy_post_event): Use serial_event_set instead of serial_write.
(gdbpy_initialize_events): Use make_serial_event instead of
serial_pipe.
2016-04-12 Pedro Alves <palves@redhat.com> 2016-04-12 Pedro Alves <palves@redhat.com>
* defs.h: Extend QUIT-related comments to mention * defs.h: Extend QUIT-related comments to mention

View File

@ -35,6 +35,7 @@
#include "cli/cli-utils.h" #include "cli/cli-utils.h"
#include <ctype.h> #include <ctype.h>
#include "location.h" #include "location.h"
#include "ser-event.h"
/* Declared constants and enum for python stack printing. */ /* Declared constants and enum for python stack printing. */
static const char python_excp_none[] = "none"; static const char python_excp_none[] = "none";
@ -929,26 +930,25 @@ static struct gdbpy_event *gdbpy_event_list;
/* The final link of the event list. */ /* The final link of the event list. */
static struct gdbpy_event **gdbpy_event_list_end; static struct gdbpy_event **gdbpy_event_list_end;
/* We use a file handler, and not an async handler, so that we can /* So that we can wake up the main thread even when it is blocked in
wake up the main thread even when it is blocked in poll(). */ poll(). */
static struct serial *gdbpy_event_fds[2]; static struct serial_event *gdbpy_serial_event;
/* 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 (struct serial *scb, void *context) gdbpy_run_events (int error, gdb_client_data client_data)
{ {
struct cleanup *cleanup; struct cleanup *cleanup;
cleanup = ensure_python_env (get_current_arch (), current_language); cleanup = ensure_python_env (get_current_arch (), current_language);
/* Flush the fd. Do this before flushing the events list, so that /* Clear the event fd. Do this before flushing the events list, so
any new event post afterwards is sure to re-awake the event that any new event post afterwards is sure to re-awake the event
loop. */ loop. */
while (serial_readchar (gdbpy_event_fds[0], 0) >= 0) serial_event_clear (gdbpy_serial_event);
;
while (gdbpy_event_list) while (gdbpy_event_list)
{ {
@ -1006,12 +1006,7 @@ gdbpy_post_event (PyObject *self, PyObject *args)
/* Wake up gdb when needed. */ /* Wake up gdb when needed. */
if (wakeup) if (wakeup)
{ serial_event_set (gdbpy_serial_event);
char c = 'q'; /* Anything. */
if (serial_write (gdbpy_event_fds[1], &c, 1))
return PyErr_SetFromErrno (PyExc_IOError);
}
Py_RETURN_NONE; Py_RETURN_NONE;
} }
@ -1020,11 +1015,11 @@ gdbpy_post_event (PyObject *self, PyObject *args)
static int static int
gdbpy_initialize_events (void) gdbpy_initialize_events (void)
{ {
if (serial_pipe (gdbpy_event_fds) == 0) gdbpy_event_list_end = &gdbpy_event_list;
{
gdbpy_event_list_end = &gdbpy_event_list; gdbpy_serial_event = make_serial_event ();
serial_async (gdbpy_event_fds[0], gdbpy_run_events, NULL); add_file_handler (serial_event_fd (gdbpy_serial_event),
} gdbpy_run_events, NULL);
return 0; return 0;
} }