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.
- data/.gitignore +25 -0
- data/CHANGES +199 -0
- data/LICENSE +20 -0
- data/README.markdown +4 -0
- data/Rakefile +98 -0
- data/VERSION +1 -0
- data/examples/echo_client.rb +38 -0
- data/examples/echo_server.rb +27 -0
- data/examples/google.rb +9 -0
- data/examples/httpclient.rb +38 -0
- data/ext/cool.io/.gitignore +5 -0
- data/ext/cool.io/cool.io.h +58 -0
- data/ext/cool.io/cool.io_ext.c +25 -0
- data/ext/cool.io/ev_wrap.h +8 -0
- data/ext/cool.io/extconf.rb +69 -0
- data/ext/cool.io/iowatcher.c +189 -0
- data/ext/cool.io/libev.c +8 -0
- data/ext/cool.io/loop.c +303 -0
- data/ext/cool.io/stat_watcher.c +191 -0
- data/ext/cool.io/timer_watcher.c +219 -0
- data/ext/cool.io/utils.c +122 -0
- data/ext/cool.io/watcher.c +264 -0
- data/ext/cool.io/watcher.h +71 -0
- data/ext/http11_client/.gitignore +5 -0
- data/ext/http11_client/ext_help.h +14 -0
- data/ext/http11_client/extconf.rb +6 -0
- data/ext/http11_client/http11_client.c +300 -0
- data/ext/http11_client/http11_parser.c +403 -0
- data/ext/http11_client/http11_parser.h +48 -0
- data/ext/http11_client/http11_parser.rl +173 -0
- data/ext/libev/Changes +364 -0
- data/ext/libev/LICENSE +36 -0
- data/ext/libev/README +58 -0
- data/ext/libev/README.embed +3 -0
- data/ext/libev/ev.c +3867 -0
- data/ext/libev/ev.h +826 -0
- data/ext/libev/ev_epoll.c +234 -0
- data/ext/libev/ev_kqueue.c +198 -0
- data/ext/libev/ev_poll.c +148 -0
- data/ext/libev/ev_port.c +164 -0
- data/ext/libev/ev_select.c +307 -0
- data/ext/libev/ev_vars.h +197 -0
- data/ext/libev/ev_win32.c +153 -0
- data/ext/libev/ev_wrap.h +186 -0
- data/ext/libev/test_libev_win32.c +123 -0
- data/ext/libev/update_ev_wrap +19 -0
- data/lib/.gitignore +2 -0
- data/lib/cool.io.rb +30 -0
- data/lib/cool.io/async_watcher.rb +43 -0
- data/lib/cool.io/dns_resolver.rb +220 -0
- data/lib/cool.io/eventmachine.rb +234 -0
- data/lib/cool.io/http_client.rb +419 -0
- data/lib/cool.io/io.rb +174 -0
- data/lib/cool.io/iowatcher.rb +17 -0
- data/lib/cool.io/listener.rb +93 -0
- data/lib/cool.io/loop.rb +130 -0
- data/lib/cool.io/meta.rb +49 -0
- data/lib/cool.io/server.rb +74 -0
- data/lib/cool.io/socket.rb +224 -0
- data/lib/cool.io/timer_watcher.rb +17 -0
- data/lib/coolio.rb +2 -0
- data/lib/rev.rb +4 -0
- data/spec/async_watcher_spec.rb +57 -0
- data/spec/possible_tests/schedules_other_threads.rb +48 -0
- data/spec/possible_tests/test_on_resolve_failed.rb +9 -0
- data/spec/possible_tests/test_resolves.rb +27 -0
- data/spec/possible_tests/test_write_during_resolve.rb +27 -0
- data/spec/possible_tests/works_straight.rb +71 -0
- data/spec/spec_helper.rb +5 -0
- data/spec/timer_watcher_spec.rb +55 -0
- data/spec/unix_listener_spec.rb +25 -0
- data/spec/unix_server_spec.rb +25 -0
- 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
data/lib/rev.rb
ADDED
@@ -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,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
|
data/spec/spec_helper.rb
ADDED
@@ -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
|