Close the socket event in finalizer instead of in close method

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>
This commit is contained in:
Thomas Kristensen 2010-03-14 11:47:17 +02:00 committed by Tor Lillqvist
parent 6c5d2798f6
commit 1be8ad3514

View 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;