From: "Ara.T.Howard" Date: 2004-04-17T01:24:11+09:00 Subject: Re: What's "io/nonblock"? On Fri, 16 Apr 2004, Michael Granger wrote: > On Apr 16, 2004, at 7:15 AM, Gavin Sinclair wrote: > > > On Friday, April 16, 2004, 10:50:55 PM, Gavin wrote: > > > >> Ara's "session" package tries to require 'io/nonblock' and fails on my > >> machine. Google reveals nothing very instructive. Anyone know what > >> it is? > > > > [...] > > installing io/wait > > make[1]: Entering directory `/home/gavin/Projects/ruby18/ext/io/wait' > > make[1]: Nothing to be done for `install'. > > make[1]: Leaving directory `/home/gavin/Projects/ruby18/ext/io/wait' > > > > Problem, that. > > A problem, perhaps, but io/nonblock.rb is installed from > ext/io/wait/lib/, and is, as its name suggests, a plain Ruby file. It > doesn't appear to require io/wait, either, so you should be okay with > just installing it by itself to get 'session' working. would do - but __i__ require io/wait as well. the truth is i currently don't really need both: my original design used nonblock, but this is broken in threads, the lastest uses IO.ready?, which you get from io/wait: from the source # this is the desired call - but threads block on it! #iodat[:io].nonblock{ buf = iodat[:io].read } # 2.1.5 #sleep(0.042) and Thread.pass until iodat[:io].ready? #buf << iodat[:io].getc while iodat[:io].ready? # 2.1.6 # decided to go ahead and read lines since # - loop only terminates when cmd_end_pat has been found and this # must be newline terminated # - although this will block mid-line in the case of parital lines we # know that, eventually, a newline will appear and this delay is # acceptable so we can make larger (line buffered) reads instead of # character ones. eventually i'd like to use io.nonblock{} to read # 'as much as is there' but this does not play well with threads at the # moment buf << iodat[:io].gets while iodat[:io].ready? the semantics i'd like to have are 'read as much data as is possible, even a single character, but don't block on the read'. this is what iodat[:io].nonblock{ buf = iodat[:io].read } should do. but in a thread it blocks. there was a few postings on this 2 months ago by me, nobu i think, and tanaka akira if you feel like searching... in any case = you could acutally commnet out the 'require "io/nonblock"' and it would be fine. but i hope to use this in future versions... weird that you were lacking it - my old 18 seems to have it... oh well. cheers. -a -- =============================================================================== | EMAIL :: Ara [dot] T [dot] Howard [at] noaa [dot] gov | PHONE :: 303.497.6469 | ADDRESS :: E/GC2 325 Broadway, Boulder, CO 80305-3328 | URL :: http://www.ngdc.noaa.gov/stp/ | TRY :: for l in ruby perl;do $l -e "print \"\x3a\x2d\x29\x0a\"";done ===============================================================================