poll: add API to watch for POLLPRI

Windows doesn't seem to have an equivalent of POLLPRI so disabled those
functions on this platform.

This API can be used, for example, to wait for video4linux events which
are using POLLPRI.

https://bugzilla.gnome.org/show_bug.cgi?id=794977
This commit is contained in:
Guillaume Desmottes 2018-04-05 12:40:09 +02:00 committed by Nicolas Dufresne
parent 1e321eb51f
commit b2593133b5
2 changed files with 102 additions and 1 deletions

View file

@ -37,7 +37,7 @@
* New file descriptors are added to the set using gst_poll_add_fd(), and
* removed using gst_poll_remove_fd(). Controlling which file descriptors
* should be waited for to become readable and/or writable are done using
* gst_poll_fd_ctl_read() and gst_poll_fd_ctl_write().
* gst_poll_fd_ctl_read(), gst_poll_fd_ctl_write() and gst_poll_fd_ctl_pri().
*
* Use gst_poll_wait() to wait for the file descriptors to actually become
* readable and/or writable, or to timeout if no file descriptor is available
@ -1064,6 +1064,58 @@ gst_poll_fd_ctl_read (GstPoll * set, GstPollFD * fd, gboolean active)
return ret;
}
/**
* gst_poll_fd_ctl_pri:
* @set: a file descriptor set.
* @fd: a file descriptor.
* @active: a new status.
*
* Control whether the descriptor @fd in @set will be monitored for
* exceptional conditions (POLLPRI).
*
* Not available on Windows.
*
* Returns: %TRUE if the descriptor was successfully updated.
* Since: 1.16
*/
gboolean
gst_poll_fd_ctl_pri (GstPoll * set, GstPollFD * fd, gboolean active)
{
#ifdef G_OS_WIN32
return FALSE;
#else
gint idx;
g_return_val_if_fail (set != NULL, FALSE);
g_return_val_if_fail (fd != NULL, FALSE);
g_return_val_if_fail (fd->fd >= 0, FALSE);
GST_DEBUG ("%p: fd (fd:%d, idx:%d), active : %d", set,
fd->fd, fd->idx, active);
g_mutex_lock (&set->lock);
idx = find_index (set->fds, fd);
if (idx >= 0) {
struct pollfd *pfd = &g_array_index (set->fds, struct pollfd, idx);
if (active)
pfd->events |= POLLPRI;
else
pfd->events &= ~POLLPRI;
GST_LOG ("%p: pfd->events now %d (POLLPRI:%d)", set, pfd->events, POLLOUT);
MARK_REBUILD (set);
} else {
GST_WARNING ("%p: couldn't find fd !", set);
}
g_mutex_unlock (&set->lock);
return idx >= 0;
#endif
}
/**
* gst_poll_fd_ignored:
* @set: a file descriptor set.
@ -1284,6 +1336,49 @@ gst_poll_fd_can_write (const GstPoll * set, GstPollFD * fd)
return res;
}
/**
* gst_poll_fd_has_pri:
* @set: a file descriptor set.
* @fd: a file descriptor.
*
* Check if @fd in @set has an exceptional condition (POLLPRI).
*
* Not available on Windows.
*
* Returns: %TRUE if the descriptor has an exceptional condition.
* Since: 1.16
*/
gboolean
gst_poll_fd_has_pri (const GstPoll * set, GstPollFD * fd)
{
#ifdef G_OS_WIN32
return FALSE;
#else
gboolean res = FALSE;
gint idx;
g_return_val_if_fail (set != NULL, FALSE);
g_return_val_if_fail (fd != NULL, FALSE);
g_return_val_if_fail (fd->fd >= 0, FALSE);
g_mutex_lock (&((GstPoll *) set)->lock);
idx = find_index (set->active_fds, fd);
if (idx >= 0) {
struct pollfd *pfd = &g_array_index (set->active_fds, struct pollfd, idx);
res = (pfd->revents & POLLPRI) != 0;
} else {
GST_WARNING ("%p: couldn't find fd !", set);
}
g_mutex_unlock (&((GstPoll *) set)->lock);
GST_DEBUG ("%p: fd (fd:%d, idx:%d) %d", set, fd->fd, fd->idx, res);
return res;
#endif
}
/**
* gst_poll_wait:
* @set: a #GstPoll.

View file

@ -88,6 +88,9 @@ gboolean gst_poll_fd_ctl_write (GstPoll *set, GstPollFD *fd, gboolean
GST_API
gboolean gst_poll_fd_ctl_read (GstPoll *set, GstPollFD *fd, gboolean active);
GST_API
gboolean gst_poll_fd_ctl_pri (GstPoll *set, GstPollFD *fd, gboolean active);
GST_API
void gst_poll_fd_ignored (GstPoll *set, GstPollFD *fd);
@ -103,6 +106,9 @@ gboolean gst_poll_fd_can_read (const GstPoll *set, GstPollFD *fd);
GST_API
gboolean gst_poll_fd_can_write (const GstPoll *set, GstPollFD *fd);
GST_API
gboolean gst_poll_fd_has_pri (const GstPoll *set, GstPollFD *fd);
GST_API
gint gst_poll_wait (GstPoll *set, GstClockTime timeout);