[farsight2/master] Use shutdown_fd to close other fds too
Olivier Crête
olivier.crete at collabora.co.uk
Tue Jul 14 09:50:42 PDT 2009
---
gst/fsmsnconference/fs-msn-connection.c | 50 +++++++++++++------------------
1 files changed, 21 insertions(+), 29 deletions(-)
diff --git a/gst/fsmsnconference/fs-msn-connection.c b/gst/fsmsnconference/fs-msn-connection.c
index 08cd50a..613b6cd 100644
--- a/gst/fsmsnconference/fs-msn-connection.c
+++ b/gst/fsmsnconference/fs-msn-connection.c
@@ -108,7 +108,8 @@ static void accept_connection_cb (FsMsnConnection *self, FsMsnPollFD *fd);
static void connection_cb (FsMsnConnection *self, FsMsnPollFD *fd);
static gpointer connection_polling_thread (gpointer data);
-static void shutdown_fd (FsMsnConnection *self, FsMsnPollFD *pollfd);
+static void shutdown_fd (FsMsnConnection *self, FsMsnPollFD *pollfd,
+ gboolean equal);
static FsMsnPollFD * add_pollfd (FsMsnConnection *self, int fd,
PollFdCallback callback, gboolean read, gboolean write, gboolean server);
@@ -509,7 +510,6 @@ accept_connection_cb (FsMsnConnection *self, FsMsnPollFD *pollfd)
int fd = -1;
socklen_t n = sizeof (in);
FsMsnPollFD *newpollfd = NULL;
- gint i;
if (gst_poll_fd_has_error (self->poll, &pollfd->pollfd) ||
gst_poll_fd_has_closed (self->poll, &pollfd->pollfd))
@@ -533,7 +533,7 @@ accept_connection_cb (FsMsnConnection *self, FsMsnPollFD *pollfd)
error:
GST_ERROR ("Got error from fd %d, closing", fd);
// find, shutdown and remove channel from fdlist
- shutdown_fd (self, pollfd);
+ shutdown_fd (self, pollfd, TRUE);
return;
}
@@ -544,7 +544,6 @@ successful_connection_cb (FsMsnConnection *self, FsMsnPollFD *pollfd)
{
gint error;
socklen_t option_len;
- gint i;
GST_DEBUG ("handler called on fd %d", pollfd->pollfd.fd);
@@ -581,7 +580,7 @@ successful_connection_cb (FsMsnConnection *self, FsMsnPollFD *pollfd)
error:
GST_ERROR ("Got error from fd %d, closing", pollfd->pollfd.fd);
// find, shutdown and remove channel from fdlist
- shutdown_fd (self, pollfd);
+ shutdown_fd (self, pollfd, TRUE);
return;
}
@@ -591,7 +590,6 @@ static void
connection_cb (FsMsnConnection *self, FsMsnPollFD *pollfd)
{
gboolean success = FALSE;
- gint i;
GST_DEBUG ("handler called on fd %d. %d %d %d %d", pollfd->pollfd.fd,
pollfd->server, pollfd->status,
@@ -799,17 +797,7 @@ connection_cb (FsMsnConnection *self, FsMsnPollFD *pollfd)
if (success) {
// success! we need to shutdown/close all other channels
- gint i;
- for (i = 0; i < self->pollfds->len; i++)
- {
- FsMsnPollFD *pollfd2 = g_array_index(self->pollfds, FsMsnPollFD *, i);
- if (pollfd != pollfd2)
- {
- GST_DEBUG ("closing fd %d", pollfd2->pollfd.fd);
- shutdown_fd (self, pollfd2);
- i--;
- }
- }
+ shutdown_fd (self, pollfd, FALSE);
g_signal_emit (self, signals[SIGNAL_CONNECTED], 0, pollfd->pollfd.fd);
@@ -823,7 +811,7 @@ connection_cb (FsMsnConnection *self, FsMsnPollFD *pollfd)
error:
/* Error */
GST_ERROR ("Got error from fd %d, closing", pollfd->pollfd.fd);
- shutdown_fd (self, pollfd);
+ shutdown_fd (self, pollfd, TRUE);
if (self->pollfds->len <= 1)
g_signal_emit (self, signals[SIGNAL_CONNECTION_FAILED], 0);
@@ -874,7 +862,7 @@ connection_polling_thread (gpointer data)
gst_poll_fd_has_closed (poll, &pollfd->pollfd))
{
pollfd->callback (self, pollfd);
- shutdown_fd (self, pollfd);
+ shutdown_fd (self, pollfd, TRUE);
i--;
continue;
}
@@ -897,28 +885,32 @@ connection_polling_thread (gpointer data)
static void
-shutdown_fd (FsMsnConnection *self, FsMsnPollFD *pollfd)
+shutdown_fd (FsMsnConnection *self, FsMsnPollFD *pollfd, gboolean equal)
{
gint i;
+ guint closed = 0;
for (i = 0; i < self->pollfds->len; i++)
{
FsMsnPollFD *p = g_array_index(self->pollfds, FsMsnPollFD *, i);
- if (p == pollfd)
+ if ((equal && p == pollfd) || (!equal && p != pollfd))
{
- GST_DEBUG ("Shutting down pollfd %p", pollfd);
+ GST_DEBUG ("Shutting down p %p (fd %d)", p, p->pollfd.fd);
- if (!gst_poll_fd_has_closed (self->poll, &pollfd->pollfd))
- close (pollfd->pollfd.fd);
- GST_DEBUG ("gst poll remove : %d",
- gst_poll_remove_fd (self->poll, &pollfd->pollfd));
+ if (!gst_poll_fd_has_closed (self->poll, &p->pollfd))
+ close (p->pollfd.fd);
+ if (gst_poll_remove_fd (self->poll, &p->pollfd))
+ GST_WARNING ("Could not remove pollfd %p", p);
g_array_remove_index_fast (self->pollfds, i);
- gst_poll_restart (self->poll);
- return;
+ closed++;
+ i--;
}
}
- GST_WARNING ("Could find pollfd to remove");
+ if (closed)
+ gst_poll_restart (self->poll);
+ else
+ GST_WARNING ("Could find pollfd to remove");
}
static FsMsnPollFD *
--
1.5.6.5
More information about the farsight-commits
mailing list