#41875 [Bgs]: io_add_watch can't detect HUPs

From: Date: Thu, 19 Jul 2007 16:39:41 +0000
Subject: #41875 [Bgs]: io_add_watch can't detect HUPs
References: 1  Groups: php.gtk.dev 
Request: Send a blank email to php-gtk-dev+get-3925@lists.php.net to get a copy of this message
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@php.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

« previous php.gtk.dev (#3925) next »