Avoid UNLOCKing the critical section twice, which might cause a hang.
authorTor Lillqvist <tml@iki.fi>
Mon, 25 Aug 2003 21:37:57 +0000 (21:37 +0000)
committerTor Lillqvist <tml@src.gnome.org>
Mon, 25 Aug 2003 21:37:57 +0000 (21:37 +0000)
2003-08-25  Tor Lillqvist  <tml@iki.fi>

* glib/giowin32.c (read_thread): Avoid UNLOCKing the critical
section twice, which might cause a hang. (#120653)

* glib/giowin32.c (g_io_channel_unix_new): Warn if fd is both a
valid file descriptor and socket.

ChangeLog
ChangeLog.pre-2-10
ChangeLog.pre-2-12
ChangeLog.pre-2-4
ChangeLog.pre-2-6
ChangeLog.pre-2-8
glib/giowin32.c

index 4eb13ea..c70f028 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,11 @@
+2003-08-25  Tor Lillqvist  <tml@iki.fi>
+
+       * glib/giowin32.c (read_thread): Avoid UNLOCKing the critical
+       section twice, which might cause a hang. (#120653)
+
+       * glib/giowin32.c (g_io_channel_unix_new): Warn if fd is both a
+       valid file descriptor and socket.
+
 Mon Aug 25 12:34:36 2003  Owen Taylor  <otaylor@redhat.com>
 
        * glib/gmessages.c: Escape control characters in g_logv() output.
index 4eb13ea..c70f028 100644 (file)
@@ -1,3 +1,11 @@
+2003-08-25  Tor Lillqvist  <tml@iki.fi>
+
+       * glib/giowin32.c (read_thread): Avoid UNLOCKing the critical
+       section twice, which might cause a hang. (#120653)
+
+       * glib/giowin32.c (g_io_channel_unix_new): Warn if fd is both a
+       valid file descriptor and socket.
+
 Mon Aug 25 12:34:36 2003  Owen Taylor  <otaylor@redhat.com>
 
        * glib/gmessages.c: Escape control characters in g_logv() output.
index 4eb13ea..c70f028 100644 (file)
@@ -1,3 +1,11 @@
+2003-08-25  Tor Lillqvist  <tml@iki.fi>
+
+       * glib/giowin32.c (read_thread): Avoid UNLOCKing the critical
+       section twice, which might cause a hang. (#120653)
+
+       * glib/giowin32.c (g_io_channel_unix_new): Warn if fd is both a
+       valid file descriptor and socket.
+
 Mon Aug 25 12:34:36 2003  Owen Taylor  <otaylor@redhat.com>
 
        * glib/gmessages.c: Escape control characters in g_logv() output.
index 4eb13ea..c70f028 100644 (file)
@@ -1,3 +1,11 @@
+2003-08-25  Tor Lillqvist  <tml@iki.fi>
+
+       * glib/giowin32.c (read_thread): Avoid UNLOCKing the critical
+       section twice, which might cause a hang. (#120653)
+
+       * glib/giowin32.c (g_io_channel_unix_new): Warn if fd is both a
+       valid file descriptor and socket.
+
 Mon Aug 25 12:34:36 2003  Owen Taylor  <otaylor@redhat.com>
 
        * glib/gmessages.c: Escape control characters in g_logv() output.
index 4eb13ea..c70f028 100644 (file)
@@ -1,3 +1,11 @@
+2003-08-25  Tor Lillqvist  <tml@iki.fi>
+
+       * glib/giowin32.c (read_thread): Avoid UNLOCKing the critical
+       section twice, which might cause a hang. (#120653)
+
+       * glib/giowin32.c (g_io_channel_unix_new): Warn if fd is both a
+       valid file descriptor and socket.
+
 Mon Aug 25 12:34:36 2003  Owen Taylor  <otaylor@redhat.com>
 
        * glib/gmessages.c: Escape control characters in g_logv() output.
index 4eb13ea..c70f028 100644 (file)
@@ -1,3 +1,11 @@
+2003-08-25  Tor Lillqvist  <tml@iki.fi>
+
+       * glib/giowin32.c (read_thread): Avoid UNLOCKing the critical
+       section twice, which might cause a hang. (#120653)
+
+       * glib/giowin32.c (g_io_channel_unix_new): Warn if fd is both a
+       valid file descriptor and socket.
+
 Mon Aug 25 12:34:36 2003  Owen Taylor  <otaylor@redhat.com>
 
        * glib/gmessages.c: Escape control characters in g_logv() output.
index b7336a8..dde72e7 100644 (file)
@@ -234,9 +234,9 @@ read_thread (void *parameter)
 
   SetEvent (channel->space_avail_event);
   
+  LOCK (channel->mutex);
   while (channel->running)
     {
-      LOCK (channel->mutex);
       if (channel->debug)
        g_print ("read_thread %#x: rdp=%d, wrp=%d\n",
                 channel->thread_id, channel->rdp, channel->wrp);
@@ -294,7 +294,6 @@ read_thread (void *parameter)
        g_print ("read_thread %#x: rdp=%d, wrp=%d, setting data_avail\n",
                 channel->thread_id, channel->rdp, channel->wrp);
       SetEvent (channel->data_avail_event);
-      UNLOCK (channel->mutex);
     }
   
   channel->running = FALSE;
@@ -1604,14 +1603,22 @@ g_io_channel_win32_new_socket (int socket)
 GIOChannel *
 g_io_channel_unix_new (gint fd)
 {
+  gboolean is_fd, is_socket;
   struct stat st;
   int optval, optlen;
 
-  if (fstat (fd, &st) == 0)
-    return g_io_channel_win32_new_fd_internal (fd, &st);
-  
+  is_fd = (fstat (fd, &st) == 0);
+
   optlen = sizeof (optval);
-  if (getsockopt (fd, SOL_SOCKET, SO_TYPE, (char *) &optval, &optlen) != SOCKET_ERROR)
+  is_socket = (getsockopt (fd, SOL_SOCKET, SO_TYPE, (char *) &optval, &optlen) != SOCKET_ERROR);
+
+  if (is_fd && is_socket)
+    g_warning (G_STRLOC ": %d is both a file descriptor and a socket, file descriptor interpretation assumed.", fd);
+
+  if (is_fd)
+    return g_io_channel_win32_new_fd_internal (fd, &st);
+
+  if (is_socket)
     return g_io_channel_win32_new_socket(fd);
 
   g_warning (G_STRLOC ": %d is neither a file descriptor or a socket", fd);