From 3f73cd3655cf47e3c9acdf06bd0f1bc989f41505 Mon Sep 17 00:00:00 2001 From: Tony Arcieri Date: Thu, 7 Jan 2010 14:52:02 -0700 Subject: Monkeypatch in JRuby support --- lib/systemu.rb | 44 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 44 insertions(+) diff --git a/lib/systemu.rb b/lib/systemu.rb index a29087c..9dbddfc 100644 --- a/lib/systemu.rb +++ b/lib/systemu.rb @@ -247,6 +247,50 @@ class SystemUniversal end end +# some monkeypatching for JRuby +if defined? JRUBY_VERSION + require 'jruby' + import org.jruby.RubyProcess + + class SystemUniversal + def systemu + split_argv = JRuby::PathHelper.smart_split_command @argv + process = java.lang.Runtime.runtime.exec split_argv.to_java(:string) + + stdout, stderr = [process.input_stream, process.error_stream].map do |stream| + reader = StreamReader.new(stream) + reader.run + reader.result + end + + exit_code = process.wait_for + [RubyProcess::RubyStatus.new_process_status(JRuby.runtime, exit_code), stdout, stderr] + end + + class StreamReader + def initialize(stream) + @reader = java.io.BufferedReader.new java.io.InputStreamReader.new(stream) + @mutex = Mutex.new + @data = "" + end + + def run + Thread.new do + @mutex.synchronize do + while line = @reader.read_line; @data << line << "\n"; end + end + end + end + + def result + @mutex.synchronize { @data } + end + end + end +end + + + SystemU = SystemUniversal unless defined? SystemU Systemu = SystemUniversal unless defined? Systemu -- cgit v1.2.1 From 2809f508ee2d616cb36baca19ebffd4ee87f5291 Mon Sep 17 00:00:00 2001 From: Tony Arcieri Date: Thu, 7 Jan 2010 15:02:24 -0700 Subject: A bit less retarded usage of threads --- lib/systemu.rb | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/lib/systemu.rb b/lib/systemu.rb index 9dbddfc..d5a2a61 100644 --- a/lib/systemu.rb +++ b/lib/systemu.rb @@ -258,32 +258,32 @@ if defined? JRUBY_VERSION process = java.lang.Runtime.runtime.exec split_argv.to_java(:string) stdout, stderr = [process.input_stream, process.error_stream].map do |stream| - reader = StreamReader.new(stream) - reader.run - reader.result + StreamReader.new(stream) end exit_code = process.wait_for - [RubyProcess::RubyStatus.new_process_status(JRuby.runtime, exit_code), stdout, stderr] + [ + RubyProcess::RubyStatus.new_process_status(JRuby.runtime, exit_code), + stdout.join, + stderr.join + ] end class StreamReader def initialize(stream) - @reader = java.io.BufferedReader.new java.io.InputStreamReader.new(stream) - @mutex = Mutex.new @data = "" - end - - def run - Thread.new do - @mutex.synchronize do - while line = @reader.read_line; @data << line << "\n"; end + @thread = Thread.new do + reader = java.io.BufferedReader.new java.io.InputStreamReader.new(stream) + + while line = reader.read_line + @data << line << "\n" end end end - def result - @mutex.synchronize { @data } + def join + @thread.join + @data end end end -- cgit v1.2.1