I think this patch should fix the buffering problem.  Turns out C Ruby
doesn't tag an io stream as buffered until a *read* buffering operation
happens; I was tagging it for *write* as well.

Let me know if it works.

Evan

Thomas E Enebo wrote:
>   A simple hack which may or may not work is to remove the
> checkBuffered() call from sysread in IOHandlerNio.java.  If things
> work with that commented out then we can work from that.
> 
> -Tom
> 
> On Sun, 28 May 2006, Ola Bini defenestrated me:
> 
>> Hi.
>>
>> Now I'm trying to get remote gem installation to work, but immediatly
>> ran into an error, in a part which used to work before. Is this because
>> of the resent work on IO in general?
>>
>> Attempting local installation of 'rails'
>> Local gem file not found: rails*.gem
>> Attempting remote installation of 'rails'
>> Updating Gem source index for: http://gems.rubyforge.org
>> ERROR:  While executing gem ... (SystemCallError)
>>     Can't mix buffered and unbuffered IO.
>> ./lib/ruby/site_ruby/1.8/net/protocol.rb:133:in `sysread'
>> ./lib/ruby/site_ruby/1.8/net/protocol.rb:133:in `rbuf_fill'
>> ./lib/ruby/site_ruby/1.8/net/protocol.rb:116:in `timeout'
>> ./lib/ruby/site_ruby/1.8/timeout.rb:76:in `timeout'
>> ./lib/ruby/site_ruby/1.8/net/protocol.rb:134:in `rbuf_fill'
>> ./lib/ruby/site_ruby/1.8/net/protocol.rb:116:in `readuntil'
>> ./lib/ruby/site_ruby/1.8/net/protocol.rb:126:in `readline'
>> ./lib/ruby/site_ruby/1.8/net/http.rb:1988:in `read_status_line'
>> ./lib/ruby/site_ruby/1.8/net/http.rb:1977:in `read_new'
>> ./lib/ruby/site_ruby/1.8/net/http.rb:1046:in `request'
>> ./lib/ruby/site_ruby/1.8/net/http.rb:944:in `request_get'
>> ./lib/ruby/site_ruby/1.8/rubygems/open-uri.rb:560:in `proxy_open'
>> ./lib/ruby/site_ruby/1.8/rubygems/open-uri.rb:525:in `start'
>> ./lib/ruby/site_ruby/1.8/net/http.rb:440:in `start'
>> ./lib/ruby/site_ruby/1.8/rubygems/open-uri.rb:561:in `proxy_open'
>> ./lib/ruby/site_ruby/1.8/rubygems/open-uri.rb:525:in `direct_open'
>> ./lib/ruby/site_ruby/1.8/rubygems/open-uri.rb:169:in `open_loop'
>> ./lib/ruby/site_ruby/1.8/rubygems/open-uri.rb:134:in `catch'
>> ./lib/ruby/site_ruby/1.8/rubygems/open-uri.rb:172:in `open_loop'
>> ./lib/ruby/site_ruby/1.8/rubygems/open-uri.rb:134:in `open_uri'
>> ./lib/ruby/site_ruby/1.8/rubygems/open-uri.rb:424:in `open'
>> ./lib/ruby/site_ruby/1.8/rubygems/open-uri.rb:85:in `open'
>> ./lib/ruby/site_ruby/1.8/rubygems/remote_installer.rb:124:in
>> `open_uri_or_path'
>> ./lib/ruby/site_ruby/1.8/rubygems/remote_installer.rb:105:in `read_data'
>> ./lib/ruby/site_ruby/1.8/rubygems/remote_installer.rb:34:in `fetch_path'
>> ./lib/ruby/site_ruby/1.8/rubygems/remote_installer.rb:55:in `source_index'
>> ./lib/ruby/site_ruby/1.8/rubygems/remote_installer.rb:313:in `source_index'
>> ./lib/ruby/site_ruby/1.8/rubygems/remote_installer.rb:445:in `fetch_source'
>> ./lib/ruby/site_ruby/1.8/rubygems/remote_installer.rb:436:in
>> `source_index_hash'
>> ./lib/ruby/site_ruby/1.8/rubygems/remote_installer.rb:399:in `each'
>> ./lib/ruby/site_ruby/1.8/rubygems/remote_installer.rb:437:in
>> `source_index_hash'
>> ./lib/ruby/site_ruby/1.8/rubygems/remote_installer.rb:399:in `install'
>> ./lib/ruby/site_ruby/1.8/rubygems/gem_commands.rb:199:in `execute'
>> ./lib/ruby/site_ruby/1.8/rubygems/command.rb:49:in `each'
>> ./lib/ruby/site_ruby/1.8/rubygems/gem_commands.rb:230:in `execute'
>> ./lib/ruby/site_ruby/1.8/rubygems/command.rb:49:in `invoke'
>> ./lib/ruby/site_ruby/1.8/rubygems/cmd_manager.rb:94:in `process_args'
>> ./lib/ruby/site_ruby/1.8/rubygems/cmd_manager.rb:67:in `run'
>> ./lib/ruby/site_ruby/1.8/rubygems/gem_runner.rb:13:in `run'
>> bin\gem:17
>>
>>
>> The relevant part of protocol.rb just says
>> @io.sysread(1024)
>>
>> Any ideas, hacks, fixes or solutions to this?
>>
>> Regards
>>  Ola
>>
>>
>> -------------------------------------------------------
>> All the advantages of Linux Managed Hosting--Without the Cost and Risk!
>> Fully trained technicians. The highest number of Red Hat certifications in
>> the hosting industry. Fanatical Support. Click to learn more
>> http://sel.as-us.falkag.net/sel?cmd=lnk&kid=107521&bid=248729&dat=121642
>> _______________________________________________
>> Jruby-devel mailing list
>> [email protected]
>> https://lists.sourceforge.net/lists/listinfo/jruby-devel
> 
Index: src/org/jruby/util/IOHandlerNio.java
===================================================================
RCS file: /cvsroot/jruby/jruby/src/org/jruby/util/IOHandlerNio.java,v
retrieving revision 1.1
diff -u -r1.1 IOHandlerNio.java
--- src/org/jruby/util/IOHandlerNio.java        24 May 2006 01:34:04 -0000      
1.1
+++ src/org/jruby/util/IOHandlerNio.java        30 May 2006 14:59:06 -0000
@@ -77,6 +77,7 @@
             modes = new IOModes(runtime, mode);
         }
         fileno = RubyIO.getNewFileno();
+        outBuffer = ByteBuffer.allocate(BLOCK_SIZE);
     }
 
     public Channel getChannel() {
@@ -124,7 +125,8 @@
     
     public int syswrite(String string) throws BadDescriptorException, 
IOException {
         checkWritable();
-        checkBuffered();
+        outBuffer.flip();
+        flushOutBuffer();
        
         ByteBuffer buffer = ByteBuffer.wrap(RubyString.stringToBytes(string));
         while (buffer.hasRemaining()) {
@@ -160,7 +162,6 @@
         if (bufferedIO) {
             return;
         }
-        outBuffer = ByteBuffer.allocate(BLOCK_SIZE);
         inBuffer = ByteBuffer.allocate(BLOCK_SIZE);
         flushInBuffer();
         bufferedIO = true;
@@ -269,7 +270,6 @@
     }
 
     public int write(String string) throws IOException, BadDescriptorException 
{
-        setupBufferedIO();
         checkWritable();
 
         ByteBuffer buffer = ByteBuffer.wrap(RubyString.stringToBytes(string));
@@ -381,12 +381,12 @@
     }
 
     public void ungetc(int c) {
+        setupBufferedIO();
         ungotc = c;
     }
     
     public void putc(int c) throws IOException, BadDescriptorException {
         checkWritable();
-        setupBufferedIO();
 
         if (!outBuffer.hasRemaining()) {
             outBuffer.flip();
@@ -426,13 +426,12 @@
 
     /* buffering independent */
     public void close() throws IOException {
-        if (bufferedIO) {
-            /* flush output buffer before close */
-            if (outBuffer.position() > 0) {
-                outBuffer.flip();
-                flushOutBuffer();
-            }
-        }
+       /* flush output buffer before close */
+       if (outBuffer.position() > 0) {
+           outBuffer.flip();
+           flushOutBuffer();
+       }
+
         channel.close();
     }
     

Reply via email to