[farsight2/master] Thread protect pollfds

Olivier Crête olivier.crete at collabora.co.uk
Tue Jul 14 09:50:44 PDT 2009


---
 gst/fsmsnconference/fs-msn-connection.c |   33 ++++++++++++++++++++++++------
 gst/fsmsnconference/fs-msn-connection.h |    2 +-
 2 files changed, 27 insertions(+), 8 deletions(-)

diff --git a/gst/fsmsnconference/fs-msn-connection.c b/gst/fsmsnconference/fs-msn-connection.c
index 613b6cd..55ad0c1 100644
--- a/gst/fsmsnconference/fs-msn-connection.c
+++ b/gst/fsmsnconference/fs-msn-connection.c
@@ -110,7 +110,9 @@ static void connection_cb (FsMsnConnection *self, FsMsnPollFD *fd);
 static gpointer connection_polling_thread (gpointer data);
 static void shutdown_fd (FsMsnConnection *self, FsMsnPollFD *pollfd,
     gboolean equal);
-static FsMsnPollFD * add_pollfd (FsMsnConnection *self, int fd,
+static void shutdown_fd_locked (FsMsnConnection *self, FsMsnPollFD *pollfd,
+    gboolean equal);
+static FsMsnPollFD * add_pollfd_locked (FsMsnConnection *self, int fd,
     PollFdCallback callback, gboolean read, gboolean write, gboolean server);
 
 static void
@@ -420,7 +422,7 @@ fs_msn_open_listening_port_unlock (FsMsnConnection *self, guint16 port,
     goto error;
   }
   port = ntohs (myaddr.sin_port);
-  add_pollfd (self, fd, accept_connection_cb, TRUE, TRUE, FALSE);
+  add_pollfd_locked (self, fd, accept_connection_cb, TRUE, TRUE, FALSE);
 
   GST_DEBUG ("Listening on port %d", port);
 
@@ -498,7 +500,10 @@ fs_msn_connection_attempt_connection_locked (FsMsnConnection *connection,
     return FALSE;
   }
 
-  pollfd = add_pollfd (self, fd, successful_connection_cb, TRUE, TRUE, FALSE);
+  FS_MSN_CONNECTION_LOCK (self);
+  pollfd = add_pollfd_locked (self, fd, successful_connection_cb, TRUE, TRUE,
+      FALSE);
+  FS_MSN_CONNECTION_UNLOCK (self);
 
   return TRUE;
 }
@@ -525,7 +530,9 @@ accept_connection_cb (FsMsnConnection *self, FsMsnPollFD *pollfd)
     return;
   }
 
-  newpollfd = add_pollfd (self, fd, connection_cb, TRUE, FALSE, TRUE);
+  FS_MSN_CONNECTION_LOCK (self);
+  newpollfd = add_pollfd_locked (self, fd, connection_cb, TRUE, FALSE, TRUE);
+  FS_MSN_CONNECTION_UNLOCK (self);
 
   return;
 
@@ -813,7 +820,11 @@ connection_cb (FsMsnConnection *self, FsMsnPollFD *pollfd)
   GST_ERROR ("Got error from fd %d, closing", pollfd->pollfd.fd);
   shutdown_fd (self, pollfd, TRUE);
 
-  if (self->pollfds->len <= 1)
+  FS_MSN_CONNECTION_LOCK (self);
+  success = (self->pollfds->len > 1);
+  FS_MSN_CONNECTION_LOCK (self);
+
+  if (!success)
     g_signal_emit (self, signals[SIGNAL_CONNECTION_FAILED], 0);
 
   return;
@@ -862,7 +873,7 @@ connection_polling_thread (gpointer data)
             gst_poll_fd_has_closed (poll, &pollfd->pollfd))
         {
           pollfd->callback (self, pollfd);
-          shutdown_fd (self, pollfd, TRUE);
+          shutdown_fd_locked (self, pollfd, TRUE);
           i--;
           continue;
         }
@@ -887,6 +898,14 @@ connection_polling_thread (gpointer data)
 static void
 shutdown_fd (FsMsnConnection *self, FsMsnPollFD *pollfd, gboolean equal)
 {
+  FS_MSN_CONNECTION_LOCK (self);
+  shutdown_fd_locked (self, pollfd, equal);
+  FS_MSN_CONNECTION_UNLOCK (self);
+}
+
+static void
+shutdown_fd_locked (FsMsnConnection *self, FsMsnPollFD *pollfd, gboolean equal)
+{
   gint i;
   guint closed = 0;
 
@@ -914,7 +933,7 @@ shutdown_fd (FsMsnConnection *self, FsMsnPollFD *pollfd, gboolean equal)
 }
 
 static FsMsnPollFD *
-add_pollfd (FsMsnConnection *self, int fd, PollFdCallback callback,
+add_pollfd_locked (FsMsnConnection *self, int fd, PollFdCallback callback,
     gboolean read, gboolean write, gboolean server)
 {
   FsMsnPollFD *pollfd = g_slice_new0 (FsMsnPollFD);
diff --git a/gst/fsmsnconference/fs-msn-connection.h b/gst/fsmsnconference/fs-msn-connection.h
index 29c8170..08d9a71 100644
--- a/gst/fsmsnconference/fs-msn-connection.h
+++ b/gst/fsmsnconference/fs-msn-connection.h
@@ -75,7 +75,7 @@ struct _FsMsnConnection
   GThread *polling_thread; /* protected by lock */
   GstClockTime poll_timeout; /* protected by lock */
   GstPoll *poll;
-  GArray *pollfds;
+  GArray *pollfds; /* protected by lock */
   GStaticRecMutex mutex;
 };
 
-- 
1.5.6.5




More information about the farsight-commits mailing list