Changeset 741

Show
Ignore:
Timestamp:
07/22/08 08:25:59 (3 weeks ago)
Author:
raggi
Message:

Merge forward from 712 to HEAD from trunk

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • branches/raggi/lib/eventmachine.rb

    r734 r741  
    220220 
    221221                if reactor_running? 
    222                         (b = blk || block) and next_tick(b) 
     222                        (b = blk || block) and b.call # next_tick(b) 
    223223                else 
    224224                        @conns = {} 
     
    253253            } 
    254254            run(&pr) 
     255    end 
     256 
     257    # fork_reactor forks a new process and calls EM#run inside of it, passing your block. 
     258    #-- 
     259    # This implementation is subject to change, especially if we clean up the relationship 
     260    # of EM#run to @reactor_running. 
     261    # Original patch by Aman Gupta. 
     262    # 
     263    def EventMachine::fork_reactor &block 
     264            Kernel.fork do 
     265                    if self.reactor_running? 
     266                            self.stop_event_loop 
     267                            self.release_machine 
     268                            self.instance_variable_set( '@reactor_running', false ) 
     269                    end 
     270                    self.run block 
     271            end 
    255272    end 
    256273 
     
    540557    s = start_unix_server filename 
    541558    @acceptors[s] = [klass,args,block] 
     559    s 
    542560  end 
    543561 
  • branches/raggi/lib/protocols/linetext2.rb

    r668 r741  
    8484                                                @lt2_textpos += will_take 
    8585                                                if @lt2_textpos >= @lt2_textsize 
     86                                                        # Reset line mode (the default behavior) BEFORE calling the 
     87                                                        # receive_binary_data. This makes it possible for user code 
     88                                                        # to call set_text_mode, enabling chains of text blocks 
     89                                                        # (which can possibly be of different sizes). 
     90                                                        set_line_mode 
    8691                                                        receive_binary_data @lt2_textbuffer.join 
    87                                                         set_line_mode 
     92                                                        receive_end_of_binary_data 
    8893                                                end 
    8994 
     
    140145                                # no-op 
    141146                        end 
     147 
     148                        # Stub. Should be subclassed by user code. 
     149                        # This is called when transitioning internally from text mode 
     150                        # back to line mode. Useful when client code doesn't want 
     151                        # to keep track of how much data it's received. 
     152                        def receive_end_of_binary_data 
     153                                # no-op 
     154                        end 
    142155                end 
    143156        end 
  • branches/raggi/lib/protocols/stomp.rb

    r668 r741  
    121121                                send_frame "SUBSCRIBE", {:destination=>dest, :ack=>(ack ? "client" : "auto")} 
    122122                        end 
     123                        def ack msgid 
     124                                send_frame "ACK", { :'message-id'=> msgid } 
     125                        end 
    123126 
    124127                end 
  • branches/raggi/Rakefile

    r728 r741  
    3535Dir.glob('tasks/*.rake').each { |r| Rake.application.add_import r } 
    3636 
    37 # e.g. rake EVENTMACHINE_LIBRARY=java for forcing java build tasks as defaults! 
     37# e.g. rake EVENTMACHINE_LIBRARY=java for forcing java build tasks as defaults! 
    3838$eventmachine_library = :java if RUBY_PLATFORM =~ /java/ || ENV['EVENTMACHINE_LIBRARY'] == 'java' 
    3939$eventmachine_library = :pure_ruby if ENV['EVENTMACHINE_LIBRARY'] == 'pure_ruby' 
  • branches/raggi/tests/test_basic.rb

    r703 r741  
    153153  end 
    154154 
     155 
     156  #------------------------------------ 
     157  # 
     158  # TODO. This is an unfinished bug fix. 
     159  # This case was originally reported by Dan Aquino. If you throw a Ruby exception 
     160  # in a post_init handler, it gets rethrown as a confusing reactor exception. 
     161  # The problem is in eventmachine.rb, which calls post_init within the private 
     162  # initialize method of the EM::Connection class. This happens in both the EM::connect 
     163  # method and in the code that responds to connection-accepted events. 
     164  # What happens is that we instantiate the new connection object, which calls 
     165  # initialize, and then after initialize returns, we stick the new connection object 
     166  # into EM's @conns hashtable. 
     167  # But the problem is that Connection::initialize calls #post_init before it returns, 
     168  # and this may be user-written code that may throw an uncaught Ruby exception. 
     169  # If that happens, the reactor will abort, and it will then try to run down open 
     170  # connections. Because @conns never got a chance to properly reflect the new connection 
     171  # (because initialize never returned), we throw a ConnectionNotBound error 
     172  # (eventmachine.rb line 1080). 
     173  # When the bug is fixed, activate this test case. 
     174  # 
     175 
     176  class PostInitError < EM::Connection 
     177          def post_init 
     178                  aaa bbb # should produce a Ruby exception 
     179          end 
     180  end 
     181  def test_post_init_error 
     182          assert_raise( NameError ) { 
     183                  EM.run { 
     184                        EM::Timer.new(1) {EM.stop} 
     185                        EM.start_server TestHost, TestPort 
     186                        EM.connect TestHost, TestPort, PostInitError 
     187                  } 
     188          } 
     189  end 
     190 
     191 
    155192end 
    156193 
    157  
  • branches/raggi/tests/test_ltp2.rb

    r668 r741  
    258258        end 
    259259 
     260 
     261 
     262        # Test an end-of-binary call. Arrange to receive binary data but don't bother counting it 
     263        # as it comes. Rely on getting receive_end_of_binary_data to signal the transition back to 
     264        # line mode. 
     265        # At the present time, this isn't strictly necessary with sized binary chunks because by 
     266        # definition we accumulate them and make exactly one call to receive_binary_data, but 
     267        # we may want to support a mode in the future that would break up large chunks into multiple 
     268        # calls. 
     269        class LazyBinary 
     270                include EM::Protocols::LineText2 
     271                attr_reader :data, :end 
     272                def initialize *args 
     273                        super 
     274                        @data = "" 
     275                        set_text_mode 1000 
     276                end 
     277                def receive_binary_data data 
     278                        # we expect to get all the data in one chunk, even in the byte-by-byte case, 
     279                        # because sized transfers by definition give us exactly one call to 
     280                        # #receive_binary_data. 
     281                        @data = data 
     282                end 
     283                def receive_end_of_binary_data 
     284                        @end = true 
     285                end 
     286        end 
     287        def test_receive_end_of_binary_data 
     288                testdata = "_" * 1000 
     289                a = LazyBinary.new 
     290                testdata.length.times {|i| a.receive_data( testdata[i...i+1] ) } 
     291                assert_equal( "_" * 1000, a.data ) 
     292                assert( a.end ) 
     293        end 
     294 
     295 
     296        # This tests a bug fix in which calling set_text_mode failed when called 
     297        # inside receive_binary_data. 
     298        # 
     299        class BinaryPair 
     300                include EM::Protocols::LineText2 
     301                attr_reader :sizes 
     302                def initialize *args 
     303                        super 
     304                        set_text_mode 1 
     305                        @sizes = [] 
     306                end 
     307                def receive_binary_data dt 
     308                        @sizes <<  dt.length 
     309                        set_text_mode( (dt.length == 1) ? 2 : 1 ) 
     310                end 
     311        end 
     312        def test_binary_pairs 
     313                test_data = "123" * 5 
     314                a = BinaryPair.new 
     315                a.receive_data test_data 
     316                assert_equal( [1,2,1,2,1,2,1,2,1,2], a.sizes ) 
     317        end 
     318 
    260319end 
    261320