ASPN ActiveState Programmer Network
ActiveState
/ Home / Perl / PHP / Python / Tcl / XSLT /
/ Safari / My ASPN /
Cookbooks | Documentation | Mailing Lists | Modules | News Feeds | Products | User Groups


Recent Messages
List Archives
About the List
List Leaders
Subscription Options

View Subscriptions
Help

View by Topic
ActiveState
.NET Framework
Open Source
Perl
PHP
Python
Tcl
Web Services
XML & XSLT

View by Category
Database
General
SOAP
System Administration
Tools
User Interfaces
Web Programming
XML Programming


MyASPN >> Mail Archive >> php-gtk-dev
php-gtk-dev
[PHP-GTK-DEV] #41875 [Bgs]: io_add_watch can't detect HUPs
by Sebastianmarconi At Gmail Dot Com other posts by this author
Jul 19 2007 9:40AM messages near this date
[PHP-GTK-DEV] #41875 [NEW]: io_add_watch can't detect HUPs | [PHP-GTK-DEV] #41875 [Opn->Bgs]: io_add_watch can't detect HUPs
ID:               41875
 User updated by:  sebastianmarconi at gmail dot com
 Reported By:      sebastianmarconi at gmail dot com
 Status:           Bogus
 Bug Type:         PHP-GTK related
 Operating System: Windows XP
 PHP Version:      5.2.3
 New Comment:

@auroraeosrose
Using Windows binary with Gtk+ 2.10 with GTK::IO_HUP | GTK::IO_IN the
script doesn't hang anymore but shows the content partially. For example
sometimes only the first lines, others only the last, and regularly
there's no output at all.

If you use the second argument of the watch :

function hupin($pipe, $condition)

Only IO_IN (integer 1) is fired, in few cases both IO_IN| IO_HUP
(integer 17). In previous version (2.0.0 alpha) IO_HUP worked
correctly.

This only is a toy example, but my main application uses this behavior
avoiding the 'busy-wait' effect in several long running tasks (wrapping
svn commands for example), and currently it's loosing functionality in
Windows.


Previous Comments:
------------------------------------------------------------------------

[2007-07-18 20:17:02] auroraeosrose@[...].net

You need to add code to detect HUP | IN - hup is never being called
separately so the second watch is never being fired

<?php

function out($pipe) {
       echo "STDOUT\n";
       echo stream_get_contents($pipe);
}

function hupin($pipe){
       echo "STDOUT\n";
       echo stream_get_contents($pipe);
       echo "HUP\n";
       Gtk::main_quit();
       return false;
}

function hup($pipe){
       echo "HUP\n";
       Gtk::main_quit();
       return false;
}

$pipes = null;
$descriptor = array(
       0 =>  array("pipe", "r"),  // stdin
       1 =>  array("pipe", "w"),  // stdout is a pipe that the child
will write to
       2 =>  array("pipe", "w")   // stderr
);
$cmd = 'dir';
$p = proc_open($cmd, $descriptor, $pipes);
Gtk::io_add_watch($pipes[1],GTK::IO_IN, 'out');
Gtk::io_add_watch($pipes[1],GTK::IO_HUP, 'hup');
Gtk::io_add_watch($pipes[1],GTK::IO_HUP | GTK::IO_IN, 'hupin');

Gtk::main();
echo "EXIT\n";
fclose($pipes[0]);
fclose($pipes[1]);
fclose($pipes[2]);
?> 



------------------------------------------------------------------------

[2007-07-18 19:02:55] bob at kateos dot org

works as expected on Linux.

------------------------------------------------------------------------

[2007-07-02 19:04:10] sebastianmarconi at gmail dot com

Description:
------------
It seems that Gtk::io_add_watch
can't detect HUP conditions using
beta Windows binary with Gtk+ 2.10.

In some cases the only workaround that I've found is to look the
process status info [1] in the STDOUT callback (sometimes it sends IO_IN
signals constantly), but randomly losses some information.


[1]
<?php

$status = proc_get_status($proc_id);
if (! $status['running']) {
	$this-> io_hup($pipe);
}	

?> 

Reproduce code:
---------------
<?php

function out($pipe) {
       echo "STDOUT\n";
       echo stream_get_contents($pipe);
}

function hup($pipe){
       echo "HUP\n";
       Gtk::main_quit();
       return false;
}


$pipes = null;
$descriptor = array(
       0 =>  array("pipe", "r"),  // stdin
       1 =>  array("pipe", "w"),  // stdout is a pipe that the child
will write to
       2 =>  array("pipe", "w")   // stderr
);
$cmd = 'dir';
$p = proc_open($cmd, $descriptor, $pipes);
Gtk::io_add_watch($pipes[1],Gtk::IO_IN, 'out');
Gtk::io_add_watch($pipes[1],Gtk::IO_HUP, 'hup');

Gtk::main();
echo "EXIT\n";
fclose($pipes[0]);
fclose($pipes[1]);
fclose($pipes[2]);

?> 

Expected result:
----------------
STDOUT
[Dir contents]
HUP
EXIT

Actual result:
--------------
STDOUT
[The script hangs]


------------------------------------------------------------------------


-- 
Edit this bug report at http://bugs.php.net/?id=41875&edit=1

-- 
PHP-GTK Development Mailing List (http://gtk.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php
Thread:
Sebastianmarconi At Gmail Dot Com
Sebastianmarconi At Gmail Dot Com
auroraeosrose
Bob At Kateos Dot Org

Privacy Policy | Email Opt-out | Feedback | Syndication
© 2004 ActiveState, a division of Sophos All rights reserved