cool.io 0.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (73) hide show
  1. data/.gitignore +25 -0
  2. data/CHANGES +199 -0
  3. data/LICENSE +20 -0
  4. data/README.markdown +4 -0
  5. data/Rakefile +98 -0
  6. data/VERSION +1 -0
  7. data/examples/echo_client.rb +38 -0
  8. data/examples/echo_server.rb +27 -0
  9. data/examples/google.rb +9 -0
  10. data/examples/httpclient.rb +38 -0
  11. data/ext/cool.io/.gitignore +5 -0
  12. data/ext/cool.io/cool.io.h +58 -0
  13. data/ext/cool.io/cool.io_ext.c +25 -0
  14. data/ext/cool.io/ev_wrap.h +8 -0
  15. data/ext/cool.io/extconf.rb +69 -0
  16. data/ext/cool.io/iowatcher.c +189 -0
  17. data/ext/cool.io/libev.c +8 -0
  18. data/ext/cool.io/loop.c +303 -0
  19. data/ext/cool.io/stat_watcher.c +191 -0
  20. data/ext/cool.io/timer_watcher.c +219 -0
  21. data/ext/cool.io/utils.c +122 -0
  22. data/ext/cool.io/watcher.c +264 -0
  23. data/ext/cool.io/watcher.h +71 -0
  24. data/ext/http11_client/.gitignore +5 -0
  25. data/ext/http11_client/ext_help.h +14 -0
  26. data/ext/http11_client/extconf.rb +6 -0
  27. data/ext/http11_client/http11_client.c +300 -0
  28. data/ext/http11_client/http11_parser.c +403 -0
  29. data/ext/http11_client/http11_parser.h +48 -0
  30. data/ext/http11_client/http11_parser.rl +173 -0
  31. data/ext/libev/Changes +364 -0
  32. data/ext/libev/LICENSE +36 -0
  33. data/ext/libev/README +58 -0
  34. data/ext/libev/README.embed +3 -0
  35. data/ext/libev/ev.c +3867 -0
  36. data/ext/libev/ev.h +826 -0
  37. data/ext/libev/ev_epoll.c +234 -0
  38. data/ext/libev/ev_kqueue.c +198 -0
  39. data/ext/libev/ev_poll.c +148 -0
  40. data/ext/libev/ev_port.c +164 -0
  41. data/ext/libev/ev_select.c +307 -0
  42. data/ext/libev/ev_vars.h +197 -0
  43. data/ext/libev/ev_win32.c +153 -0
  44. data/ext/libev/ev_wrap.h +186 -0
  45. data/ext/libev/test_libev_win32.c +123 -0
  46. data/ext/libev/update_ev_wrap +19 -0
  47. data/lib/.gitignore +2 -0
  48. data/lib/cool.io.rb +30 -0
  49. data/lib/cool.io/async_watcher.rb +43 -0
  50. data/lib/cool.io/dns_resolver.rb +220 -0
  51. data/lib/cool.io/eventmachine.rb +234 -0
  52. data/lib/cool.io/http_client.rb +419 -0
  53. data/lib/cool.io/io.rb +174 -0
  54. data/lib/cool.io/iowatcher.rb +17 -0
  55. data/lib/cool.io/listener.rb +93 -0
  56. data/lib/cool.io/loop.rb +130 -0
  57. data/lib/cool.io/meta.rb +49 -0
  58. data/lib/cool.io/server.rb +74 -0
  59. data/lib/cool.io/socket.rb +224 -0
  60. data/lib/cool.io/timer_watcher.rb +17 -0
  61. data/lib/coolio.rb +2 -0
  62. data/lib/rev.rb +4 -0
  63. data/spec/async_watcher_spec.rb +57 -0
  64. data/spec/possible_tests/schedules_other_threads.rb +48 -0
  65. data/spec/possible_tests/test_on_resolve_failed.rb +9 -0
  66. data/spec/possible_tests/test_resolves.rb +27 -0
  67. data/spec/possible_tests/test_write_during_resolve.rb +27 -0
  68. data/spec/possible_tests/works_straight.rb +71 -0
  69. data/spec/spec_helper.rb +5 -0
  70. data/spec/timer_watcher_spec.rb +55 -0
  71. data/spec/unix_listener_spec.rb +25 -0
  72. data/spec/unix_server_spec.rb +25 -0
  73. metadata +184 -0
@@ -0,0 +1,17 @@
1
+ #--
2
+ # Copyright (C)2007 Tony Arcieri
3
+ # You can redistribute this under the terms of the Ruby license
4
+ # See file LICENSE for details
5
+ #++
6
+
7
+ module Coolio
8
+ class TimerWatcher
9
+ # The actual implementation of this class resides in the C extension
10
+ # Here we metaprogram proper event_callbacks for the callback methods
11
+ # These can take a block and store it to be called when the event
12
+ # is actually fired.
13
+
14
+ extend Meta
15
+ event_callback :on_timer
16
+ end
17
+ end
data/lib/coolio.rb ADDED
@@ -0,0 +1,2 @@
1
+ # For those people who don't like the cool.io styling...
2
+ require 'cool.io'
data/lib/rev.rb ADDED
@@ -0,0 +1,4 @@
1
+ STDERR.puts "*** DEPRECATION WARNING: require 'rev' and the Rev constant are deprecated. Please use require 'cool.io' and the Coolio constant instead"
2
+
3
+ require 'cool.io'
4
+ Rev = Coolio
@@ -0,0 +1,57 @@
1
+ require File.expand_path('../spec_helper', __FILE__)
2
+ require 'tempfile'
3
+ require 'fcntl'
4
+
5
+ describe Cool.io::AsyncWatcher do
6
+
7
+ it "does not signal on spurious wakeups" do
8
+ aw = Cool.io::AsyncWatcher.new
9
+ tmp = Tempfile.new('coolio_async_watcher_test')
10
+ nr_fork = 2 # must be at least two for spurious wakeups
11
+
12
+ # We have aetter chance of failing if this overflows the pipe buffer
13
+ # which POSIX requires >= 512 bytes, Linux 2.6 uses 4096 bytes
14
+ nr_signal = 4096 * 4
15
+
16
+ append = File.open(tmp.path, "ab")
17
+ append.sync = true
18
+ rd, wr = ::IO.pipe
19
+
20
+ aw.on_signal { append.syswrite("#$$\n") }
21
+ children = nr_fork.times.map do
22
+ fork do
23
+ trap(:TERM) { exit!(0) }
24
+ rloop = Cool.io::Loop.default
25
+ aw.attach(rloop)
26
+ wr.write '.' # signal to master that we're ready
27
+ rloop.run
28
+ exit!(1) # should not get here
29
+ end
30
+ end
31
+
32
+ # ensure children are ready
33
+ nr_fork.times { rd.sysread(1).should == '.' }
34
+
35
+ # send our signals
36
+ nr_signal.times { aw.signal }
37
+
38
+ # wait for the pipe buffer to be consumed by the children
39
+ sleep 1 while tmp.stat.ctime >= (Time.now - 4)
40
+
41
+ children.each do |pid|
42
+ Process.kill(:TERM, pid)
43
+ _, status = Process.waitpid2(pid)
44
+ status.exitstatus.should == 0
45
+ end
46
+
47
+ # we should've written a line for every signal we sent
48
+ lines = tmp.readlines
49
+ lines.size.should == nr_signal
50
+
51
+ # theoretically a bad kernel scheduler could give us fewer...
52
+ lines.sort.uniq.size.should == nr_fork
53
+
54
+ tmp.close!
55
+ end
56
+
57
+ end
@@ -0,0 +1,48 @@
1
+ require File.dirname(__FILE__) + '/../lib/rev'
2
+ def dbg
3
+ require 'rubygems'
4
+ require 'ruby-debug'
5
+ debugger
6
+ end
7
+ Thread.abort_on_exception=true
8
+
9
+ require 'socket'
10
+
11
+ describe Rev::TCPSocket do
12
+ HOST = '127.0.0.1'
13
+ PORT = 4321
14
+ before :each do
15
+ @server = Rev::TCPServer.new(HOST, PORT) do |c|
16
+ c.on_connect { puts "#{remote_addr}:#{remote_port} connected" }
17
+ c.on_close { puts "#{remote_addr}:#{remote_port} disconnected" }
18
+ #c.on_read { |data| write data }
19
+ end
20
+
21
+ end
22
+
23
+ after :each do
24
+ @server.close
25
+ end
26
+
27
+ def sleep_until(seconds = 1, interval = 0.1)
28
+ raise unless block_given?
29
+ start_time=Time.now
30
+ sleep interval until ((Time.now - start_time) > seconds) or yield
31
+ end
32
+
33
+ it "should stop" do
34
+ loop = Rev::Loop.default
35
+ stopped = false;
36
+ @server.attach(loop)
37
+ Thread.new {
38
+ loop.run
39
+ stopped = true
40
+ }
41
+ sleep 0
42
+ stopped.should == false
43
+ loop.stop
44
+ sleep_until(3) { stopped == true }
45
+ stopped.should == true
46
+ end
47
+ end
48
+
@@ -0,0 +1,9 @@
1
+ require '../rev'
2
+ class Tester < Rev::TCPSocket
3
+ def on_resolve_failed
4
+ print "resolved failed! that's good!"
5
+ end
6
+ end
7
+ a = Tester.connect('asdfgoogle.com', 80)
8
+ a.attach Rev::Loop.default
9
+ Rev::Loop.default.run
@@ -0,0 +1,27 @@
1
+ require File.dirname(__FILE__) + '/../rev'
2
+
3
+ ADDR = 'wilkboardonline.com'
4
+ PORT = 80
5
+
6
+ class ClientConnection < Rev::TCPSocket
7
+ def on_connect
8
+ puts "#{remote_addr}:#{remote_port} connected"
9
+ write ("GET / HTTP/1.1\r\nhost:wilkboardonline.com:80\r\nconnection:close\r\n\r\n")
10
+ end
11
+
12
+ def on_close
13
+ puts "#{remote_addr}:#{remote_port} disconnected"
14
+ end
15
+
16
+ def on_read(data)
17
+ print "got #{data}"
18
+ close
19
+ end
20
+
21
+ end
22
+
23
+ event_loop = Rev::Loop.default
24
+ client = ClientConnection.connect(ADDR, PORT)
25
+ client.attach(event_loop)
26
+ puts "Echo client started to #{ADDR}:#{PORT}"
27
+ event_loop.run
@@ -0,0 +1,27 @@
1
+ require File.dirname(__FILE__) + '/../rev'
2
+
3
+ ADDR = 'wilkboardonline.com'
4
+ PORT = 80
5
+
6
+ class ClientConnection < Rev::TCPSocket
7
+ def on_connect
8
+ puts "#{remote_addr}:#{remote_port} connected"
9
+ end
10
+
11
+ def on_close
12
+ puts "#{remote_addr}:#{remote_port} disconnected"
13
+ end
14
+
15
+ def on_read(data)
16
+ print "got #{data}"
17
+ close
18
+ end
19
+
20
+ end
21
+
22
+ event_loop = Rev::Loop.default
23
+ client = ClientConnection.connect(ADDR, PORT)
24
+ client.write ("GET / HTTP/1.1\r\nhost:wilkboardonline.com:80\r\nconnection:close\r\n\r\n")
25
+ client.attach(event_loop)
26
+ puts "Echo client started to #{ADDR}:#{PORT}"
27
+ event_loop.run
@@ -0,0 +1,71 @@
1
+ require File.dirname(__FILE__) + '/../lib/rev'
2
+ def dbg
3
+ require 'rubygems'
4
+ require 'ruby-debug'
5
+ debugger
6
+ end
7
+ Thread.abort_on_exception=true
8
+
9
+ require 'socket'
10
+
11
+ describe Rev::TCPSocket do
12
+ HOST = '127.0.0.1'
13
+ PORT = 4321
14
+ before :each do
15
+ @server = Rev::TCPServer.new(HOST, PORT) do |c|
16
+ c.on_connect { puts "#{remote_addr}:#{remote_port} connected" }
17
+ c.on_close { puts "#{remote_addr}:#{remote_port} disconnected" }
18
+ #c.on_read { |data| write data }
19
+ end
20
+
21
+ end
22
+
23
+ after :each do
24
+ @server.close
25
+ end
26
+
27
+ def sleep_until(seconds = 1, interval = 0.1)
28
+ raise unless block_given?
29
+ start_time=Time.now
30
+ sleep interval until ((Time.now - start_time) > seconds) or yield
31
+ end
32
+
33
+ it "should stop" do
34
+ loop = Rev::Loop.default
35
+ stopped = false;
36
+ @server.attach(loop)
37
+ Thread.new {
38
+ loop.run_nonblock_over_and_over_again
39
+ stopped = true
40
+ }
41
+ sleep 0
42
+ stopped.should == false
43
+ loop.stop
44
+
45
+ sleep_until { stopped == true }
46
+ stopped.should == true
47
+ end
48
+
49
+ it "should auto bind on 1.8.6" do
50
+ @server.close
51
+ loop = Rev::Loop.default
52
+ server = Rev::TCPServer.new(HOST, PORT) do |c|
53
+ #c.on_connect { puts "#{remote_addr}:#{remote_port} connected" }
54
+ #c.on_close { puts "#{remote_addr}:#{remote_port} disconnected" }
55
+ print "CREATING\n"
56
+ c.on_read { |conn, data| print "WITHIN MYINE"; conn.write data; conn.close; loop.stop }
57
+ end
58
+
59
+ server.attach(loop)
60
+
61
+ Thread.new { loop.run_nonblock_over_and_over_again }
62
+ puts "Echo server listening on #{HOST}:#{PORT}"
63
+ # now connect and write -- it should close
64
+ connector = TCPSocket.new HOST, PORT
65
+ connector.write "yup"
66
+ connector.read.should == 'yup'
67
+ sleep 0
68
+ loop.running?.should != true
69
+ connector.closed?.should == true # it should close me, too
70
+ end
71
+ end
@@ -0,0 +1,5 @@
1
+ $LOAD_PATH.unshift File.dirname(__FILE__)
2
+ $LOAD_PATH.unshift File.expand_path('../../lib', __FILE__)
3
+
4
+ require 'rspec'
5
+ require 'cool.io'
@@ -0,0 +1,55 @@
1
+ require File.expand_path('../spec_helper', __FILE__)
2
+
3
+ describe Cool.io::TimerWatcher do
4
+
5
+ interval = 0.010
6
+
7
+ it "can have the on_timer callback defined after creation" do
8
+ @watcher = Cool.io::TimerWatcher.new(interval, true)
9
+ nr = '0'
10
+ @watcher.on_timer { nr.succ! }.should == nil
11
+ @watcher.attach(Cool.io::Loop.default).should == @watcher
12
+ nr.should == '0'
13
+ sleep interval
14
+ Cool.io::Loop.default.run_once
15
+ nr.should == '1'
16
+ end
17
+
18
+ it "can be subclassed" do
19
+ class MyTimerWatcher < Cool.io::TimerWatcher
20
+ TMP = '0'
21
+
22
+ def on_timer
23
+ TMP.succ!
24
+ end
25
+ end
26
+ @watcher = MyTimerWatcher.new(interval, true)
27
+ @watcher.attach(Cool.io::Loop.default).should == @watcher
28
+ MyTimerWatcher::TMP.should == '0'
29
+ sleep interval
30
+ Cool.io::Loop.default.run_once
31
+ MyTimerWatcher::TMP.should == '1'
32
+ end
33
+
34
+ it "can have the on_timer callback redefined between runs" do
35
+ @watcher = Cool.io::TimerWatcher.new(interval, true)
36
+ nr = '0'
37
+ @watcher.on_timer { nr.succ! }.should == nil
38
+ @watcher.attach(Cool.io::Loop.default).should == @watcher
39
+ nr.should == '0'
40
+ sleep interval
41
+ Cool.io::Loop.default.run_once
42
+ nr.should == '1'
43
+ @watcher.detach
44
+ @watcher.on_timer { nr = :foo }.should == nil
45
+ @watcher.attach(Cool.io::Loop.default).should == @watcher
46
+ nr.should == '1'
47
+ sleep interval
48
+ Cool.io::Loop.default.run_once
49
+ nr.should == :foo
50
+ end
51
+
52
+ after :each do
53
+ @watcher.detach if defined?(@watcher)
54
+ end
55
+ end
@@ -0,0 +1,25 @@
1
+ require File.expand_path('../spec_helper', __FILE__)
2
+ require 'tempfile'
3
+
4
+ describe Cool.io::UNIXListener do
5
+
6
+ before :each do
7
+ @tmp = Tempfile.new('coolio_unix_listener_spec')
8
+ File.unlink(@tmp.path).should == 1
9
+ File.exist?(@tmp.path).should == false
10
+ end
11
+
12
+ it "creates a new UNIXListener" do
13
+ listener = Cool.io::UNIXListener.new(@tmp.path)
14
+ File.socket?(@tmp.path).should == true
15
+ end
16
+
17
+ it "builds off an existing UNIXServer" do
18
+ unix_server = UNIXServer.new(@tmp.path)
19
+ File.socket?(@tmp.path).should == true
20
+ listener = Cool.io::UNIXListener.new(unix_server)
21
+ File.socket?(@tmp.path).should == true
22
+ listener.fileno.should == unix_server.fileno
23
+ end
24
+
25
+ end
@@ -0,0 +1,25 @@
1
+ require File.expand_path('../spec_helper', __FILE__)
2
+ require 'tempfile'
3
+
4
+ describe Cool.io::UNIXServer do
5
+
6
+ before :each do
7
+ @tmp = Tempfile.new('coolio_unix_server_spec')
8
+ File.unlink(@tmp.path).should == 1
9
+ File.exist?(@tmp.path).should == false
10
+ end
11
+
12
+ it "creates a new Cool.io::UNIXServer" do
13
+ listener = Cool.io::UNIXListener.new(@tmp.path)
14
+ File.socket?(@tmp.path).should == true
15
+ end
16
+
17
+ it "builds off an existing ::UNIXServer" do
18
+ unix_server = ::UNIXServer.new(@tmp.path)
19
+ File.socket?(@tmp.path).should == true
20
+ listener = Cool.io::UNIXServer.new(unix_server)
21
+ File.socket?(@tmp.path).should == true
22
+ listener.fileno.should == unix_server.fileno
23
+ end
24
+
25
+ end
metadata ADDED
@@ -0,0 +1,184 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: cool.io
3
+ version: !ruby/object:Gem::Version
4
+ hash: 59
5
+ prerelease: false
6
+ segments:
7
+ - 0
8
+ - 9
9
+ - 0
10
+ version: 0.9.0
11
+ platform: ruby
12
+ authors:
13
+ - Tony Arcieri
14
+ autorequire:
15
+ bindir: bin
16
+ cert_chain: []
17
+
18
+ date: 2010-11-06 00:00:00 -06:00
19
+ default_executable:
20
+ dependencies:
21
+ - !ruby/object:Gem::Dependency
22
+ name: iobuffer
23
+ prerelease: false
24
+ requirement: &id001 !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ">="
28
+ - !ruby/object:Gem::Version
29
+ hash: 29
30
+ segments:
31
+ - 0
32
+ - 1
33
+ - 3
34
+ version: 0.1.3
35
+ type: :runtime
36
+ version_requirements: *id001
37
+ - !ruby/object:Gem::Dependency
38
+ name: rspec
39
+ prerelease: false
40
+ requirement: &id002 !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ~>
44
+ - !ruby/object:Gem::Version
45
+ hash: 15
46
+ segments:
47
+ - 2
48
+ - 0
49
+ - 0
50
+ version: 2.0.0
51
+ type: :development
52
+ version_requirements: *id002
53
+ description: A Ruby wrapper around the libev high performance event library
54
+ email: tony@medioh.com
55
+ executables: []
56
+
57
+ extensions:
58
+ - ext/cool.io/extconf.rb
59
+ - ext/http11_client/extconf.rb
60
+ extra_rdoc_files:
61
+ - LICENSE
62
+ - README.markdown
63
+ files:
64
+ - .gitignore
65
+ - CHANGES
66
+ - LICENSE
67
+ - README.markdown
68
+ - Rakefile
69
+ - VERSION
70
+ - examples/echo_client.rb
71
+ - examples/echo_server.rb
72
+ - examples/google.rb
73
+ - examples/httpclient.rb
74
+ - ext/cool.io/.gitignore
75
+ - ext/cool.io/cool.io.h
76
+ - ext/cool.io/cool.io_ext.c
77
+ - ext/cool.io/ev_wrap.h
78
+ - ext/cool.io/extconf.rb
79
+ - ext/cool.io/iowatcher.c
80
+ - ext/cool.io/libev.c
81
+ - ext/cool.io/loop.c
82
+ - ext/cool.io/stat_watcher.c
83
+ - ext/cool.io/timer_watcher.c
84
+ - ext/cool.io/utils.c
85
+ - ext/cool.io/watcher.c
86
+ - ext/cool.io/watcher.h
87
+ - ext/http11_client/.gitignore
88
+ - ext/http11_client/ext_help.h
89
+ - ext/http11_client/extconf.rb
90
+ - ext/http11_client/http11_client.c
91
+ - ext/http11_client/http11_parser.c
92
+ - ext/http11_client/http11_parser.h
93
+ - ext/http11_client/http11_parser.rl
94
+ - ext/libev/Changes
95
+ - ext/libev/LICENSE
96
+ - ext/libev/README
97
+ - ext/libev/README.embed
98
+ - ext/libev/ev.c
99
+ - ext/libev/ev.h
100
+ - ext/libev/ev_epoll.c
101
+ - ext/libev/ev_kqueue.c
102
+ - ext/libev/ev_poll.c
103
+ - ext/libev/ev_port.c
104
+ - ext/libev/ev_select.c
105
+ - ext/libev/ev_vars.h
106
+ - ext/libev/ev_win32.c
107
+ - ext/libev/ev_wrap.h
108
+ - ext/libev/test_libev_win32.c
109
+ - ext/libev/update_ev_wrap
110
+ - lib/.gitignore
111
+ - lib/cool.io.rb
112
+ - lib/cool.io/async_watcher.rb
113
+ - lib/cool.io/dns_resolver.rb
114
+ - lib/cool.io/eventmachine.rb
115
+ - lib/cool.io/http_client.rb
116
+ - lib/cool.io/io.rb
117
+ - lib/cool.io/iowatcher.rb
118
+ - lib/cool.io/listener.rb
119
+ - lib/cool.io/loop.rb
120
+ - lib/cool.io/meta.rb
121
+ - lib/cool.io/server.rb
122
+ - lib/cool.io/socket.rb
123
+ - lib/cool.io/timer_watcher.rb
124
+ - lib/coolio.rb
125
+ - lib/rev.rb
126
+ - spec/async_watcher_spec.rb
127
+ - spec/possible_tests/schedules_other_threads.rb
128
+ - spec/possible_tests/test_on_resolve_failed.rb
129
+ - spec/possible_tests/test_resolves.rb
130
+ - spec/possible_tests/test_write_during_resolve.rb
131
+ - spec/possible_tests/works_straight.rb
132
+ - spec/spec_helper.rb
133
+ - spec/timer_watcher_spec.rb
134
+ - spec/unix_listener_spec.rb
135
+ - spec/unix_server_spec.rb
136
+ has_rdoc: true
137
+ homepage: http://github.com/tarcieri/cool.io
138
+ licenses: []
139
+
140
+ post_install_message:
141
+ rdoc_options:
142
+ - --charset=UTF-8
143
+ require_paths:
144
+ - lib
145
+ required_ruby_version: !ruby/object:Gem::Requirement
146
+ none: false
147
+ requirements:
148
+ - - ">="
149
+ - !ruby/object:Gem::Version
150
+ hash: 3
151
+ segments:
152
+ - 0
153
+ version: "0"
154
+ required_rubygems_version: !ruby/object:Gem::Requirement
155
+ none: false
156
+ requirements:
157
+ - - ">="
158
+ - !ruby/object:Gem::Version
159
+ hash: 3
160
+ segments:
161
+ - 0
162
+ version: "0"
163
+ requirements: []
164
+
165
+ rubyforge_project:
166
+ rubygems_version: 1.3.7
167
+ signing_key:
168
+ specification_version: 3
169
+ summary: The cool event framework for Ruby
170
+ test_files:
171
+ - spec/async_watcher_spec.rb
172
+ - spec/spec_helper.rb
173
+ - spec/timer_watcher_spec.rb
174
+ - spec/unix_listener_spec.rb
175
+ - spec/unix_server_spec.rb
176
+ - spec/possible_tests/schedules_other_threads.rb
177
+ - spec/possible_tests/test_on_resolve_failed.rb
178
+ - spec/possible_tests/test_resolves.rb
179
+ - spec/possible_tests/test_write_during_resolve.rb
180
+ - spec/possible_tests/works_straight.rb
181
+ - examples/echo_client.rb
182
+ - examples/echo_server.rb
183
+ - examples/google.rb
184
+ - examples/httpclient.rb