glib.h glib.def New function, to make a GPollFD from a GIOChannel. Creates

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.
This commit is contained in:
Tor Lillqvist 2000-08-31 22:47:24 +00:00 committed by Tor Lillqvist
parent ba8a71589d
commit 3dcf39eb77
14 changed files with 134 additions and 20 deletions

View File

@ -1,5 +1,11 @@
2000-08-31 Tor Lillqvist <tml@iki.fi> 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 * glib.h
* giowin32.c (g_io_channel_win32_poll): No use for separate * giowin32.c (g_io_channel_win32_poll): No use for separate
condition parameter. condition parameter.

View File

@ -1,5 +1,11 @@
2000-08-31 Tor Lillqvist <tml@iki.fi> 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 * glib.h
* giowin32.c (g_io_channel_win32_poll): No use for separate * giowin32.c (g_io_channel_win32_poll): No use for separate
condition parameter. condition parameter.

View File

@ -1,5 +1,11 @@
2000-08-31 Tor Lillqvist <tml@iki.fi> 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 * glib.h
* giowin32.c (g_io_channel_win32_poll): No use for separate * giowin32.c (g_io_channel_win32_poll): No use for separate
condition parameter. condition parameter.

View File

@ -1,5 +1,11 @@
2000-08-31 Tor Lillqvist <tml@iki.fi> 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 * glib.h
* giowin32.c (g_io_channel_win32_poll): No use for separate * giowin32.c (g_io_channel_win32_poll): No use for separate
condition parameter. condition parameter.

View File

@ -1,5 +1,11 @@
2000-08-31 Tor Lillqvist <tml@iki.fi> 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 * glib.h
* giowin32.c (g_io_channel_win32_poll): No use for separate * giowin32.c (g_io_channel_win32_poll): No use for separate
condition parameter. condition parameter.

View File

@ -1,5 +1,11 @@
2000-08-31 Tor Lillqvist <tml@iki.fi> 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 * glib.h
* giowin32.c (g_io_channel_win32_poll): No use for separate * giowin32.c (g_io_channel_win32_poll): No use for separate
condition parameter. condition parameter.

View File

@ -1,5 +1,11 @@
2000-08-31 Tor Lillqvist <tml@iki.fi> 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 * glib.h
* giowin32.c (g_io_channel_win32_poll): No use for separate * giowin32.c (g_io_channel_win32_poll): No use for separate
condition parameter. condition parameter.

View File

@ -1,5 +1,11 @@
2000-08-31 Tor Lillqvist <tml@iki.fi> 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 * glib.h
* giowin32.c (g_io_channel_win32_poll): No use for separate * giowin32.c (g_io_channel_win32_poll): No use for separate
condition parameter. condition parameter.

View File

@ -872,9 +872,9 @@ g_io_channel_win32_set_debug (GIOChannel *channel,
} }
gint gint
g_io_channel_win32_poll (GPollFD *fds, g_io_channel_win32_poll (GPollFD *fds,
gint n_fds, gint n_fds,
gint timeout) gint timeout)
{ {
int i; int i;
int result; int result;
@ -887,6 +887,26 @@ g_io_channel_win32_poll (GPollFD *fds,
return result; 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 gint
g_io_channel_win32_wait_for_condition (GIOChannel *channel, g_io_channel_win32_wait_for_condition (GIOChannel *channel,
GIOCondition condition, GIOCondition condition,
@ -895,8 +915,7 @@ g_io_channel_win32_wait_for_condition (GIOChannel *channel,
GPollFD pollfd; GPollFD pollfd;
GIOWin32Channel *win32_channel = (GIOWin32Channel *) channel; GIOWin32Channel *win32_channel = (GIOWin32Channel *) channel;
pollfd.fd = (gint) win32_channel->data_avail_event; g_io_channel_win32_make_pollfd (channel, condition, &pollfd);
pollfd.events = condition;
return g_io_channel_win32_poll (&pollfd, 1, timeout); return g_io_channel_win32_poll (&pollfd, 1, timeout);
} }

View File

@ -164,6 +164,7 @@ EXPORTS
g_io_channel_win32_new_pipe g_io_channel_win32_new_pipe
g_io_channel_win32_new_pipe_with_wakeups g_io_channel_win32_new_pipe_with_wakeups
g_io_channel_win32_new_stream_socket g_io_channel_win32_new_stream_socket
g_io_channel_win32_make_pollfd
g_io_channel_win32_pipe_readable g_io_channel_win32_pipe_readable
g_io_channel_win32_pipe_request_wakeups g_io_channel_win32_pipe_request_wakeups
g_io_channel_win32_poll g_io_channel_win32_poll

23
glib.h
View File

@ -2921,13 +2921,22 @@ gint g_io_channel_unix_get_fd (GIOChannel *channel);
#define G_WIN32_MSG_HANDLE 19981206 #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. /* 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. * On Unix you would do a select() on the file descriptors of the channels.
* This should probably be available for all platforms? * This should probably be available for all platforms?
*/ */
gint g_io_channel_win32_poll (GPollFD *fds, gint g_io_channel_win32_poll (GPollFD *fds,
gint n_fds, gint n_fds,
gint timeout); gint timeout);
/* This is used to add polling for Windows messages. GDK (GTk+) programs /* This is used to add polling for Windows messages. GDK (GTk+) programs
* should *not* use this. * 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 /* An IO channel for C runtime (emulated Unix-like) file
* descriptors. Identical to g_io_channel_unix_new above. * 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); GIOChannel* g_io_channel_win32_new_fd (int fd);
/* Get the C runtime file descriptor of a channel. */ /* Get the C runtime file descriptor of a channel. */
gint g_io_channel_win32_get_fd (GIOChannel *channel); gint g_io_channel_win32_get_fd (GIOChannel *channel);
/* An IO channel for a SOCK_STREAM winsock socket. The parameter should /* An IO channel for a SOCK_STREAM winsock socket. The parameter
* be a SOCKET. * 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); GIOChannel *g_io_channel_win32_new_stream_socket (int socket);

View File

@ -872,9 +872,9 @@ g_io_channel_win32_set_debug (GIOChannel *channel,
} }
gint gint
g_io_channel_win32_poll (GPollFD *fds, g_io_channel_win32_poll (GPollFD *fds,
gint n_fds, gint n_fds,
gint timeout) gint timeout)
{ {
int i; int i;
int result; int result;
@ -887,6 +887,26 @@ g_io_channel_win32_poll (GPollFD *fds,
return result; 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 gint
g_io_channel_win32_wait_for_condition (GIOChannel *channel, g_io_channel_win32_wait_for_condition (GIOChannel *channel,
GIOCondition condition, GIOCondition condition,
@ -895,8 +915,7 @@ g_io_channel_win32_wait_for_condition (GIOChannel *channel,
GPollFD pollfd; GPollFD pollfd;
GIOWin32Channel *win32_channel = (GIOWin32Channel *) channel; GIOWin32Channel *win32_channel = (GIOWin32Channel *) channel;
pollfd.fd = (gint) win32_channel->data_avail_event; g_io_channel_win32_make_pollfd (channel, condition, &pollfd);
pollfd.events = condition;
return g_io_channel_win32_poll (&pollfd, 1, timeout); return g_io_channel_win32_poll (&pollfd, 1, timeout);
} }

View File

@ -164,6 +164,7 @@ EXPORTS
g_io_channel_win32_new_pipe g_io_channel_win32_new_pipe
g_io_channel_win32_new_pipe_with_wakeups g_io_channel_win32_new_pipe_with_wakeups
g_io_channel_win32_new_stream_socket g_io_channel_win32_new_stream_socket
g_io_channel_win32_make_pollfd
g_io_channel_win32_pipe_readable g_io_channel_win32_pipe_readable
g_io_channel_win32_pipe_request_wakeups g_io_channel_win32_pipe_request_wakeups
g_io_channel_win32_poll g_io_channel_win32_poll

View File

@ -2921,13 +2921,22 @@ gint g_io_channel_unix_get_fd (GIOChannel *channel);
#define G_WIN32_MSG_HANDLE 19981206 #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. /* 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. * On Unix you would do a select() on the file descriptors of the channels.
* This should probably be available for all platforms? * This should probably be available for all platforms?
*/ */
gint g_io_channel_win32_poll (GPollFD *fds, gint g_io_channel_win32_poll (GPollFD *fds,
gint n_fds, gint n_fds,
gint timeout); gint timeout);
/* This is used to add polling for Windows messages. GDK (GTk+) programs /* This is used to add polling for Windows messages. GDK (GTk+) programs
* should *not* use this. * 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 /* An IO channel for C runtime (emulated Unix-like) file
* descriptors. Identical to g_io_channel_unix_new above. * 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); GIOChannel* g_io_channel_win32_new_fd (int fd);
/* Get the C runtime file descriptor of a channel. */ /* Get the C runtime file descriptor of a channel. */
gint g_io_channel_win32_get_fd (GIOChannel *channel); gint g_io_channel_win32_get_fd (GIOChannel *channel);
/* An IO channel for a SOCK_STREAM winsock socket. The parameter should /* An IO channel for a SOCK_STREAM winsock socket. The parameter
* be a SOCKET. * 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); GIOChannel *g_io_channel_win32_new_stream_socket (int socket);