2012-06-11 Pedro Alves <palves@redhat.com>

* ser-base.c (run_async_handler_and_reschedule): New.
	(fd_event, push_event): Use it.
	* serial.c (serial_open, serial_fdopen_ops): Set the initial
	reference count to 1.
	(do_serial_close): Set the bufp field to NULL.  Use serial_unref
	instead of xfree.
	(serial_is_open, serial_ref, serial_unref): New.
	* serial.h (serial_open): Adjust comment.
	(serial_is_open): Declare.
	(serial_close): Adjust comment.
	(serial_ref, serial_unref) Declare.
	(struct serial): New field 'refcnt'.
This commit is contained in:
Pedro Alves 2012-06-11 20:36:53 +00:00
parent d5ad6aa5ce
commit ddefb60ff8
4 changed files with 88 additions and 11 deletions

View file

@ -37,13 +37,18 @@ typedef void *serial_ttystate;
struct serial;
/* Try to open NAME. Returns a new `struct serial *' on success, NULL
on failure. Note that some open calls can block and, if possible,
should be written to be non-blocking, with calls to ui_look_hook
so they can be cancelled. An async interface for open could be
added to GDB if necessary. */
on failure. The new serial object has a reference count of 1.
Note that some open calls can block and, if possible, should be
written to be non-blocking, with calls to ui_look_hook so they can
be cancelled. An async interface for open could be added to GDB if
necessary. */
extern struct serial *serial_open (const char *name);
/* Returns true if SCB is open. */
extern int serial_is_open (struct serial *scb);
/* Find an already opened serial stream using a file handle. */
extern struct serial *serial_for_fd (int fd);
@ -52,10 +57,18 @@ extern struct serial *serial_for_fd (int fd);
extern struct serial *serial_fdopen (const int fd);
/* Push out all buffers, close the device and destroy SCB. */
/* Push out all buffers, close the device and unref SCB. */
extern void serial_close (struct serial *scb);
/* Increment reference count of SCB. */
extern void serial_ref (struct serial *scb);
/* Decrement reference count of SCB. */
extern void serial_unref (struct serial *scb);
/* Create a pipe, and put the read end in files[0], and the write end
in filde[1]. Returns 0 for success, negative value for error (in
which case errno contains the error). */
@ -213,6 +226,10 @@ extern int serial_debug_p (struct serial *scb);
struct serial
{
/* serial objects are ref counted (but not the underlying
connection, just the object's lifetime in memory). */
int refcnt;
int fd; /* File descriptor */
/* File descriptor for a separate error stream that should be
immediately forwarded to gdb_stderr. This may be -1.