rev 0.2.2 → 0.2.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (59) hide show
  1. data/CHANGES +11 -0
  2. data/README +10 -3
  3. data/Rakefile +2 -2
  4. data/examples/echo_client.rb +35 -0
  5. data/examples/google.rb +8 -0
  6. data/examples/httpclient.rb +35 -0
  7. data/ext/http11_client/Makefile +149 -0
  8. data/ext/http11_client/http11_client.bundle +0 -0
  9. data/ext/http11_client/http11_client.o +0 -0
  10. data/ext/http11_client/http11_parser.o +0 -0
  11. data/ext/http11_client/mkmf.log +12 -0
  12. data/ext/libev/Changes +114 -1
  13. data/ext/libev/ev.c +212 -97
  14. data/ext/libev/ev.h +13 -7
  15. data/ext/libev/ev_epoll.c +44 -11
  16. data/ext/libev/ev_kqueue.c +2 -2
  17. data/ext/libev/ev_poll.c +3 -1
  18. data/ext/libev/ev_port.c +4 -4
  19. data/ext/libev/ev_select.c +58 -19
  20. data/ext/libev/ev_vars.h +5 -1
  21. data/ext/libev/ev_win32.c +32 -3
  22. data/ext/libev/ev_wrap.h +4 -0
  23. data/ext/libev/test_libev_win32.c +123 -0
  24. data/ext/libev/update_ev_wrap +0 -0
  25. data/ext/rev/Makefile +149 -0
  26. data/ext/rev/ev_wrap.h +8 -0
  27. data/ext/rev/extconf.rb +17 -0
  28. data/ext/rev/libev.c +8 -0
  29. data/ext/rev/libev.o +0 -0
  30. data/ext/rev/mkmf.log +221 -0
  31. data/ext/rev/rev.h +8 -2
  32. data/ext/rev/rev_buffer.c +2 -3
  33. data/ext/rev/rev_buffer.o +0 -0
  34. data/ext/rev/rev_ext.bundle +0 -0
  35. data/ext/rev/rev_ext.c +4 -3
  36. data/ext/rev/rev_ext.o +0 -0
  37. data/ext/rev/rev_io_watcher.c +1 -2
  38. data/ext/rev/rev_io_watcher.o +0 -0
  39. data/ext/rev/rev_loop.c +4 -4
  40. data/ext/rev/rev_loop.o +0 -0
  41. data/ext/rev/rev_ssl.o +0 -0
  42. data/ext/rev/rev_timer_watcher.c +1 -2
  43. data/ext/rev/rev_timer_watcher.o +0 -0
  44. data/ext/rev/rev_utils.c +14 -0
  45. data/ext/rev/rev_utils.o +0 -0
  46. data/ext/rev/rev_watcher.c +7 -6
  47. data/ext/rev/rev_watcher.o +0 -0
  48. data/lib/http11_client.bundle +0 -0
  49. data/lib/rev.rb +1 -1
  50. data/lib/rev/dns_resolver.rb +29 -9
  51. data/lib/rev/io.rb +6 -4
  52. data/lib/rev/listener.rb +5 -1
  53. data/lib/rev/loop.rb +8 -4
  54. data/lib/rev/server.rb +3 -2
  55. data/lib/rev/socket.rb +14 -5
  56. data/lib/rev_ext.bundle +0 -0
  57. data/lib/revem.rb +210 -0
  58. data/rev.gemspec +2 -2
  59. metadata +29 -3
Binary file
@@ -0,0 +1,210 @@
1
+ #--
2
+ # Copyright (C)2007 Tony Arcieri, Roger Pack
3
+ # You can redistribute this under the terms of the Ruby license
4
+ # See file LICENSE for details
5
+ #++
6
+
7
+ require File.dirname(__FILE__) + '/rev'
8
+
9
+ module EventMachine
10
+
11
+ class << self
12
+ # Start the Reactor loop
13
+ def run
14
+ yield if block_given?
15
+ Rev::Loop.default.run
16
+ end
17
+
18
+ # Stop the Reactor loop
19
+ def stop_event_loop
20
+ Rev::Loop.default.stop
21
+ end
22
+
23
+ class OneShotEMTimer < Rev::TimerWatcher
24
+ def setup(proc)
25
+ @proc = proc
26
+ end
27
+
28
+ def on_timer
29
+ @proc.call
30
+ end
31
+ end
32
+
33
+ # ltodo: use Rev's PeriodicTimer to wrap EM's two similar to it
34
+ # todo: close all connections on 'stop', I believe
35
+
36
+ def add_timer interval, proc = nil, &block
37
+ block ||= proc
38
+ t = OneShotEMTimer.new(interval, false) # non repeating
39
+ t.setup(block)
40
+ t.attach(Rev::Loop.default) # fire 'er off ltodo: do we keep track of these timers in memory?
41
+ t
42
+ end
43
+
44
+ def cancel_timer t
45
+ t.detach if t.attached? # guess there's a case where EM you can say 'cancel' but it's already fired? kind of odd but it happens
46
+ end
47
+
48
+ def set_comm_inactivity_timeout *args; end # TODO
49
+
50
+ # Make an outgoing connection
51
+ def connect(addr, port, handler = Connection, *args, &block)
52
+ block = args.pop if Proc === args[-1]
53
+
54
+ # make sure we're a 'real' class here
55
+ klass = if (handler and handler.is_a?(Class))
56
+ handler
57
+ else
58
+ Class.new( Connection ) {handler and include handler}
59
+ end
60
+
61
+ wrapped_child = CallsBackToEM.connect(addr, port, *args) # ltodo: args? what? they're used? also TODOC TODO FIX
62
+ conn = klass.new(wrapped_child) # ltodo [?] addr, port, *args)
63
+ wrapped_child.attach(Rev::Loop.default) # necessary
64
+ conn.heres_your_socket(wrapped_child)
65
+ wrapped_child.call_back_to_this(conn) # calls post_init for us
66
+ yield conn if block_given?
67
+ end
68
+
69
+ # Start a TCP server on the given address and port
70
+ def start_server(addr, port, handler = Connection, *args, &block)
71
+
72
+ # make sure we're a 'real' class here
73
+ klass = if (handler and handler.is_a?(Class))
74
+ handler
75
+ else
76
+ Class.new( Connection ) {handler and include handler}
77
+ end
78
+ server = Rev::TCPServer.new(addr, port, CallsBackToEM, *args) { |wrapped_child|
79
+ conn = klass.new(wrapped_child)
80
+ conn.heres_your_socket(wrapped_child) # ideally NOT have this :)
81
+ wrapped_child.call_back_to_this(conn)
82
+ block.call(conn) if block
83
+ }
84
+
85
+ server.attach(Rev::Loop.default)
86
+ end
87
+
88
+ def stop_server server
89
+ server.close
90
+ end
91
+
92
+ # Set the maximum number of descriptors available to this process
93
+ def set_descriptor_table_size(nfds)
94
+ Rev::Utils.maxfds = nfds
95
+ end
96
+
97
+ # Compatibility noop. Handled automatically by libev
98
+ def epoll; end
99
+
100
+ # Compatibility noop. Handled automatically by libev
101
+ def kqueue; end
102
+ end
103
+
104
+ class CallsBackToEM < Rev::TCPSocket
105
+ class ConnectTimer < Rev::TimerWatcher
106
+ attr_accessor :parent
107
+ def on_timer
108
+ @parent.connection_has_timed_out
109
+ end
110
+
111
+ end
112
+
113
+ def call_back_to_this parent
114
+ @call_back_to_this = parent
115
+ parent.post_init
116
+ end
117
+
118
+ def on_connect
119
+ # @connection_timer.detach if @connection_timer # won't need that anymore :) -- with server connecteds we don't have it, anyway
120
+ @call_back_to_this.connection_completed if @call_back_to_this # TODO should server accepted's call this? They don't currently [and can't, since on_connect gets called basically in the initializer--needs some code love for that to happen :)
121
+ end
122
+
123
+ def connection_has_timed_out
124
+ return if closed?
125
+ close unless closed? # wonder if this works when you're within a half-connected phase. I think it does. What about TCP state?
126
+ @call_back_to_this.unbind
127
+ end
128
+
129
+ def on_write_complete; close if @should_close_after_writing; end
130
+
131
+ def should_close_after_writing
132
+ @should_close_after_writing = true;
133
+ end
134
+
135
+ def on_close
136
+ @call_back_to_this.unbind # about the same ltodo check if they ARE the same here
137
+ end
138
+
139
+ def on_resolve_failed
140
+ fail
141
+ end
142
+
143
+ def on_connect_failed
144
+ fail
145
+ end
146
+
147
+ def on_read(data)
148
+ @call_back_to_this.receive_data data
149
+ end
150
+
151
+ def fail
152
+ #@connection_timer.detch if @connection_timer
153
+ @call_back_to_this.unbind
154
+ end
155
+
156
+ def self.connect *args
157
+ a = super *args
158
+ # the connect timer currently kills TCPServer classes. I'm not sure why.
159
+ #@connection_timer = ConnectTimer.new(14) # needs to be at least higher than 12 :)
160
+ #@connection_timer.parent = a
161
+ #@connection_timer.attach(Rev::Loop.default)
162
+ a
163
+ end
164
+
165
+ end
166
+
167
+ class Connection
168
+ def self.new *args
169
+ allocate#.instance_eval do
170
+ # initialize *args
171
+ #end
172
+ end
173
+ # we will need to call 'their functions' appropriately -- the commented out ones, here
174
+ #
175
+ # Callback fired when connection is created
176
+ def post_init; end # I thought we were 'overriding' EM's existing methods, here. Huh? Why do we have to define these then?
177
+
178
+ # Callback fired when connection is closed
179
+ def unbind; end
180
+
181
+ # Callback fired when data is received
182
+ # def receive_data(data); end
183
+ def heres_your_socket instantiated_rev_socket
184
+ instantiated_rev_socket.call_back_to_this self
185
+ @wrapped_rev = instantiated_rev_socket
186
+ end
187
+
188
+ # Send data to the current connection -- called by them
189
+ def send_data(data)
190
+ @wrapped_rev.write data
191
+ end
192
+
193
+ # Close the connection, optionally after writing
194
+ def close_connection(after_writing = false)
195
+ return close_connection_after_writing if after_writing
196
+ @wrapped_rev.close
197
+ end
198
+
199
+ # Close the connection after all data has been written
200
+ def close_connection_after_writing
201
+ @wrapped_rev.output_buffer_size.zero? ? @wrapped_rev.close : @wrapped_rev.should_close_after_writing
202
+ end
203
+
204
+ def get_peername
205
+ family, port, host_name, host_ip = @wrapped_rev.peeraddr
206
+ Socket.pack_sockaddr_in( port, host_ip) # pack it up :)
207
+ end
208
+
209
+ end
210
+ end
@@ -2,10 +2,10 @@ require 'rubygems'
2
2
 
3
3
  GEMSPEC = Gem::Specification.new do |s|
4
4
  s.name = "rev"
5
- s.version = "0.2.2"
5
+ s.version = "0.2.3"
6
6
  s.authors = "Tony Arcieri"
7
7
  s.email = "tony@medioh.com"
8
- s.date = "2008-4-19"
8
+ s.date = "2009-02-01"
9
9
  s.summary = "Rev is a Ruby binding to the libev high performance event library"
10
10
  s.platform = Gem::Platform::RUBY
11
11
  s.required_ruby_version = '>= 1.8.6'
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rev
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.2
4
+ version: 0.2.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Tony Arcieri
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2008-04-19 00:00:00 -06:00
12
+ date: 2009-02-01 00:00:00 -07:00
13
13
  default_executable:
14
14
  dependencies: []
15
15
 
@@ -25,6 +25,7 @@ extra_rdoc_files:
25
25
  - README
26
26
  - CHANGES
27
27
  files:
28
+ - lib/http11_client.bundle
28
29
  - lib/rev
29
30
  - lib/rev/async_watcher.rb
30
31
  - lib/rev/dns_resolver.rb
@@ -39,13 +40,20 @@ files:
39
40
  - lib/rev/ssl.rb
40
41
  - lib/rev/timer_watcher.rb
41
42
  - lib/rev.rb
43
+ - lib/rev_ext.bundle
44
+ - lib/revem.rb
42
45
  - ext/http11_client
43
46
  - ext/http11_client/ext_help.h
44
47
  - ext/http11_client/extconf.rb
48
+ - ext/http11_client/http11_client.bundle
45
49
  - ext/http11_client/http11_client.c
50
+ - ext/http11_client/http11_client.o
46
51
  - ext/http11_client/http11_parser.c
47
52
  - ext/http11_client/http11_parser.h
53
+ - ext/http11_client/http11_parser.o
48
54
  - ext/http11_client/http11_parser.rl
55
+ - ext/http11_client/Makefile
56
+ - ext/http11_client/mkmf.log
49
57
  - ext/libev
50
58
  - ext/libev/Changes
51
59
  - ext/libev/ev.c
@@ -61,20 +69,38 @@ files:
61
69
  - ext/libev/LICENSE
62
70
  - ext/libev/README
63
71
  - ext/libev/README.embed
72
+ - ext/libev/test_libev_win32.c
64
73
  - ext/libev/update_ev_wrap
65
74
  - ext/rev
75
+ - ext/rev/ev_wrap.h
66
76
  - ext/rev/extconf.rb
77
+ - ext/rev/libev.c
78
+ - ext/rev/libev.o
79
+ - ext/rev/Makefile
80
+ - ext/rev/mkmf.log
67
81
  - ext/rev/rev.h
68
82
  - ext/rev/rev_buffer.c
83
+ - ext/rev/rev_buffer.o
84
+ - ext/rev/rev_ext.bundle
69
85
  - ext/rev/rev_ext.c
86
+ - ext/rev/rev_ext.o
70
87
  - ext/rev/rev_io_watcher.c
88
+ - ext/rev/rev_io_watcher.o
71
89
  - ext/rev/rev_loop.c
90
+ - ext/rev/rev_loop.o
72
91
  - ext/rev/rev_ssl.c
92
+ - ext/rev/rev_ssl.o
73
93
  - ext/rev/rev_timer_watcher.c
94
+ - ext/rev/rev_timer_watcher.o
74
95
  - ext/rev/rev_utils.c
96
+ - ext/rev/rev_utils.o
75
97
  - ext/rev/rev_watcher.c
76
98
  - ext/rev/rev_watcher.h
99
+ - ext/rev/rev_watcher.o
100
+ - examples/echo_client.rb
77
101
  - examples/echo_server.rb
102
+ - examples/google.rb
103
+ - examples/httpclient.rb
78
104
  - Rakefile
79
105
  - rev.gemspec
80
106
  - LICENSE
@@ -106,7 +132,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
106
132
  requirements: []
107
133
 
108
134
  rubyforge_project: rev
109
- rubygems_version: 1.0.1
135
+ rubygems_version: 1.3.1
110
136
  signing_key:
111
137
  specification_version: 2
112
138
  summary: Rev is a Ruby binding to the libev high performance event library