143 lines
4.1 KiB
C
143 lines
4.1 KiB
C
|
/*
|
||
|
* Copyright © 2016 Keith Packard
|
||
|
*
|
||
|
* Permission to use, copy, modify, distribute, and sell this software and its
|
||
|
* documentation for any purpose is hereby granted without fee, provided that
|
||
|
* the above copyright notice appear in all copies and that both that copyright
|
||
|
* notice and this permission notice appear in supporting documentation, and
|
||
|
* that the name of the copyright holders not be used in advertising or
|
||
|
* publicity pertaining to distribution of the software without specific,
|
||
|
* written prior permission. The copyright holders make no representations
|
||
|
* about the suitability of this software for any purpose. It is provided "as
|
||
|
* is" without express or implied warranty.
|
||
|
*
|
||
|
* THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
|
||
|
* INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
|
||
|
* EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY SPECIAL, INDIRECT OR
|
||
|
* CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
|
||
|
* DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
|
||
|
* TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
|
||
|
* OF THIS SOFTWARE.
|
||
|
*/
|
||
|
|
||
|
#ifndef _OSPOLL_H_
|
||
|
#define _OSPOLL_H_
|
||
|
|
||
|
/* Forward declaration */
|
||
|
struct ospoll;
|
||
|
|
||
|
/**
|
||
|
* ospoll_wait trigger mode
|
||
|
*
|
||
|
* @ospoll_trigger_edge
|
||
|
* Trigger only when going from no data available
|
||
|
* to data available.
|
||
|
*
|
||
|
* @ospoll_trigger_level
|
||
|
* Trigger whenever there is data available
|
||
|
*/
|
||
|
enum ospoll_trigger {
|
||
|
ospoll_trigger_edge,
|
||
|
ospoll_trigger_level
|
||
|
};
|
||
|
|
||
|
/**
|
||
|
* Create a new ospoll structure
|
||
|
*/
|
||
|
struct ospoll *
|
||
|
ospoll_create(void);
|
||
|
|
||
|
/**
|
||
|
* Destroy an ospoll structure
|
||
|
*
|
||
|
* @param ospoll ospoll to destroy
|
||
|
*/
|
||
|
void
|
||
|
ospoll_destroy(struct ospoll *ospoll);
|
||
|
|
||
|
/**
|
||
|
* Add a file descriptor to monitor
|
||
|
*
|
||
|
* @param ospoll ospoll to add to
|
||
|
* @param fd File descriptor to monitor
|
||
|
* @param trigger Trigger mode for ospoll_wait
|
||
|
* @param callback Function to call when triggered
|
||
|
* @param data Extra data to pass callback
|
||
|
*/
|
||
|
Bool
|
||
|
ospoll_add(struct ospoll *ospoll, int fd,
|
||
|
enum ospoll_trigger trigger,
|
||
|
void (*callback)(int fd, int xevents, void *data),
|
||
|
void *data);
|
||
|
|
||
|
/**
|
||
|
* Remove a monitored file descriptor
|
||
|
*
|
||
|
* @param ospoll ospoll to remove from
|
||
|
* @param fd File descriptor to stop monitoring
|
||
|
*/
|
||
|
void
|
||
|
ospoll_remove(struct ospoll *ospoll, int fd);
|
||
|
|
||
|
/**
|
||
|
* Listen on additional events
|
||
|
*
|
||
|
* @param ospoll ospoll monitoring fd
|
||
|
* @param fd File descriptor to change
|
||
|
* @param events Additional events to trigger on
|
||
|
*/
|
||
|
void
|
||
|
ospoll_listen(struct ospoll *ospoll, int fd, int xevents);
|
||
|
|
||
|
/**
|
||
|
* Stop listening on events
|
||
|
*
|
||
|
* @param ospoll ospoll monitoring fd
|
||
|
* @param fd File descriptor to change
|
||
|
* @param events events to stop triggering on
|
||
|
*/
|
||
|
void
|
||
|
ospoll_mute(struct ospoll *ospoll, int fd, int xevents);
|
||
|
|
||
|
/**
|
||
|
* Wait for events
|
||
|
*
|
||
|
* @param ospoll ospoll to wait on
|
||
|
* @param timeout < 0 wait forever
|
||
|
* = 0 check and return
|
||
|
* > 0 timeout in milliseconds
|
||
|
* @return < 0 error
|
||
|
* = 0 timeout
|
||
|
* > 0 number of events delivered
|
||
|
*/
|
||
|
int
|
||
|
ospoll_wait(struct ospoll *ospoll, int timeout);
|
||
|
|
||
|
/**
|
||
|
* Reset edge trigger status
|
||
|
*
|
||
|
* @param ospoll ospoll monitoring fd
|
||
|
* @param fd file descriptor
|
||
|
*
|
||
|
* ospoll_reset_events resets the state of an edge-triggered
|
||
|
* fd so that ospoll_wait calls will report events again.
|
||
|
*
|
||
|
* Call this after a read/recv operation reports no more data available.
|
||
|
*/
|
||
|
void
|
||
|
ospoll_reset_events(struct ospoll *ospoll, int fd);
|
||
|
|
||
|
/**
|
||
|
* Fetch the data associated with an fd
|
||
|
*
|
||
|
* @param ospoll ospoll monitoring fd
|
||
|
* @param fd file descriptor
|
||
|
*
|
||
|
* @return data parameter passed to ospoll_add call on
|
||
|
* this file descriptor
|
||
|
*/
|
||
|
void *
|
||
|
ospoll_data(struct ospoll *ospoll, int fd);
|
||
|
|
||
|
#endif /* _OSPOLL_H_ */
|