/* Serial interface for a selectable event.
   Copyright (C) 2016-2021 Free Software Foundation, Inc.

   This file is part of GDB.

   This program is free software; you can redistribute it and/or modify
   it under the terms of the GNU General Public License as published by
   the Free Software Foundation; either version 3 of the License, or
   (at your option) any later version.

   This program is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   GNU General Public License for more details.

   You should have received a copy of the GNU General Public License
   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */

#ifndef SER_EVENT_H
#define SER_EVENT_H

/* This is used to be able to signal the event loop (or any other
   select/poll) of events, in a race-free manner.

   For example, a signal handler can defer non-async-signal-safe work
   to the event loop, by having the signal handler set a struct
   serial_event object, and having the event loop wait for that same
   object to the readable.  Once readable, the event loop breaks out
   of select/poll and calls a registered callback that does the
   deferred work.  */

struct serial_event;

/* Make a new serial_event object.  */
struct serial_event *make_serial_event (void);

/* Return the FD that can be used by select/poll to wait for the
   event.  The only valid operation on this object is to wait until it
   is readable.  */
extern int serial_event_fd (struct serial_event *event);

/* Set the event.  This signals the file descriptor returned by
   serial_event_fd as readable.  */
extern void serial_event_set (struct serial_event *event);

/* Clear the event.  The file descriptor returned by serial_event_fd
   is not longer readable after this, until a new serial_event_set
   call is made.  */
extern void serial_event_clear (struct serial_event *event);

#endif
