glib.h glib.def New function, to make a GPollFD from a GIOChannel. Creates
authorTor Lillqvist <tml@iki.fi>
Thu, 31 Aug 2000 22:47:24 +0000 (22:47 +0000)
committerTor Lillqvist <tml@src.gnome.org>
Thu, 31 Aug 2000 22:47:24 +0000 (22:47 +0000)
2000-08-31  Tor Lillqvist  <tml@iki.fi>

* glib.h
* glib.def
* giowin32.c (g_io_channel_win32_make_pollfd): New function, to
make a GPollFD from a GIOChannel. Creates the events and starts
the reader thread if necessary.

14 files changed:
ChangeLog
ChangeLog.pre-2-0
ChangeLog.pre-2-10
ChangeLog.pre-2-12
ChangeLog.pre-2-2
ChangeLog.pre-2-4
ChangeLog.pre-2-6
ChangeLog.pre-2-8
giowin32.c
glib.def
glib.h
glib/giowin32.c
glib/glib.def
glib/glib.h

index b11a965599f6c5a3f4cc3b2be9378ad7675eec2c..1abba36cfc4feaddcbdfb7604a2d12c56737cc7a 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,11 @@
 2000-08-31  Tor Lillqvist  <tml@iki.fi>
 
+       * glib.h
+       * glib.def
+       * giowin32.c (g_io_channel_win32_make_pollfd): New function, to
+       make a GPollFD from a GIOChannel. Creates the events and starts
+       the reader thread if necessary.
+
        * glib.h
        * giowin32.c (g_io_channel_win32_poll): No use for separate
        condition parameter.
index b11a965599f6c5a3f4cc3b2be9378ad7675eec2c..1abba36cfc4feaddcbdfb7604a2d12c56737cc7a 100644 (file)
@@ -1,5 +1,11 @@
 2000-08-31  Tor Lillqvist  <tml@iki.fi>
 
+       * glib.h
+       * glib.def
+       * giowin32.c (g_io_channel_win32_make_pollfd): New function, to
+       make a GPollFD from a GIOChannel. Creates the events and starts
+       the reader thread if necessary.
+
        * glib.h
        * giowin32.c (g_io_channel_win32_poll): No use for separate
        condition parameter.
index b11a965599f6c5a3f4cc3b2be9378ad7675eec2c..1abba36cfc4feaddcbdfb7604a2d12c56737cc7a 100644 (file)
@@ -1,5 +1,11 @@
 2000-08-31  Tor Lillqvist  <tml@iki.fi>
 
+       * glib.h
+       * glib.def
+       * giowin32.c (g_io_channel_win32_make_pollfd): New function, to
+       make a GPollFD from a GIOChannel. Creates the events and starts
+       the reader thread if necessary.
+
        * glib.h
        * giowin32.c (g_io_channel_win32_poll): No use for separate
        condition parameter.
index b11a965599f6c5a3f4cc3b2be9378ad7675eec2c..1abba36cfc4feaddcbdfb7604a2d12c56737cc7a 100644 (file)
@@ -1,5 +1,11 @@
 2000-08-31  Tor Lillqvist  <tml@iki.fi>
 
+       * glib.h
+       * glib.def
+       * giowin32.c (g_io_channel_win32_make_pollfd): New function, to
+       make a GPollFD from a GIOChannel. Creates the events and starts
+       the reader thread if necessary.
+
        * glib.h
        * giowin32.c (g_io_channel_win32_poll): No use for separate
        condition parameter.
index b11a965599f6c5a3f4cc3b2be9378ad7675eec2c..1abba36cfc4feaddcbdfb7604a2d12c56737cc7a 100644 (file)
@@ -1,5 +1,11 @@
 2000-08-31  Tor Lillqvist  <tml@iki.fi>
 
+       * glib.h
+       * glib.def
+       * giowin32.c (g_io_channel_win32_make_pollfd): New function, to
+       make a GPollFD from a GIOChannel. Creates the events and starts
+       the reader thread if necessary.
+
        * glib.h
        * giowin32.c (g_io_channel_win32_poll): No use for separate
        condition parameter.
index b11a965599f6c5a3f4cc3b2be9378ad7675eec2c..1abba36cfc4feaddcbdfb7604a2d12c56737cc7a 100644 (file)
@@ -1,5 +1,11 @@
 2000-08-31  Tor Lillqvist  <tml@iki.fi>
 
+       * glib.h
+       * glib.def
+       * giowin32.c (g_io_channel_win32_make_pollfd): New function, to
+       make a GPollFD from a GIOChannel. Creates the events and starts
+       the reader thread if necessary.
+
        * glib.h
        * giowin32.c (g_io_channel_win32_poll): No use for separate
        condition parameter.
index b11a965599f6c5a3f4cc3b2be9378ad7675eec2c..1abba36cfc4feaddcbdfb7604a2d12c56737cc7a 100644 (file)
@@ -1,5 +1,11 @@
 2000-08-31  Tor Lillqvist  <tml@iki.fi>
 
+       * glib.h
+       * glib.def
+       * giowin32.c (g_io_channel_win32_make_pollfd): New function, to
+       make a GPollFD from a GIOChannel. Creates the events and starts
+       the reader thread if necessary.
+
        * glib.h
        * giowin32.c (g_io_channel_win32_poll): No use for separate
        condition parameter.
index b11a965599f6c5a3f4cc3b2be9378ad7675eec2c..1abba36cfc4feaddcbdfb7604a2d12c56737cc7a 100644 (file)
@@ -1,5 +1,11 @@
 2000-08-31  Tor Lillqvist  <tml@iki.fi>
 
+       * glib.h
+       * glib.def
+       * giowin32.c (g_io_channel_win32_make_pollfd): New function, to
+       make a GPollFD from a GIOChannel. Creates the events and starts
+       the reader thread if necessary.
+
        * glib.h
        * giowin32.c (g_io_channel_win32_poll): No use for separate
        condition parameter.
index 9db86d3acddf670cd6fc6b68fa52bd3f319d5fcf..4acdb160abea89f0c0ed9ae99a1609930a00fdf9 100644 (file)
@@ -872,9 +872,9 @@ g_io_channel_win32_set_debug (GIOChannel *channel,
 }
 
 gint
-g_io_channel_win32_poll (GPollFD     *fds,
-                        gint         n_fds,
-                        gint         timeout)
+g_io_channel_win32_poll (GPollFD *fds,
+                        gint     n_fds,
+                        gint     timeout)
 {
   int i;
   int result;
@@ -887,6 +887,26 @@ g_io_channel_win32_poll (GPollFD     *fds,
   return result;
 }
 
+void
+g_io_channel_win32_make_pollfd (GIOChannel   *channel,
+                               GIOCondition  condition,
+                               GPollFD      *fd)
+{
+  GIOWin32Channel *win32_channel = (GIOWin32Channel *) channel;
+
+  if (win32_channel->data_avail_event == NULL)
+    create_events (win32_channel);
+  
+  fd->fd = win32_channel->data_avail_event;
+  fd->events = condition;
+
+  if (win32_channel->thread_id == 0)
+    if (win32_channel->type == G_IO_FILE_DESC)
+      create_reader_thread (win32_channel, fd_reader);
+    else if (win32_channel->type == G_IO_STREAM_SOCKET)
+      create_reader_thread (win32_channel, sock_reader);
+}
+
 gint
 g_io_channel_win32_wait_for_condition (GIOChannel  *channel,
                                       GIOCondition condition,
@@ -895,8 +915,7 @@ g_io_channel_win32_wait_for_condition (GIOChannel  *channel,
   GPollFD pollfd;
   GIOWin32Channel *win32_channel = (GIOWin32Channel *) channel;
 
-  pollfd.fd = (gint) win32_channel->data_avail_event;
-  pollfd.events = condition;
+  g_io_channel_win32_make_pollfd (channel, condition, &pollfd);
   
   return g_io_channel_win32_poll (&pollfd, 1, timeout);
 }
index 0843575bf93c53fcab42f6d87a01db6de781f995..d70288f6b85be90cd95017a4cea53d5c80536a33 100644 (file)
--- a/glib.def
+++ b/glib.def
@@ -164,6 +164,7 @@ EXPORTS
        g_io_channel_win32_new_pipe
        g_io_channel_win32_new_pipe_with_wakeups
        g_io_channel_win32_new_stream_socket
+       g_io_channel_win32_make_pollfd
        g_io_channel_win32_pipe_readable
        g_io_channel_win32_pipe_request_wakeups
        g_io_channel_win32_poll
diff --git a/glib.h b/glib.h
index ded2c205ed47ffe38e15ca275d0b88d45169b700..46aa39003fc3c180f8a665d5b51c75b49fe68dc9 100644 (file)
--- a/glib.h
+++ b/glib.h
@@ -2921,13 +2921,22 @@ gint        g_io_channel_unix_get_fd (GIOChannel *channel);
 
 #define G_WIN32_MSG_HANDLE 19981206
 
+/* Use this to get a GPollFD from a GIOChannel, so that you can call
+ * g_io_channel_win32_poll(). After calling this you should only use
+ * g_io_channel_read() to read from the GIOChannel, i.e. never read()
+ * or recv() from the underlying file descriptor or SOCKET.
+ */
+void        g_io_channel_win32_make_pollfd (GIOChannel   *channel,
+                                           GIOCondition  condition,
+                                           GPollFD      *fd);
+
 /* This can be used to wait a until at least one of the channels is readable.
  * On Unix you would do a select() on the file descriptors of the channels.
  * This should probably be available for all platforms?
  */
-gint        g_io_channel_win32_poll (GPollFD     *fds,
-                                    gint         n_fds,
-                                    gint         timeout);
+gint        g_io_channel_win32_poll   (GPollFD    *fds,
+                                      gint        n_fds,
+                                      gint        timeout);
 
 /* This is used to add polling for Windows messages. GDK (GTk+) programs
  * should *not* use this.
@@ -2941,14 +2950,18 @@ GIOChannel *g_io_channel_win32_new_messages (guint hwnd);
 
 /* An IO channel for C runtime (emulated Unix-like) file
  * descriptors. Identical to g_io_channel_unix_new above.
+ * After calling g_io_add_watch() on a IO channel returned
+ * by this function, you shouldn't call read() on the file
+ * descriptor.
  */
 GIOChannel* g_io_channel_win32_new_fd (int         fd);
 
 /* Get the C runtime file descriptor of a channel. */
 gint        g_io_channel_win32_get_fd (GIOChannel *channel);
 
-/* An IO channel for a SOCK_STREAM winsock socket. The parameter should
- * be a SOCKET.
+/* An IO channel for a SOCK_STREAM winsock socket. The parameter
+ * should be a SOCKET. After calling g_io_add_watch() on a IO channel
+ * returned by this function, you shouldn't call recv() on the SOCKET.
  */
 GIOChannel *g_io_channel_win32_new_stream_socket (int socket);
 
index 9db86d3acddf670cd6fc6b68fa52bd3f319d5fcf..4acdb160abea89f0c0ed9ae99a1609930a00fdf9 100644 (file)
@@ -872,9 +872,9 @@ g_io_channel_win32_set_debug (GIOChannel *channel,
 }
 
 gint
-g_io_channel_win32_poll (GPollFD     *fds,
-                        gint         n_fds,
-                        gint         timeout)
+g_io_channel_win32_poll (GPollFD *fds,
+                        gint     n_fds,
+                        gint     timeout)
 {
   int i;
   int result;
@@ -887,6 +887,26 @@ g_io_channel_win32_poll (GPollFD     *fds,
   return result;
 }
 
+void
+g_io_channel_win32_make_pollfd (GIOChannel   *channel,
+                               GIOCondition  condition,
+                               GPollFD      *fd)
+{
+  GIOWin32Channel *win32_channel = (GIOWin32Channel *) channel;
+
+  if (win32_channel->data_avail_event == NULL)
+    create_events (win32_channel);
+  
+  fd->fd = win32_channel->data_avail_event;
+  fd->events = condition;
+
+  if (win32_channel->thread_id == 0)
+    if (win32_channel->type == G_IO_FILE_DESC)
+      create_reader_thread (win32_channel, fd_reader);
+    else if (win32_channel->type == G_IO_STREAM_SOCKET)
+      create_reader_thread (win32_channel, sock_reader);
+}
+
 gint
 g_io_channel_win32_wait_for_condition (GIOChannel  *channel,
                                       GIOCondition condition,
@@ -895,8 +915,7 @@ g_io_channel_win32_wait_for_condition (GIOChannel  *channel,
   GPollFD pollfd;
   GIOWin32Channel *win32_channel = (GIOWin32Channel *) channel;
 
-  pollfd.fd = (gint) win32_channel->data_avail_event;
-  pollfd.events = condition;
+  g_io_channel_win32_make_pollfd (channel, condition, &pollfd);
   
   return g_io_channel_win32_poll (&pollfd, 1, timeout);
 }
index 0843575bf93c53fcab42f6d87a01db6de781f995..d70288f6b85be90cd95017a4cea53d5c80536a33 100644 (file)
@@ -164,6 +164,7 @@ EXPORTS
        g_io_channel_win32_new_pipe
        g_io_channel_win32_new_pipe_with_wakeups
        g_io_channel_win32_new_stream_socket
+       g_io_channel_win32_make_pollfd
        g_io_channel_win32_pipe_readable
        g_io_channel_win32_pipe_request_wakeups
        g_io_channel_win32_poll
index ded2c205ed47ffe38e15ca275d0b88d45169b700..46aa39003fc3c180f8a665d5b51c75b49fe68dc9 100644 (file)
@@ -2921,13 +2921,22 @@ gint        g_io_channel_unix_get_fd (GIOChannel *channel);
 
 #define G_WIN32_MSG_HANDLE 19981206
 
+/* Use this to get a GPollFD from a GIOChannel, so that you can call
+ * g_io_channel_win32_poll(). After calling this you should only use
+ * g_io_channel_read() to read from the GIOChannel, i.e. never read()
+ * or recv() from the underlying file descriptor or SOCKET.
+ */
+void        g_io_channel_win32_make_pollfd (GIOChannel   *channel,
+                                           GIOCondition  condition,
+                                           GPollFD      *fd);
+
 /* This can be used to wait a until at least one of the channels is readable.
  * On Unix you would do a select() on the file descriptors of the channels.
  * This should probably be available for all platforms?
  */
-gint        g_io_channel_win32_poll (GPollFD     *fds,
-                                    gint         n_fds,
-                                    gint         timeout);
+gint        g_io_channel_win32_poll   (GPollFD    *fds,
+                                      gint        n_fds,
+                                      gint        timeout);
 
 /* This is used to add polling for Windows messages. GDK (GTk+) programs
  * should *not* use this.
@@ -2941,14 +2950,18 @@ GIOChannel *g_io_channel_win32_new_messages (guint hwnd);
 
 /* An IO channel for C runtime (emulated Unix-like) file
  * descriptors. Identical to g_io_channel_unix_new above.
+ * After calling g_io_add_watch() on a IO channel returned
+ * by this function, you shouldn't call read() on the file
+ * descriptor.
  */
 GIOChannel* g_io_channel_win32_new_fd (int         fd);
 
 /* Get the C runtime file descriptor of a channel. */
 gint        g_io_channel_win32_get_fd (GIOChannel *channel);
 
-/* An IO channel for a SOCK_STREAM winsock socket. The parameter should
- * be a SOCKET.
+/* An IO channel for a SOCK_STREAM winsock socket. The parameter
+ * should be a SOCKET. After calling g_io_add_watch() on a IO channel
+ * returned by this function, you shouldn't call recv() on the SOCKET.
  */
 GIOChannel *g_io_channel_win32_new_stream_socket (int socket);