Close the socket event in finalizer instead of in close method
authorThomas Kristensen <thomas.k.kristensen@tandberg.com>
Sun, 14 Mar 2010 09:47:17 +0000 (11:47 +0200)
committerTor Lillqvist <tml@iki.fi>
Sun, 14 Mar 2010 09:51:24 +0000 (11:51 +0200)
There might be a GSource attached to a GMainContext, about to be removed by a
pending cancellation. Deleting the handle too early will trigger a g_warning in
the "select()" call in GMainContext. Attached patch fixes this by deferring
destruction of WSAEVENT object until GSocket's finalize().

Patch from bug #612702.

Signed-off-by: Tor Lillqvist <tml@iki.fi>
gio/gsocket.c

index 398c4d5..91983e4 100644 (file)
@@ -614,6 +614,12 @@ g_socket_finalize (GObject *object)
     g_socket_close (socket, NULL);
 
 #ifdef G_OS_WIN32
+  if (socket->priv->event != WSA_INVALID_EVENT)
+    {
+      WSACloseEvent (socket->priv->event);
+      socket->priv->event = WSA_INVALID_EVENT;
+    }
+
   g_assert (socket->priv->requested_conditions == NULL);
 #endif
 
@@ -2002,14 +2008,6 @@ g_socket_close (GSocket  *socket,
       break;
     }
 
-#ifdef G_OS_WIN32
-  if (socket->priv->event != WSA_INVALID_EVENT)
-    {
-      WSACloseEvent (socket->priv->event);
-      socket->priv->event = WSA_INVALID_EVENT;
-    }
-#endif
-
   socket->priv->connected = FALSE;
   socket->priv->closed = TRUE;