[#9382] the sign of a number is omitted when squaring it. -2**2 vs (-2)**2 — <noreply@...>

Bugs item #6468, was opened at 2006-11-03 17:25

9 messages 2006/11/03

[#9385] merge YARV into Ruby — SASADA Koichi <ko1@...>

Hi,

42 messages 2006/11/04
[#9405] Re: merge YARV into Ruby — "Kirill Shutemov" <k.shutemov@...> 2006/11/06

On 11/4/06, SASADA Koichi <ko1@atdot.net> wrote:

[#9406] Re: merge YARV into Ruby — Sylvain Joyeux <sylvain.joyeux@...4x.org> 2006/11/06

On Monday 06 November 2006 16:01, Kirill Shutemov wrote:

[#9417] Re: merge YARV into Ruby — Sean Russell <ser@...> 2006/11/06

On Monday 06 November 2006 10:15, Sylvain Joyeux wrote:

[#9428] Re: merge YARV into Ruby — "Kirill Shutemov" <k.shutemov@...> 2006/11/06

On 11/6/06, Sean Russell <ser@germane-software.com> wrote:

[#9402] fast mutexes for 1.8? — MenTaLguY <mental@...>

Many people have been using Thread.critical for locking because Ruby

24 messages 2006/11/06

[#9450] Bikeshed: No more Symbol < String? — Kornelius Kalnbach <murphy@...>

Hi ruby-core!

21 messages 2006/11/07
[#9452] Re: Bikeshed: No more Symbol < String? — Yukihiro Matsumoto <matz@...> 2006/11/07

Hi,

[#9493] Future Plans for Ruby 1.8 Series — URABE Shyouhei <shyouhei@...>

This week Japanese rubyists were talking about the future of ruby_1_8

13 messages 2006/11/09

[#9515] External entropy pool for random number generator — "Kirill Shutemov" <k.shutemov@...>

In the attachment patch which allow to use external entropy pool for

13 messages 2006/11/11
[#9522] Re: External entropy pool for random number generator — "Nobuyoshi Nakada" <nobu@...> 2006/11/13

Hi,

[#9554] Ruby 1.[89].\d+ and beyond. — Hugh Sasse <hgs@...>

I've been thinking about how version numbers are restricting what we can do.

30 messages 2006/11/16
[#9561] Re: Ruby 1.[89].\d+ and beyond. — Eric Hodel <drbrain@...7.net> 2006/11/16

[#9563] Re: Ruby 1.[89].\d+ and beyond. — Hugh Sasse <hgs@...> 2006/11/16

On Fri, 17 Nov 2006, Eric Hodel wrote:

[#9564] Re: Ruby 1.[89].\d+ and beyond. — Eric Hodel <drbrain@...7.net> 2006/11/16

On Nov 16, 2006, at 12:02 PM, Hugh Sasse wrote:

[#9571] Re: Ruby 1.[89].\d+ and beyond. — "Robert Dober" <robert.dober@...> 2006/11/19

On 11/16/06, Eric Hodel <drbrain@segment7.net> wrote:

[#9604] #ancestors never includes the singleton class (inconsistent) — <noreply@...>

Bugs item #6820, was opened at 2006-11-22 08:49

12 messages 2006/11/22
[#9618] Re: [ ruby-Bugs-6820 ] #ancestors never includes the singleton class (inconsistent) — Yukihiro Matsumoto <matz@...> 2006/11/25

Hi,

[#9629] Re: [ ruby-Bugs-6820 ] #ancestors never includes the singleton class (inconsistent) — Sylvain Joyeux <sylvain.joyeux@...4x.org> 2006/11/27

> It is supposed to. Singleton classes (or eigenclasses, if you want to

fatal flaw in popen4 on windows? [WAS] Re: Nonblocking IO read

From: ara.t.howard@...
Date: 2006-11-01 19:19:18 UTC
List: ruby-core #9369
On Thu, 2 Nov 2006, Robert Klemme wrote:

> Tom Pollard wrote:
>> Anyway, you would only need nonblocking IO if you wanted to read bits of 
>> the stderr stream before the command exited, but that doesn't sound like 
>> what you're want.
>
> Actually this is not correct: if there is a lot written to stderr then you
> need to read that concurrently.  If you do not do that then the process will
> block on some stderr write operation that fills up the pipe and you get a
> deadlock because your code waits for process termination.

not only is that true but, afaik, it's why popen4 cannot even work on windows!
this program will eventually hang on either windows or unix


     harp:~ > cat a.rb
     require 'rubygems'
     require 'popen4'

     n = (ARGV.shift || 4242).to_i
     ruby = ARGV.shift || 'ruby'

     system "ruby -e 42" or abort "ruby not in your path!"

     STDOUT.sync = STDERR.sync = true

     program = <<-program
       #{ n }.times do
         t = Time.now.to_f
         STDOUT.puts t
         STDERR.puts t
       end
     program


     POpen4.popen4(ruby) do |stdout, stderr, stdin, pid|
       STDOUT.puts pid

       stdin.puts program
       stdin.close

       Thread.new{ stdout.each{|line| STDOUT.puts line} }
       #
       # uncomment and it won't hang!!!
       #
       #Thread.new{ stderr.each{|line| STDERR.puts line} }
     end

     puts 'done'



however, on windows it will always hang - even if the line above is
uncommented.  this is because if one popen4s a process it's __essential__, as
robert correctly points out, to continually consume any stdout or stderr
produced - otherwise the program will eventually get stuck in EPIPE and you'll
be waiting for this stuck program.

and here's the rub: you cannot reliably consume both stdout and stderr under
windows using threads or, afaik, nonblocking io.  perhaps the new nonblock_*
methods could help with this?  it'd no doubt be a major reworking...

*** i'm really hoping someone will chime in here and prove me wrong ***

for reference i'm including the code for my open4 lib's spawn method: which
illustrates the logical concept of what must be done to avoid a subprocess
blocked writing to it's parent's pipes...


#
# for complete code see
# http://codeforpeople.com/lib/ruby/open4/open4-0.9.1/lib/open4.rb
# http://rubyforge.org/frs/?group_id=1024&release_id=7556
#

   def spawn arg, *argv 
#--{{{
     argv.unshift(arg)
     opts = ((argv.size > 1 and Hash === argv.last) ? argv.pop : {})
     argv.flatten!
     cmd = argv.join(' ')

     getopt = getopts opts

     ignore_exit_failure = getopt[ 'ignore_exit_failure', getopt['quiet', false] ]
     ignore_exec_failure = getopt[ 'ignore_exec_failure', !getopt['raise', true] ]
     exitstatus = getopt[ %w( exitstatus exit_status status ) ]
     stdin = getopt[ %w( stdin in i 0 ) << 0 ]
     stdout = getopt[ %w( stdout out o 1 ) << 1 ]
     stderr = getopt[ %w( stderr err e 2 ) << 2 ]
     pid = getopt[ 'pid' ]
     timeout = getopt[ %w( timeout spawn_timeout ) ]
     stdin_timeout = getopt[ %w( stdin_timeout ) ]
     stdout_timeout = getopt[ %w( stdout_timeout io_timeout ) ]
     stderr_timeout = getopt[ %w( stderr_timeout ) ]
     status = getopt[ %w( status ) ]
     cwd = getopt[ %w( cwd dir ), Dir.pwd ]

     exitstatus =
       case exitstatus
         when TrueClass, FalseClass
           ignore_exit_failure = true if exitstatus
           [0]
         else
           [*(exitstatus || 0)].map{|i| Integer i}
       end

     stdin ||= '' if stdin_timeout
     stdout ||= '' if stdout_timeout
     stderr ||= '' if stderr_timeout

     started = false

     status =
       begin
         Dir.chdir(cwd) do
           Timeout::timeout(timeout) do
             popen4(*argv) do |c, i, o, e|
               started = true

               %w( replace pid= << push update ).each do |msg|
                 break(pid.send(msg, c)) if pid.respond_to? msg
               end

#
# this is the critical bit!!!
#

               te = ThreadEnsemble.new c

               te.add_thread(i, stdin) do |i, stdin|
                 relay stdin, i, stdin_timeout
                 i.close rescue nil
               end

               te.add_thread(o, stdout) do |o, stdout|
                 relay o, stdout, stdout_timeout
               end

               te.add_thread(e, stderr) do |o, stderr|
                 relay e, stderr, stderr_timeout
               end

               te.run
             end
           end
         end
       rescue
         raise unless(not started and ignore_exec_failure)
       end

     raise SpawnError.new(cmd, status) unless
       (ignore_exit_failure or (status.nil? and ignore_exec_failure) or exitstatus.include?(status.exitstatus))

     status
#--}}}
   end


kind regards.

-a
-- 
my religion is very simple.  my religion is kindness. -- the dalai lama

-a
-- 
my religion is very simple.  my religion is kindness. -- the dalai lama

In This Thread

Prev Next