Commit d6eff3c3 authored by Keith Packard's avatar Keith Packard Committed by Adam Jackson

os: Add ospoll interface [v2]

This provides a wrapper around poll or epoll providing a
callback-based interface for monitoring activity on a large set of
file descriptors.

v2: use xserver_poll API instead of poll. Don't use WSAPoll as
    that is broken.
Signed-off-by: Keith Packard's avatarKeith Packard <keithp@keithp.com>
Reviewed-by: Adam Jackson's avatarAdam Jackson <ajax@redhat.com>
parent d403aca7
......@@ -219,7 +219,7 @@ dnl Checks for library functions.
AC_CHECK_FUNCS([backtrace ffs geteuid getuid issetugid getresuid \
getdtablesize getifaddrs getpeereid getpeerucred getprogname getzoneid \
mmap posix_fallocate seteuid shmctl64 strncasecmp vasprintf vsnprintf \
walkcontext setitimer poll])
walkcontext setitimer poll epoll_create1])
AC_CONFIG_LIBOBJ_DIR([os])
AC_REPLACE_FUNCS([reallocarray strcasecmp strcasestr strlcat strlcpy strndup])
AM_CONDITIONAL(POLL, [test "x$ac_cv_func_poll" = "xyes"])
......
......@@ -530,4 +530,7 @@
/* Have poll() */
#undef HAVE_POLL
/* Have epoll_create1() */
#undef HAVE_EPOLL_CREATE1
#endif /* _DIX_CONFIG_H_ */
......@@ -22,6 +22,7 @@ libos_la_SOURCES = \
oscolor.c \
osdep.h \
osinit.c \
ospoll.c \
utils.c \
xdmauth.c \
xsha1.c \
......
This diff is collapsed.
/*
* 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_ */
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment