Satoshi Nakagawa
snaka****@infot*****
Sat Jul 21 10:59:00 JST 2007
Hi. The problem seems a bug of ruby 1.8.2. I'm sorry for my insufficient testing. I cut the reproduce code into pure Ruby not using RubyCocoa: http://limechat.net/rubycocoa/threaded_socket_test.rb Then I tested it on ruby 1.8.2 and ruby 1.8.6: $ /usr/bin/ruby -v threaded_socket_test.rb ruby 1.8.2 (2004-12-25) [universal-darwin8.0] +++ start writing (stalls) $ ruby -v threaded_socket_test.rb ruby 1.8.6 (2007-03-13 patchlevel 0) [i686-darwin8.9.1] +++ start writing *** received (snip) *** received --- end writing *** received (continues normally) So I concluded it is a bug of ruby 1.8.2, not of RubyCocoa. Let's release 0.12.0. -- Satoshi Nakagawa On 2007/07/21, at 9:08, Satoshi Nakagawa wrote: > Hi. > > I found a problem, application stalls on thread context switches of Ruby. > It is reproducible on 0.11.1 and trunk. > > How to reproduce the problem: > > 1. Start a socket server. > 2. Connect to the server using Ruby's TCPSocket. > 3. The server accepts the request. > 4. Start a thread on the server, sending 256KB per 5 seconds to the client. > 5. The application stalls. (Rolling rainbow colored cursor forever) > > Reproduce code in Xcode project: > > http://limechat.net/rubycocoa/ThreadedSocketTest.zip > > In #4, if it sends 64KB per 5 seconds, there are no problem. > > This is the code around threaded writing from server to client. > > def write_loop > loop do > puts '+++ start writing' > @sc.write('a' * (1024 * 256)) > puts '--- end writing' > sleep 5 > end > end > > The log when it sends 256KB: > > +++ start writing > (stalls) > > The log when it sends 64KB: > > +++ start writing > --- end writing > *** received > *** received > (continues forever) > > So I noticed the application stops at: > > @sc.write('a' * (1024 * 256)) > > It seems to occur on thread context switches of Ruby. > Then, I added a logging code to RubyCocoa: > > Index: framework/src/objc/RBThreadSwitcher.m > =================================================================== > --- framework/src/objc/RBThreadSwitcher.m (revision 1928) > +++ framework/src/objc/RBThreadSwitcher.m (working copy) > @@ -44,6 +44,7 @@ > - (void) sched: (NSTimer*)a_timer > { > + NSLog(@"@@@ timer"); > CHECK_INTS; > if (!rb_thread_critical) rb_thread_schedule(); > } > > Then the log is (sends 256KB): > > +++ start writing > 2007-07-21 08:38:34.247 BridgeTest2[2990] @@@ timer > (stalls) > > It shows the application stalls after a thread context switch of Ruby. > > -- > Satoshi Nakagawa