Satoshi Nakagawa
snaka****@infot*****
Sat Jul 21 23:37:22 JST 2007
No problem :) Have a good trip. -- Satoshi Nakagawa On 2007/07/21, at 20:32, Laurent Sansonetti wrote: > Cool, this explains why the problem didn't occur on my other box, > which runs 1.8.6. > > Thanks a lot for the detective work! > > Laurent > > On Jul 21, 2007, at 3:59 AM, Satoshi Nakagawa wrote: > >> 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