From a7bd3d0d5e717f3ba1f66b6b4223069a649d5557 Mon Sep 17 00:00:00 2001 From: Andy Lanoix Date: Fri, 22 Jun 2001 15:44:44 +0000 Subject: [PATCH] *giowin32.c: Debug and partial rewrite of async socket code on windows, which fixes major MT issues. Some test code kindly provided by wroberts1@home.com. --- ChangeLog | 6 ++++++ ChangeLog.pre-2-0 | 6 ++++++ ChangeLog.pre-2-10 | 6 ++++++ ChangeLog.pre-2-12 | 6 ++++++ ChangeLog.pre-2-2 | 6 ++++++ ChangeLog.pre-2-4 | 6 ++++++ ChangeLog.pre-2-6 | 6 ++++++ ChangeLog.pre-2-8 | 6 ++++++ giowin32.c | 35 ++++++++++++++++++++++++++++++----- glib/giowin32.c | 35 ++++++++++++++++++++++++++++++----- 10 files changed, 108 insertions(+), 10 deletions(-) diff --git a/ChangeLog b/ChangeLog index ed2ae30..6e4c38d 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +2001-06-22 Andrew Lanoix + + *giowin32.c: Debug and partial rewrite of async socket code + on windows, which fixes major MT issues. Some test code kindly + provided by wroberts1@home.com. + Thu Jun 14 14:09:46 2001 Owen Taylor * gstrfuncs.c (g_strconcat): Fix a use of strcat that diff --git a/ChangeLog.pre-2-0 b/ChangeLog.pre-2-0 index ed2ae30..6e4c38d 100644 --- a/ChangeLog.pre-2-0 +++ b/ChangeLog.pre-2-0 @@ -1,3 +1,9 @@ +2001-06-22 Andrew Lanoix + + *giowin32.c: Debug and partial rewrite of async socket code + on windows, which fixes major MT issues. Some test code kindly + provided by wroberts1@home.com. + Thu Jun 14 14:09:46 2001 Owen Taylor * gstrfuncs.c (g_strconcat): Fix a use of strcat that diff --git a/ChangeLog.pre-2-10 b/ChangeLog.pre-2-10 index ed2ae30..6e4c38d 100644 --- a/ChangeLog.pre-2-10 +++ b/ChangeLog.pre-2-10 @@ -1,3 +1,9 @@ +2001-06-22 Andrew Lanoix + + *giowin32.c: Debug and partial rewrite of async socket code + on windows, which fixes major MT issues. Some test code kindly + provided by wroberts1@home.com. + Thu Jun 14 14:09:46 2001 Owen Taylor * gstrfuncs.c (g_strconcat): Fix a use of strcat that diff --git a/ChangeLog.pre-2-12 b/ChangeLog.pre-2-12 index ed2ae30..6e4c38d 100644 --- a/ChangeLog.pre-2-12 +++ b/ChangeLog.pre-2-12 @@ -1,3 +1,9 @@ +2001-06-22 Andrew Lanoix + + *giowin32.c: Debug and partial rewrite of async socket code + on windows, which fixes major MT issues. Some test code kindly + provided by wroberts1@home.com. + Thu Jun 14 14:09:46 2001 Owen Taylor * gstrfuncs.c (g_strconcat): Fix a use of strcat that diff --git a/ChangeLog.pre-2-2 b/ChangeLog.pre-2-2 index ed2ae30..6e4c38d 100644 --- a/ChangeLog.pre-2-2 +++ b/ChangeLog.pre-2-2 @@ -1,3 +1,9 @@ +2001-06-22 Andrew Lanoix + + *giowin32.c: Debug and partial rewrite of async socket code + on windows, which fixes major MT issues. Some test code kindly + provided by wroberts1@home.com. + Thu Jun 14 14:09:46 2001 Owen Taylor * gstrfuncs.c (g_strconcat): Fix a use of strcat that diff --git a/ChangeLog.pre-2-4 b/ChangeLog.pre-2-4 index ed2ae30..6e4c38d 100644 --- a/ChangeLog.pre-2-4 +++ b/ChangeLog.pre-2-4 @@ -1,3 +1,9 @@ +2001-06-22 Andrew Lanoix + + *giowin32.c: Debug and partial rewrite of async socket code + on windows, which fixes major MT issues. Some test code kindly + provided by wroberts1@home.com. + Thu Jun 14 14:09:46 2001 Owen Taylor * gstrfuncs.c (g_strconcat): Fix a use of strcat that diff --git a/ChangeLog.pre-2-6 b/ChangeLog.pre-2-6 index ed2ae30..6e4c38d 100644 --- a/ChangeLog.pre-2-6 +++ b/ChangeLog.pre-2-6 @@ -1,3 +1,9 @@ +2001-06-22 Andrew Lanoix + + *giowin32.c: Debug and partial rewrite of async socket code + on windows, which fixes major MT issues. Some test code kindly + provided by wroberts1@home.com. + Thu Jun 14 14:09:46 2001 Owen Taylor * gstrfuncs.c (g_strconcat): Fix a use of strcat that diff --git a/ChangeLog.pre-2-8 b/ChangeLog.pre-2-8 index ed2ae30..6e4c38d 100644 --- a/ChangeLog.pre-2-8 +++ b/ChangeLog.pre-2-8 @@ -1,3 +1,9 @@ +2001-06-22 Andrew Lanoix + + *giowin32.c: Debug and partial rewrite of async socket code + on windows, which fixes major MT issues. Some test code kindly + provided by wroberts1@home.com. + Thu Jun 14 14:09:46 2001 Owen Taylor * gstrfuncs.c (g_strconcat): Fix a use of strcat that diff --git a/giowin32.c b/giowin32.c index ae16dd3..30507fd 100644 --- a/giowin32.c +++ b/giowin32.c @@ -4,6 +4,7 @@ * giowin32.c: IO Channels for Win32. * Copyright 1998 Owen Taylor and Tor Lillqvist * Copyright 1999-2000 Tor Lillqvist and Craig Setera + * Copyright 2001 Andrew Lanoix * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -437,6 +438,14 @@ select_thread (void *parameter) ResetEvent (channel->data_avail_noticed_event); SetEvent (channel->data_avail_event); + LOCK (channel->mutex); + if (channel->needs_close) + { + UNLOCK (channel->mutex); + break; + } + UNLOCK (channel->mutex); + if (channel->debug) g_print ("select_thread %#x: waiting for data_avail_noticed\n", channel->thread_id); @@ -449,7 +458,7 @@ select_thread (void *parameter) channel->running = FALSE; LOCK (channel->mutex); - if (channel->needs_close) + if (channel->fd != -1) { if (channel->debug) g_print ("select_thread %#x: channel fd %d needs closing\n", @@ -576,6 +585,7 @@ g_io_win32_destroy (GSource *source) channel->watches = g_slist_remove (channel->watches, watch); + SetEvent (channel->data_avail_noticed_event); g_io_channel_unref (watch->channel); } @@ -971,12 +981,27 @@ g_io_win32_sock_close (GIOChannel *channel) { GIOWin32Channel *win32_channel = (GIOWin32Channel *)channel; - if (win32_channel->debug) - g_print ("thread %#x: closing socket %d\n", + LOCK(win32_channel->mutex); + if (win32_channel->running) + { + if (win32_channel->debug) + g_print ("thread %#x: running, marking for later close\n", + win32_channel->thread_id); + win32_channel->running = FALSE; + win32_channel->needs_close = TRUE; + SetEvent(win32_channel->data_avail_noticed_event); + } + if (win32_channel->fd != -1) + { + if (win32_channel->debug) + g_print ("thread %#x: closing socket %d\n", win32_channel->thread_id, win32_channel->fd); - closesocket (win32_channel->fd); - win32_channel->fd = -1; + + closesocket (win32_channel->fd); + win32_channel->fd = -1; + } + UNLOCK(win32_channel->mutex); } static GSource * diff --git a/glib/giowin32.c b/glib/giowin32.c index ae16dd3..30507fd 100644 --- a/glib/giowin32.c +++ b/glib/giowin32.c @@ -4,6 +4,7 @@ * giowin32.c: IO Channels for Win32. * Copyright 1998 Owen Taylor and Tor Lillqvist * Copyright 1999-2000 Tor Lillqvist and Craig Setera + * Copyright 2001 Andrew Lanoix * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -437,6 +438,14 @@ select_thread (void *parameter) ResetEvent (channel->data_avail_noticed_event); SetEvent (channel->data_avail_event); + LOCK (channel->mutex); + if (channel->needs_close) + { + UNLOCK (channel->mutex); + break; + } + UNLOCK (channel->mutex); + if (channel->debug) g_print ("select_thread %#x: waiting for data_avail_noticed\n", channel->thread_id); @@ -449,7 +458,7 @@ select_thread (void *parameter) channel->running = FALSE; LOCK (channel->mutex); - if (channel->needs_close) + if (channel->fd != -1) { if (channel->debug) g_print ("select_thread %#x: channel fd %d needs closing\n", @@ -576,6 +585,7 @@ g_io_win32_destroy (GSource *source) channel->watches = g_slist_remove (channel->watches, watch); + SetEvent (channel->data_avail_noticed_event); g_io_channel_unref (watch->channel); } @@ -971,12 +981,27 @@ g_io_win32_sock_close (GIOChannel *channel) { GIOWin32Channel *win32_channel = (GIOWin32Channel *)channel; - if (win32_channel->debug) - g_print ("thread %#x: closing socket %d\n", + LOCK(win32_channel->mutex); + if (win32_channel->running) + { + if (win32_channel->debug) + g_print ("thread %#x: running, marking for later close\n", + win32_channel->thread_id); + win32_channel->running = FALSE; + win32_channel->needs_close = TRUE; + SetEvent(win32_channel->data_avail_noticed_event); + } + if (win32_channel->fd != -1) + { + if (win32_channel->debug) + g_print ("thread %#x: closing socket %d\n", win32_channel->thread_id, win32_channel->fd); - closesocket (win32_channel->fd); - win32_channel->fd = -1; + + closesocket (win32_channel->fd); + win32_channel->fd = -1; + } + UNLOCK(win32_channel->mutex); } static GSource * -- 2.7.4