mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-12-25 17:50:36 +00:00
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:
parent
1e321eb51f
commit
b2593133b5
2 changed files with 102 additions and 1 deletions
|
@ -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.
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
Loading…
Reference in a new issue