On Thu, Jun 03, 2004 at 02:04:32PM -0400, Andy Levine wrote:
> 
> After further analysis, I have confirmed our suspicions about select() under
> Solaris. The "exception" or "expedite" bit will ALWAYS return true for a
> FILEHANDLE associated with a regular file. According to "man -s 3c select"
> under Solaris: 
> 
> ----snip---
> "File descriptors associated with regular files always select true for
> ready  to  read, ready to write, and error conditions."
> --- end snip ---
> 
> So it appears the "trick" to solving this problem with UserAgent would be to
> not call "select_expedite" in _add_in_socket() and _add_out_socket() for
> those URIs that are file based when running under Solaris.  Any ideas how to
> accomplish this in a generic, friendly way?

Select() is always reports read and write readiness on plain files,
which limits its usefulness there but simplifies using it to multiplex
arbitrary file descriptors.

Anyway, it doesn't seem useful to select_expedite() on plain files
regardless of the operating system.  The included patch avoids calling
select_expedite() on plain files.

Please let me know if it helps, and I'll release a new version of
PoCo::Client::UserAgent.

-- Rocco Caputo - http://poe.perl.org/

1) poerbook:~/projects/local/client-ua% cvs diff UserAgent.pm
Index: UserAgent.pm
===================================================================
RCS file: /usr/local/cvsroot/rocco/client-ua/UserAgent.pm,v
retrieving revision 1.3
diff -u -r1.3 UserAgent.pm
--- UserAgent.pm        10 Dec 2002 04:56:34 -0000      1.3
+++ UserAgent.pm        6 Jun 2004 19:54:00 -0000
@@ -182,7 +182,8 @@
        my ($object, $socket) = @_;
        LWP::Debug::trace ("$object\n\t$socket");
        $poe_kernel -> select_write ($socket => 'write');
-       $poe_kernel -> select_expedite ($socket => 'error');
+       $poe_kernel -> select_expedite ($socket => 'error')
+               unless -f $socket;
 }
 
 sub _add_in_socket
@@ -190,7 +191,8 @@
        my ($object, $socket) = @_;
        LWP::Debug::trace ("$object\n\t$socket");
        $poe_kernel -> select_read ($socket => 'read');
-       $poe_kernel -> select_expedite ($socket => 'error');
+       $poe_kernel -> select_expedite ($socket => 'error')
+               unless -f $socket;
 }
 
 sub _remove_out_socket
@@ -198,7 +200,8 @@
        my ($object, $socket) = @_;
        LWP::Debug::trace ("$object\n\t$socket");
        $poe_kernel -> select_write ($socket);
-       $poe_kernel -> select_expedite ($socket);
+       $poe_kernel -> select_expedite ($socket)
+               unless -f $socket;
 }
 
 sub _remove_in_socket
@@ -206,7 +209,8 @@
        my ($object, $socket) = @_;
        LWP::Debug::trace ("$object\n\t$socket");
        $poe_kernel -> select_read ($socket);
-       $poe_kernel -> select_expedite ($socket);
+       $poe_kernel -> select_expedite ($socket)
+               unless -f $socket;
 }
 
 sub _remove_all_sockets
1) poerbook:~/projects/local/client-ua% 

Reply via email to