#ifndef G_OS_WIN32
static gint
-pollfd_to_fd_set (GstPoll * set, fd_set * readfds, fd_set * writefds)
+pollfd_to_fd_set (GstPoll * set, fd_set * readfds, fd_set * writefds,
+ fd_set * errorfds)
{
gint max_fd = -1;
guint i;
FD_ZERO (readfds);
FD_ZERO (writefds);
+ FD_ZERO (errorfds);
g_mutex_lock (set->lock);
FD_SET (pfd->fd, readfds);
if (pfd->events & POLLOUT)
FD_SET (pfd->fd, writefds);
+ if (pfd->events)
+ FD_SET (pfd->fd, errorfds);
if (pfd->fd > max_fd)
max_fd = pfd->fd;
}
}
static void
-fd_set_to_pollfd (GstPoll * set, fd_set * readfds, fd_set * writefds)
+fd_set_to_pollfd (GstPoll * set, fd_set * readfds, fd_set * writefds,
+ fd_set * errorfds)
{
guint i;
pfd->revents |= POLLIN;
if (FD_ISSET (pfd->fd, writefds))
pfd->revents |= POLLOUT;
+ if (FD_ISSET (pfd->fd, errorfds))
+ pfd->revents |= POLLERR;
}
}
#ifndef G_OS_WIN32
fd_set readfds;
fd_set writefds;
+ fd_set errorfds;
gint max_fd;
- max_fd = pollfd_to_fd_set (set, &readfds, &writefds);
+ max_fd = pollfd_to_fd_set (set, &readfds, &writefds, &errorfds);
if (mode == GST_POLL_MODE_SELECT) {
struct timeval tv;
tvptr = NULL;
}
- res = select (max_fd + 1, &readfds, &writefds, NULL, tvptr);
+ res = select (max_fd + 1, &readfds, &writefds, &errorfds, tvptr);
} else {
#ifdef HAVE_PSELECT
struct timespec ts;
tsptr = NULL;
}
- res = pselect (max_fd + 1, &readfds, &writefds, NULL, tsptr, NULL);
+ res =
+ pselect (max_fd + 1, &readfds, &writefds, &errorfds, tsptr, NULL);
#endif
}
- if (res > 0) {
- fd_set_to_pollfd (set, &readfds, &writefds);
+ if (res >= 0) {
+ fd_set_to_pollfd (set, &readfds, &writefds, &errorfds);
}
#else /* G_OS_WIN32 */
g_assert_not_reached ();