+2004-08-18 Wim Taymans <wim@fluendo.com>
+
+ * gst/tcp/gstfdset.c: (gst_fdset_add_fd), (gst_fdset_remove_fd),
+ (gst_fdset_fd_ctl_write), (gst_fdset_fd_ctl_read),
+ (gst_fdset_fd_has_closed), (gst_fdset_fd_has_error),
+ (gst_fdset_fd_can_read), (gst_fdset_fd_can_write),
+ (gst_fdset_wait):
+ Add more locking and bounds checking.
+
+2004-08-18 Wim Taymans <wim@fluendo.com>
+
+ * gst/tcp/gstfdset.c: (ensure_size), (gst_fdset_wait):
+ Realloc test fdset in the lock and right before starting
+ the poll call. Bump the limit to 4096.
+
2004-08-17 David Schleef <ds@schleef.org>
* sys/sunaudio/Makefile.am:
/* for poll */
struct pollfd *testpollfds;
+ gint last_testpollfds;
gint testsize;
struct pollfd *pollfds;
nfd = &set->pollfds[idx];
nfd->fd = fd->fd;
- nfd->events = 0;
+ nfd->events = POLLERR | POLLNVAL | POLLHUP;
nfd->revents = 0;
/* see if we have one fd more */
case GST_FDSET_MODE_POLL:
{
g_mutex_lock (set->poll_lock);
+
set->pollfds[fd->idx].fd = -1;
set->pollfds[fd->idx].events = 0;
set->pollfds[fd->idx].revents = 0;
break;
case GST_FDSET_MODE_POLL:
{
- set->pollfds[fd->idx].events = (active ? POLLOUT : 0);
+ gint events = set->pollfds[fd->idx].events;
+
+ if (active)
+ events |= POLLOUT;
+ else
+ events &= ~POLLOUT;
+
+ set->pollfds[fd->idx].events = events;
break;
}
case GST_FDSET_MODE_EPOLL:
break;
case GST_FDSET_MODE_POLL:
{
- set->pollfds[fd->idx].events = (active ? (POLLIN | POLLPRI) : 0);
+ gint events = set->pollfds[fd->idx].events;
+
+ if (active)
+ events |= (POLLIN | POLLPRI);
+ else
+ events &= ~(POLLIN | POLLPRI);
+
+ set->pollfds[fd->idx].events = events;
break;
}
case GST_FDSET_MODE_EPOLL:
{
gint idx = fd->idx;
- if (idx >= 0)
+ g_mutex_lock (set->poll_lock);
+ if (idx >= 0 && idx < set->last_testpollfds)
res = (set->testpollfds[idx].revents & POLLHUP) != 0;
+ g_mutex_unlock (set->poll_lock);
break;
}
case GST_FDSET_MODE_EPOLL:
{
gint idx = fd->idx;
- if (idx >= 0)
+ g_mutex_lock (set->poll_lock);
+ if (idx >= 0 && idx < set->last_testpollfds)
res = (set->testpollfds[idx].revents & (POLLERR | POLLNVAL)) != 0;
+ g_mutex_unlock (set->poll_lock);
break;
}
case GST_FDSET_MODE_EPOLL:
{
gint idx = fd->idx;
- if (idx >= 0)
+ g_mutex_lock (set->poll_lock);
+ if (idx >= 0 && idx < set->last_testpollfds)
res = (set->testpollfds[idx].revents & (POLLIN | POLLPRI)) != 0;
+ g_mutex_unlock (set->poll_lock);
break;
}
case GST_FDSET_MODE_EPOLL:
{
gint idx = fd->idx;
- if (idx >= 0)
+ g_mutex_lock (set->poll_lock);
+ if (idx >= 0 && idx < set->last_testpollfds)
res = (set->testpollfds[idx].revents & POLLOUT) != 0;
+ g_mutex_unlock (set->poll_lock);
break;
}
case GST_FDSET_MODE_EPOLL:
}
case GST_FDSET_MODE_POLL:
{
- gint last_pollfds;
-
g_mutex_lock (set->poll_lock);
if (set->testsize != set->size) {
set->testpollfds = g_realloc (set->testpollfds, set->size);
set->testsize = set->size;
}
- last_pollfds = set->last_pollfds;
+ set->last_testpollfds = set->last_pollfds;
memcpy (set->testpollfds, set->pollfds,
- sizeof (struct pollfd) * last_pollfds);
+ sizeof (struct pollfd) * set->last_testpollfds);
g_mutex_unlock (set->poll_lock);
- res = poll (set->testpollfds, last_pollfds, timeout);
+ res = poll (set->testpollfds, set->last_testpollfds, timeout);
+
break;
}
case GST_FDSET_MODE_EPOLL: