Changeset 159
- Timestamp:
- 05/30/06 05:21:58 (2 years ago)
- Files:
-
- experiments/machine/ChangeLog (added)
- experiments/machine/Credits (added)
- experiments/machine/docs (added)
- experiments/machine/docs/netstrings.txt (added)
- experiments/machine/lib/machine/eio.rb (modified) (2 diffs)
- experiments/machine/lib/machine/event.rb (modified) (3 diffs)
- experiments/machine/lib/machine/protocol.rb (added)
- experiments/machine/lib/machine/protocols (added)
- experiments/machine/lib/machine/protocols/line.rb (added)
- experiments/machine/lib/machine/protocols/netstring.rb (added)
- experiments/machine/lib/machine.rb (modified) (1 diff)
- experiments/machine/lib/machine/router.rb (modified) (3 diffs)
- experiments/machine/lib/machine/signal.rb (modified) (2 diffs)
- experiments/machine/lib/machine/timeout.rb (modified) (1 diff)
- experiments/machine/test/eio_test.rb (modified) (2 diffs)
- experiments/machine/test/event_test.rb (modified) (1 diff)
- experiments/machine/test/netstring_test.rb (added)
- experiments/machine/test/pro.rb (deleted)
- experiments/machine/test/router_test.rb (modified) (2 diffs)
- experiments/machine/test/signal_test.rb (modified) (1 diff)
- experiments/machine/test/timeout_test.rb (modified) (3 diffs)
- experiments/machine/TODO (added)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
experiments/machine/lib/machine/eio.rb
r152 r159 59 59 # 60 60 def initialize io = nil 61 super() # Have to call super first or add_handler fails...62 63 61 # Set the socket nonblocking. The new Ruby will actually nonblocking APIs. 64 62 m = io.fcntl(Fcntl::F_GETFL, 0) … … 205 203 # 206 204 def initialize *args 207 super208 205 @pending = true 209 206 end experiments/machine/lib/machine/event.rb
r158 r159 1 # This way of auto-initializing a module was taken from a ruby-talk post by 2 # Florian Gross. He's the man. 3 1 4 module Machine 2 require ' ostruct'5 require 'thread' 3 6 4 7 class Event … … 15 18 include Base 16 19 17 def initialize(*args, &block) 20 # Wrap the including classes initialize method so we are automatically 21 # initialized without the includer having to call super. 22 def self.included(other) 23 install_initialize = lambda do 24 other.class_eval do 25 alias :old_initialize :initialize 26 27 def initialize(*args, &block) 28 intercept_initialize unless @intercept_initialized 29 old_initialize(*args, &block) 30 end 31 end 32 end 33 34 class << other; self; end.class_eval do 35 alias :old_method_added :method_added 36 37 ignore = false 38 define_method(:method_added) do |name| 39 return if ignore 40 41 case name 42 when :initialize then 43 Thread.exclusive do 44 ignore = true 45 install_initialize.call 46 ignore = false 47 end 48 else 49 old_method_added(name) 50 end 51 end 52 end 53 54 install_initialize.call 55 super 56 end 57 58 # Called before the initialize method of the including class. 59 def intercept_initialize 60 @intercept_initialized = true 18 61 @handlers = Hash.new do |hash, key| 19 62 hash[key] = Hash.new {|h,k| h[k] = []} … … 23 66 24 67 Reactor.instance.add_dispatcher self 68 end 25 69 26 super 70 unless respond_to? :initialize 71 def initialize 72 end 27 73 end 28 74 experiments/machine/lib/machine.rb
r156 r159 31 31 require 'machine/signal' 32 32 require 'machine/router' 33 require 'machine/protocol' 33 34 end experiments/machine/lib/machine/router.rb
r155 r159 12 12 13 13 @@reactor_signal = Socket::socketpair( Socket::AF_UNIX, Socket::SOCK_STREAM, 0) 14 EventableIO.new(@@reactor_signal[1])14 #EventableIO.new(@@reactor_signal[1]) 15 15 @@reactor_signalled = false 16 17 16 18 17 class << self 19 18 def route_events 20 $stderr.write"R"19 @@log.debug "R" 21 20 @@reactor_signalled = false 22 21 until @@inbound_q.empty? … … 44 43 45 44 def initialize args = [] 46 # As always, must call super to pick up the initialization in EventDispatcher47 super()48 45 args = [args] unless args.respond_to?(:each) 49 46 args.each {|arg| subscribe arg } … … 62 59 module Machine 63 60 module EventPublisher 64 65 def initialize66 super()67 end68 61 69 62 def publish_event evt experiments/machine/lib/machine/signal.rb
r144 r159 1 1 module Machine 2 class Signal ler2 class SignalDispatcher 3 3 include Base 4 4 include EventDispatcher … … 21 21 22 22 def initialize(sig, &block) 23 super()24 25 23 @sig= sig 26 24 experiments/machine/lib/machine/timeout.rb
r146 r159 36 36 37 37 def initialize(delay, periodic = false, &block) 38 super() # Have to call super first or add_handler fails...39 38 @delay = delay 40 39 @periodic = periodic experiments/machine/test/eio_test.rb
r143 r159 3 3 $:.unshift(File.dirname(__FILE__) + '/../lib') 4 4 5 require 'test/unit' 6 require 'machine' 7 require 'socket' 5 if __FILE__ == $0 6 7 require 'test/unit' 8 require 'machine' 9 require 'socket' 8 10 9 11 10 class EioTests < Test::Unit::TestCase11 include Machine12 class EioTests < Test::Unit::TestCase 13 include Machine 12 14 13 def setup14 #Reactor.instance.quiet15 # Have a thread going, because it messes up Ruby's io.sysread function16 Thread.new {sleep 1000}17 end15 def setup 16 #Reactor.instance.quiet 17 # Have a thread going, because it messes up Ruby's io.sysread function 18 Thread.new {sleep 1000} 19 end 18 20 19 def teardown20 end21 def teardown 22 end 21 23 22 def test_eio24 def test_eio 23 25 =begin 24 26 sin = Socket::pack_sockaddr_in(25, "relay.spheriq.net") … … 47 49 =end 48 50 49 #sd = Socket.new( Socket::AF_INET, Socket::SOCK_STREAM, 0)50 #sockaddr = Socket.pack_sockaddr_in( 8901, "127.0.0.1" )51 #sd.bind sockaddr52 #sd.listen( 100 )51 #sd = Socket.new( Socket::AF_INET, Socket::SOCK_STREAM, 0) 52 #sockaddr = Socket.pack_sockaddr_in( 8901, "127.0.0.1" ) 53 #sd.bind sockaddr 54 #sd.listen( 100 ) 53 55 54 File.unlink("./a.chain") 55 sd = Socket.new( Socket::AF_UNIX, Socket::SOCK_STREAM, 0) 56 sockaddr = Socket.pack_sockaddr_un( "./a.chain" ) 57 sd.bind sockaddr 58 sd.listen( 100 ) 59 eio = TcpServerEventableIO.new(sd) {|me| 60 me.add_handler(:accept) {|evt| 61 eio = EventableIO.new(evt.data) {|me| 62 me.add_handler(:read) {|evt| 63 me.send_data "<<<#{evt.data.chomp}>>>\n" 56 File.unlink("./a.chain") 57 sd = Socket.new( Socket::AF_UNIX, Socket::SOCK_STREAM, 0) 58 sockaddr = Socket.pack_sockaddr_un( "./a.chain" ) 59 sd.bind sockaddr 60 sd.listen( 100 ) 61 eio = TcpServerEventableIO.new(sd) {|me| 62 me.add_handler(:accept) {|evt| 63 eio = EventableIO.new(evt.data) {|me| 64 me.add_handler(:read) {|evt| 65 me.send_data "<<<#{evt.data.chomp}>>>\n" 66 } 64 67 } 65 68 } 66 69 } 67 } 68 Reactor.instance.run 70 Reactor.instance.run 69 71 70 assert_equal( 1,2) 72 assert_equal( 1,2) 73 end 74 71 75 end 72 73 76 end 74 experiments/machine/test/event_test.rb
r137 r159 19 19 class TestDispatcher 20 20 include Machine::EventDispatcher 21 22 def initialize 23 end 21 24 end 22 25 experiments/machine/test/router_test.rb
r157 r159 2 2 # THIS IS COPYRIGHTED SOFTWARE. 3 3 4 $:.unshift "../lib"4 $:.unshift(File.dirname(__FILE__) + '/../lib') 5 5 6 require 'test/unit' 7 require 'machine' 8 include Machine 6 if __FILE__ == $0 7 8 require 'test/unit' 9 require 'machine' 10 include Machine 9 11 10 12 11 class RouterTests < Test::Unit::TestCase12 include Machine13 class RouterTests < Test::Unit::TestCase 14 include Machine 13 15 14 def setup15 #Reactor.instance.quiet16 # Have a thread going, because it messes up Ruby's io.sysread function17 Thread.new {sleep 1000}18 end16 def setup 17 Reactor.instance.quiet 18 # Have a thread going, because it messes up Ruby's io.sysread function 19 Thread.new {sleep 1000} 20 end 19 21 20 def teardown21 end22 def teardown 23 end 22 24 23 class Sender 24 include EventDispatcher 25 include EventPublisher 26 def initialize 27 super() 25 class Sender 26 include EventDispatcher 27 include EventPublisher 28 def initialize 29 super() 30 end 28 31 end 29 end30 32 31 def test_router32 Reactor.run {33 10.times {33 def test_router 34 Reactor.run { 35 10.times { 34 36 er = EventSubscriber.new(:hit_me) 35 37 er.add_handler(:hit_me) {|evt| … … 41 43 s = Sender.new 42 44 s.add_handler(:hit_me_reply) {|evt| 43 puts "Received reply: #{evt.data}"45 #puts "Received reply: #{evt.data}" 44 46 } 45 47 s.publish_event( DataEvent.new(:hit_me, ix) ) 46 48 } 47 } 49 } 50 51 assert_equal(1,2) 52 end 48 53 49 54 50 51 52 53 assert_equal(1,2)54 55 end 55 56 56 57 57 end 58 59 experiments/machine/test/signal_test.rb
r144 r159 12 12 13 13 def teardown 14 Signal ler.clear14 SignalDispatcher.clear 15 15 end 16 16 17 17 def test_basic 18 18 @called = 0 19 sig = Signal ler.new(Signaller::USR1) { @called += 1 }19 sig = SignalDispatcher.new(SignalDispatcher::USR1) { @called += 1 } 20 20 sig.add_signal_handler(self, :another_handler) 21 21 22 Process.kill(Signal ler::USR1, Process.pid)22 Process.kill(SignalDispatcher::USR1, Process.pid) 23 23 24 24 @reactor.iterate experiments/machine/test/timeout_test.rb
r144 r159 9 9 def setup 10 10 @reactor = Reactor.instance 11 @reactor. verbose11 @reactor.quiet 12 12 end 13 13 … … 19 19 # Regular 20 20 t1 = 0 21 Timeout.new(0) { puts "first";t1 += 1 }21 Timeout.new(0) { t1 += 1 } 22 22 23 23 # Periodic 24 24 t2 = 0 25 Timeout.new(1, true) { puts "second";t2 += 1 }25 Timeout.new(1, true) { t2 += 1 } 26 26 27 27 # Method based … … 32 32 @reactor.run 33 33 assert_equal 1, t1, "Regular block timer did not fire." 34 assert_equal 3, t2, "Periodic block timer did not fire enough."34 assert_equal 3, t2, "Periodic block timer did not fire correctly." 35 35 assert_equal 1, @t3, "Method based timer did not fire." 36 36 end 37 37 38 38 def stop_reactor(event) 39 puts "third..."40 39 @t3 += 1 41 40 @reactor.stop
