On Thu, Jun 30, 2005 at 10:17:15AM -0400, muppet <[EMAIL PROTECTED]> wrote:
> > I am trying to port a gtk2-perl program to windows (in theory an easy
> > task).
> >
> > However, it's using sockets, and the only way to use them in a nonblocking
> > way (under Gtk2) seems to be to use glib watchers. Now, the problem is
> > that, when my callback gets called, glib has already read the data from
> > the filehandle, and there doesn't seem to be support for giochannels in
> > the Glib module, so there is no way to actually get the data.
> 
> Have you tried recv() instead of <> or sysread?

No, because, as I wrote, glib already read the socket data, so I assumed
that recv would block just as sysread does (sysread is not really
different to recv).

However, I did try recv, and the result is as expected: it simply blocks
waiting for new data, while the data that triggered the watcher is "lost"
in the glib-internal buffer.

However, it was in some sense "false alarm", as I did some tracing with
G_IO_WIN32_DEBUG=1, and it showed this:

   fileno is 3 at igsueme line 340.
   g_io_channel_win32_new_fd: 3
   g_io_win32_create_watch: fd:3 condition:0x1 handle:0x200

If I read this correctly, it means that g_io_channel_unix_new, which tests
for both socket and normal file, detects that filehandle 3 is not a socket
but a file (it would output a warning if is a socket _and_ a file).

So this probably means that the Glib module passes in the weong filehandle
(the perl fileno, not the windows filehandle).

In 2002 or so I read about this issue, and I think you need a function to
convert between perls idea of fileno and the os idea of a fileno, and glib
should use that function.

I'll do some research.

(Damn, I tried very hard to avoid having to build perl modules for
activestate... it's sooo horrible and maybe I won't even succeed...).

> > interface? (Sorry if it's the latter case).
> 
> Not a problem known to me, at least.

Well... :)

> The only hint of the GIOChannel API visible at the perl level is
> Glib::IO::add_watch().  This was by design, because GIOChannel provides
> functionality normally provided by native perl file handles, and we made a
> conscious effort not to duplicate these things.  Personally, i had no idea
> that sockets behaved that way on win32.

win32 has rather weird ways of event multiplexing. basically you have no
multiplexing but instead start a thread for every source (or at least
every type of event source). (in theory there are gazillion cool features
there (overlapped i/o, completion ports, ...), but the most basic use
cases are not solvable without threads and some weird programming).

-- 
                The choice of a
      -----==-     _GNU_
      ----==-- _       generation     Marc Lehmann
      ---==---(_)__  __ ____  __      [EMAIL PROTECTED]
      --==---/ / _ \/ // /\ \/ /      http://schmorp.de/
      -=====/_/_//_/\_,_/ /_/\_\      XX11-RIPE
_______________________________________________
gtk-perl-list mailing list
gtk-perl-list@gnome.org
http://mail.gnome.org/mailman/listinfo/gtk-perl-list

Reply via email to