/* Serial interface for a selectable event.
   Copyright (C) 2016-2019 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

#include <functional>

/* 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);

/* Send a runnable to the main thread.  */

extern void run_on_main_thread (std::function<void ()> &&);

#endif
