diff --git a/ChangeLog b/ChangeLog index 5d9969b6f..5b9fa6085 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,12 @@ +2000-08-12 Tor Lillqvist + + * giowin32.c: Some indentation and spacing fixes. Add some more + logging. + (g_io_win32_add_watch): New function, with common code from + g_io_win32_fd_add_watch and g_io_win32_sock_add_watch. Don't start + more than one reader thread for a GIOChannel. We should obviously + have just one reader thread reading a file descriptor or socket. + 2000-08-10 Havoc Pennington * gthread-2.0.pc.in (Cflags): don't duplicate glib Cflags diff --git a/ChangeLog.pre-2-0 b/ChangeLog.pre-2-0 index 5d9969b6f..5b9fa6085 100644 --- a/ChangeLog.pre-2-0 +++ b/ChangeLog.pre-2-0 @@ -1,3 +1,12 @@ +2000-08-12 Tor Lillqvist + + * giowin32.c: Some indentation and spacing fixes. Add some more + logging. + (g_io_win32_add_watch): New function, with common code from + g_io_win32_fd_add_watch and g_io_win32_sock_add_watch. Don't start + more than one reader thread for a GIOChannel. We should obviously + have just one reader thread reading a file descriptor or socket. + 2000-08-10 Havoc Pennington * gthread-2.0.pc.in (Cflags): don't duplicate glib Cflags diff --git a/ChangeLog.pre-2-10 b/ChangeLog.pre-2-10 index 5d9969b6f..5b9fa6085 100644 --- a/ChangeLog.pre-2-10 +++ b/ChangeLog.pre-2-10 @@ -1,3 +1,12 @@ +2000-08-12 Tor Lillqvist + + * giowin32.c: Some indentation and spacing fixes. Add some more + logging. + (g_io_win32_add_watch): New function, with common code from + g_io_win32_fd_add_watch and g_io_win32_sock_add_watch. Don't start + more than one reader thread for a GIOChannel. We should obviously + have just one reader thread reading a file descriptor or socket. + 2000-08-10 Havoc Pennington * gthread-2.0.pc.in (Cflags): don't duplicate glib Cflags diff --git a/ChangeLog.pre-2-12 b/ChangeLog.pre-2-12 index 5d9969b6f..5b9fa6085 100644 --- a/ChangeLog.pre-2-12 +++ b/ChangeLog.pre-2-12 @@ -1,3 +1,12 @@ +2000-08-12 Tor Lillqvist + + * giowin32.c: Some indentation and spacing fixes. Add some more + logging. + (g_io_win32_add_watch): New function, with common code from + g_io_win32_fd_add_watch and g_io_win32_sock_add_watch. Don't start + more than one reader thread for a GIOChannel. We should obviously + have just one reader thread reading a file descriptor or socket. + 2000-08-10 Havoc Pennington * gthread-2.0.pc.in (Cflags): don't duplicate glib Cflags diff --git a/ChangeLog.pre-2-2 b/ChangeLog.pre-2-2 index 5d9969b6f..5b9fa6085 100644 --- a/ChangeLog.pre-2-2 +++ b/ChangeLog.pre-2-2 @@ -1,3 +1,12 @@ +2000-08-12 Tor Lillqvist + + * giowin32.c: Some indentation and spacing fixes. Add some more + logging. + (g_io_win32_add_watch): New function, with common code from + g_io_win32_fd_add_watch and g_io_win32_sock_add_watch. Don't start + more than one reader thread for a GIOChannel. We should obviously + have just one reader thread reading a file descriptor or socket. + 2000-08-10 Havoc Pennington * gthread-2.0.pc.in (Cflags): don't duplicate glib Cflags diff --git a/ChangeLog.pre-2-4 b/ChangeLog.pre-2-4 index 5d9969b6f..5b9fa6085 100644 --- a/ChangeLog.pre-2-4 +++ b/ChangeLog.pre-2-4 @@ -1,3 +1,12 @@ +2000-08-12 Tor Lillqvist + + * giowin32.c: Some indentation and spacing fixes. Add some more + logging. + (g_io_win32_add_watch): New function, with common code from + g_io_win32_fd_add_watch and g_io_win32_sock_add_watch. Don't start + more than one reader thread for a GIOChannel. We should obviously + have just one reader thread reading a file descriptor or socket. + 2000-08-10 Havoc Pennington * gthread-2.0.pc.in (Cflags): don't duplicate glib Cflags diff --git a/ChangeLog.pre-2-6 b/ChangeLog.pre-2-6 index 5d9969b6f..5b9fa6085 100644 --- a/ChangeLog.pre-2-6 +++ b/ChangeLog.pre-2-6 @@ -1,3 +1,12 @@ +2000-08-12 Tor Lillqvist + + * giowin32.c: Some indentation and spacing fixes. Add some more + logging. + (g_io_win32_add_watch): New function, with common code from + g_io_win32_fd_add_watch and g_io_win32_sock_add_watch. Don't start + more than one reader thread for a GIOChannel. We should obviously + have just one reader thread reading a file descriptor or socket. + 2000-08-10 Havoc Pennington * gthread-2.0.pc.in (Cflags): don't duplicate glib Cflags diff --git a/ChangeLog.pre-2-8 b/ChangeLog.pre-2-8 index 5d9969b6f..5b9fa6085 100644 --- a/ChangeLog.pre-2-8 +++ b/ChangeLog.pre-2-8 @@ -1,3 +1,12 @@ +2000-08-12 Tor Lillqvist + + * giowin32.c: Some indentation and spacing fixes. Add some more + logging. + (g_io_win32_add_watch): New function, with common code from + g_io_win32_fd_add_watch and g_io_win32_sock_add_watch. Don't start + more than one reader thread for a GIOChannel. We should obviously + have just one reader thread reading a file descriptor or socket. + 2000-08-10 Havoc Pennington * gthread-2.0.pc.in (Cflags): don't duplicate glib Cflags diff --git a/giowin32.c b/giowin32.c index ae05d6180..68fee3b4a 100644 --- a/giowin32.c +++ b/giowin32.c @@ -122,6 +122,8 @@ g_io_channel_win32_init (GIOWin32Channel *channel) channel->buffer = NULL; channel->running = FALSE; channel->thread_id = 0; + channel->data_avail_event = NULL; + channel->space_avail_event = NULL; } static void @@ -133,9 +135,6 @@ create_events (GIOWin32Channel *channel) sec_attrs.lpSecurityDescriptor = NULL; sec_attrs.bInheritHandle = FALSE; - channel->data_avail_event = NULL; - channel->space_avail_event = NULL; - /* The data available event is manual reset, the space available event * is automatic reset. */ @@ -379,6 +378,43 @@ static GSourceFuncs win32_watch_funcs = { g_io_win32_destroy }; +static guint +g_io_win32_add_watch (GIOChannel *channel, + gint priority, + GIOCondition condition, + GIOFunc func, + gpointer user_data, + GDestroyNotify notify, + int (*reader) (int, guchar *, int)) +{ + GIOWin32Watch *watch = g_new (GIOWin32Watch, 1); + GIOWin32Channel *win32_channel = (GIOWin32Channel *) channel; + + watch->channel = channel; + g_io_channel_ref (channel); + + watch->callback = func; + watch->condition = condition; + + if (win32_channel->data_avail_event == NULL) + create_events (win32_channel); + + watch->pollfd.fd = (gint) win32_channel->data_avail_event; + watch->pollfd.events = condition; + + if (win32_channel->debug) + g_print ("g_io_win32_add_watch: fd:%d handle:%#x\n", + win32_channel->fd, watch->pollfd.fd); + + if (win32_channel->thread_id == 0) + create_reader_thread (win32_channel, reader); + + g_main_add_poll (&watch->pollfd, priority); + + return g_source_add (priority, TRUE, &win32_watch_funcs, watch, + user_data, notify); +} + static GIOError g_io_win32_msg_read (GIOChannel *channel, gchar *buf, @@ -428,7 +464,6 @@ g_io_win32_no_seek (GIOChannel *channel, return G_IO_ERROR_UNKNOWN; } - static void g_io_win32_msg_close (GIOChannel *channel) { @@ -478,14 +513,18 @@ g_io_win32_msg_add_watch (GIOChannel *channel, static GIOError g_io_win32_fd_read (GIOChannel *channel, - gchar *buf, - guint count, - guint *bytes_read) + gchar *buf, + guint count, + guint *bytes_read) { GIOWin32Channel *win32_channel = (GIOWin32Channel *) channel; gint result; GIOError error; + if (win32_channel->debug) + g_print ("g_io_win32_fd_read: fd:%d count:%d\n", + win32_channel->fd, count); + if (win32_channel->thread_id) { result = buffer_read (win32_channel, buf, count, &error); @@ -519,10 +558,10 @@ g_io_win32_fd_read (GIOChannel *channel, } static GIOError -g_io_win32_fd_write(GIOChannel *channel, - gchar *buf, - guint count, - guint *bytes_written) +g_io_win32_fd_write (GIOChannel *channel, + gchar *buf, + guint count, + guint *bytes_written) { GIOWin32Channel *win32_channel = (GIOWin32Channel *) channel; gint result; @@ -554,8 +593,8 @@ g_io_win32_fd_write(GIOChannel *channel, static GIOError g_io_win32_fd_seek (GIOChannel *channel, - gint offset, - GSeekType type) + gint offset, + GSeekType type) { GIOWin32Channel *win32_channel = (GIOWin32Channel *) channel; int whence; @@ -618,30 +657,8 @@ g_io_win32_fd_add_watch (GIOChannel *channel, gpointer user_data, GDestroyNotify notify) { - GIOWin32Watch *watch = g_new (GIOWin32Watch, 1); - GIOWin32Channel *win32_channel = (GIOWin32Channel *) channel; - - watch->channel = channel; - g_io_channel_ref (channel); - - watch->callback = func; - watch->condition = condition; - - create_events (win32_channel); - - watch->pollfd.fd = (gint) win32_channel->data_avail_event; - watch->pollfd.events = condition; - - if (win32_channel->debug) - g_print ("g_io_win32_fd_add_watch: fd:%d handle:%#x\n", - win32_channel->fd, watch->pollfd.fd); - - create_reader_thread (win32_channel, fd_reader); - - g_main_add_poll (&watch->pollfd, priority); - - return g_source_add (priority, TRUE, &win32_watch_funcs, - watch, user_data, notify); + return g_io_win32_add_watch (channel, priority, condition, + func, user_data, notify, fd_reader); } static GIOError @@ -684,10 +701,10 @@ g_io_win32_sock_read (GIOChannel *channel, } static GIOError -g_io_win32_sock_write(GIOChannel *channel, - gchar *buf, - guint count, - guint *bytes_written) +g_io_win32_sock_write (GIOChannel *channel, + gchar *buf, + guint count, + guint *bytes_written) { GIOWin32Channel *win32_channel = (GIOWin32Channel *) channel; gint result; @@ -739,27 +756,8 @@ g_io_win32_sock_add_watch (GIOChannel *channel, gpointer user_data, GDestroyNotify notify) { - GIOWin32Watch *watch = g_new (GIOWin32Watch, 1); - GIOWin32Channel *win32_channel = (GIOWin32Channel *) channel; - - watch->channel = channel; - g_io_channel_ref (channel); - - watch->callback = func; - watch->condition = condition; - - create_events (win32_channel); - - watch->pollfd.fd = (gint) win32_channel->data_avail_event; - watch->pollfd.events = condition; - - /* Sockets are always readable, aren't they? */ - create_reader_thread (win32_channel, sock_reader); - - g_main_add_poll (&watch->pollfd, priority); - - return g_source_add (priority, TRUE, &win32_watch_funcs, watch, - user_data, notify); + return g_io_win32_add_watch (channel, priority, condition, + func, user_data, notify, sock_reader); } static GIOFuncs win32_channel_msg_funcs = { @@ -915,23 +913,23 @@ g_io_channel_win32_new_pipe (int fd) GIOChannel * g_io_channel_win32_new_pipe_with_wakeups (int fd, - guint peer, - int peer_fd) + guint peer, + int peer_fd) { return g_io_channel_win32_new_fd (fd); } void g_io_channel_win32_pipe_request_wakeups (GIOChannel *channel, - guint peer, - int peer_fd) + guint peer, + int peer_fd) { /* Nothing needed now */ } void g_io_channel_win32_pipe_readable (gint fd, - guint offset) + guint offset) { /* Nothing needed now */ } diff --git a/glib/giowin32.c b/glib/giowin32.c index ae05d6180..68fee3b4a 100644 --- a/glib/giowin32.c +++ b/glib/giowin32.c @@ -122,6 +122,8 @@ g_io_channel_win32_init (GIOWin32Channel *channel) channel->buffer = NULL; channel->running = FALSE; channel->thread_id = 0; + channel->data_avail_event = NULL; + channel->space_avail_event = NULL; } static void @@ -133,9 +135,6 @@ create_events (GIOWin32Channel *channel) sec_attrs.lpSecurityDescriptor = NULL; sec_attrs.bInheritHandle = FALSE; - channel->data_avail_event = NULL; - channel->space_avail_event = NULL; - /* The data available event is manual reset, the space available event * is automatic reset. */ @@ -379,6 +378,43 @@ static GSourceFuncs win32_watch_funcs = { g_io_win32_destroy }; +static guint +g_io_win32_add_watch (GIOChannel *channel, + gint priority, + GIOCondition condition, + GIOFunc func, + gpointer user_data, + GDestroyNotify notify, + int (*reader) (int, guchar *, int)) +{ + GIOWin32Watch *watch = g_new (GIOWin32Watch, 1); + GIOWin32Channel *win32_channel = (GIOWin32Channel *) channel; + + watch->channel = channel; + g_io_channel_ref (channel); + + watch->callback = func; + watch->condition = condition; + + if (win32_channel->data_avail_event == NULL) + create_events (win32_channel); + + watch->pollfd.fd = (gint) win32_channel->data_avail_event; + watch->pollfd.events = condition; + + if (win32_channel->debug) + g_print ("g_io_win32_add_watch: fd:%d handle:%#x\n", + win32_channel->fd, watch->pollfd.fd); + + if (win32_channel->thread_id == 0) + create_reader_thread (win32_channel, reader); + + g_main_add_poll (&watch->pollfd, priority); + + return g_source_add (priority, TRUE, &win32_watch_funcs, watch, + user_data, notify); +} + static GIOError g_io_win32_msg_read (GIOChannel *channel, gchar *buf, @@ -428,7 +464,6 @@ g_io_win32_no_seek (GIOChannel *channel, return G_IO_ERROR_UNKNOWN; } - static void g_io_win32_msg_close (GIOChannel *channel) { @@ -478,14 +513,18 @@ g_io_win32_msg_add_watch (GIOChannel *channel, static GIOError g_io_win32_fd_read (GIOChannel *channel, - gchar *buf, - guint count, - guint *bytes_read) + gchar *buf, + guint count, + guint *bytes_read) { GIOWin32Channel *win32_channel = (GIOWin32Channel *) channel; gint result; GIOError error; + if (win32_channel->debug) + g_print ("g_io_win32_fd_read: fd:%d count:%d\n", + win32_channel->fd, count); + if (win32_channel->thread_id) { result = buffer_read (win32_channel, buf, count, &error); @@ -519,10 +558,10 @@ g_io_win32_fd_read (GIOChannel *channel, } static GIOError -g_io_win32_fd_write(GIOChannel *channel, - gchar *buf, - guint count, - guint *bytes_written) +g_io_win32_fd_write (GIOChannel *channel, + gchar *buf, + guint count, + guint *bytes_written) { GIOWin32Channel *win32_channel = (GIOWin32Channel *) channel; gint result; @@ -554,8 +593,8 @@ g_io_win32_fd_write(GIOChannel *channel, static GIOError g_io_win32_fd_seek (GIOChannel *channel, - gint offset, - GSeekType type) + gint offset, + GSeekType type) { GIOWin32Channel *win32_channel = (GIOWin32Channel *) channel; int whence; @@ -618,30 +657,8 @@ g_io_win32_fd_add_watch (GIOChannel *channel, gpointer user_data, GDestroyNotify notify) { - GIOWin32Watch *watch = g_new (GIOWin32Watch, 1); - GIOWin32Channel *win32_channel = (GIOWin32Channel *) channel; - - watch->channel = channel; - g_io_channel_ref (channel); - - watch->callback = func; - watch->condition = condition; - - create_events (win32_channel); - - watch->pollfd.fd = (gint) win32_channel->data_avail_event; - watch->pollfd.events = condition; - - if (win32_channel->debug) - g_print ("g_io_win32_fd_add_watch: fd:%d handle:%#x\n", - win32_channel->fd, watch->pollfd.fd); - - create_reader_thread (win32_channel, fd_reader); - - g_main_add_poll (&watch->pollfd, priority); - - return g_source_add (priority, TRUE, &win32_watch_funcs, - watch, user_data, notify); + return g_io_win32_add_watch (channel, priority, condition, + func, user_data, notify, fd_reader); } static GIOError @@ -684,10 +701,10 @@ g_io_win32_sock_read (GIOChannel *channel, } static GIOError -g_io_win32_sock_write(GIOChannel *channel, - gchar *buf, - guint count, - guint *bytes_written) +g_io_win32_sock_write (GIOChannel *channel, + gchar *buf, + guint count, + guint *bytes_written) { GIOWin32Channel *win32_channel = (GIOWin32Channel *) channel; gint result; @@ -739,27 +756,8 @@ g_io_win32_sock_add_watch (GIOChannel *channel, gpointer user_data, GDestroyNotify notify) { - GIOWin32Watch *watch = g_new (GIOWin32Watch, 1); - GIOWin32Channel *win32_channel = (GIOWin32Channel *) channel; - - watch->channel = channel; - g_io_channel_ref (channel); - - watch->callback = func; - watch->condition = condition; - - create_events (win32_channel); - - watch->pollfd.fd = (gint) win32_channel->data_avail_event; - watch->pollfd.events = condition; - - /* Sockets are always readable, aren't they? */ - create_reader_thread (win32_channel, sock_reader); - - g_main_add_poll (&watch->pollfd, priority); - - return g_source_add (priority, TRUE, &win32_watch_funcs, watch, - user_data, notify); + return g_io_win32_add_watch (channel, priority, condition, + func, user_data, notify, sock_reader); } static GIOFuncs win32_channel_msg_funcs = { @@ -915,23 +913,23 @@ g_io_channel_win32_new_pipe (int fd) GIOChannel * g_io_channel_win32_new_pipe_with_wakeups (int fd, - guint peer, - int peer_fd) + guint peer, + int peer_fd) { return g_io_channel_win32_new_fd (fd); } void g_io_channel_win32_pipe_request_wakeups (GIOChannel *channel, - guint peer, - int peer_fd) + guint peer, + int peer_fd) { /* Nothing needed now */ } void g_io_channel_win32_pipe_readable (gint fd, - guint offset) + guint offset) { /* Nothing needed now */ }