celluloid-io 0.16.0 → 0.16.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 06e019423155a4f894648df359c6d544cf68e6e0
4
- data.tar.gz: a44dd7a23826a73dcbe7a6fa04c7fad10a104126
3
+ metadata.gz: 2a14112c061df1e593c0c40f73f6bbafbb937419
4
+ data.tar.gz: 2fc0714e1b2064a425105db7779ce83bbdb85508
5
5
  SHA512:
6
- metadata.gz: c2b6218e998263dc990af5195682cc1aebc930a31e9413f214b9e4afca30ec6a532532b6d70966408dbb5fb260c5b6a6f8d9a3190141d06d73af292c8715cef0
7
- data.tar.gz: 937e511d635e0d426791c5ba214e77319be2223bf058e2ac76e0fd8ab81e8d8c46504b42ac7594bfa52123b5ab13d55b4e4ab8ee603e9c9deca7a8a1a2b0b5e9
6
+ metadata.gz: 0853eb2f8d75efb7287a95ae81d74a2c619d7a7f79cce162110faafda75f4e41049bbf1134615b6abba5c14361a3e9dff69847ae199a9fa3f1898cd024033661
7
+ data.tar.gz: a195890888ace5714d9781c4683a6b23c4a6f3208cedaf9619c92520cf34a0ef1ee57c9bd2457a36d018ae3f433c83b23e69e5105579208570906d9167edf081
data/CHANGES.md CHANGED
@@ -1,3 +1,7 @@
1
+ 0.16.1 (2014-10-08)
2
+ -------------------
3
+ * Revert read/write interest patch as it caused file descriptor leaks
4
+
1
5
  0.16.0 (2014-09-04)
2
6
  -------------------
3
7
  * Fix bug handling simultaneous read/write interests
@@ -20,7 +20,7 @@ Gem::Specification.new do |gem|
20
20
  gem.add_dependency 'nio4r', '>= 1.0.0'
21
21
 
22
22
  gem.add_development_dependency 'rake'
23
- gem.add_development_dependency 'rspec'
23
+ gem.add_development_dependency 'rspec', '~> 2.14.0'
24
24
  gem.add_development_dependency 'benchmark_suite'
25
25
  gem.add_development_dependency 'guard-rspec'
26
26
  gem.add_development_dependency 'rb-fsevent', '~> 0.9.1' if RUBY_PLATFORM =~ /darwin/
@@ -21,7 +21,9 @@ module Celluloid
21
21
  end
22
22
 
23
23
  def initialize
24
- @nameservers = self.class.nameservers
24
+ # early return for edge case when there are no nameservers configured
25
+ # but we still want to be able to static lookups using #resolve_hostname
26
+ @nameservers = self.class.nameservers or return
25
27
 
26
28
  @server = IPAddr.new(@nameservers.sample)
27
29
 
@@ -14,25 +14,20 @@ module Celluloid
14
14
 
15
15
  def initialize
16
16
  @selector = NIO::Selector.new
17
- @monitors = {}
18
17
  end
19
18
 
20
19
  # Wait for the given IO object to become readable
21
20
  def wait_readable(io)
22
- wait io do |monitor|
23
- monitor.wait_readable
24
- end
21
+ wait io, :r
25
22
  end
26
23
 
27
24
  # Wait for the given IO object to become writable
28
25
  def wait_writable(io)
29
- wait io do |monitor|
30
- monitor.wait_writable
31
- end
26
+ wait io, :w
32
27
  end
33
28
 
34
29
  # Wait for the given IO operation to complete
35
- def wait(io)
30
+ def wait(io, set)
36
31
  # zomg ugly type conversion :(
37
32
  unless io.is_a?(::IO) or io.is_a?(OpenSSL::SSL::SSLSocket)
38
33
  if io.respond_to? :to_io
@@ -44,89 +39,21 @@ module Celluloid
44
39
  raise TypeError, "can't convert #{io.class} into IO" unless io.is_a?(::IO)
45
40
  end
46
41
 
47
- unless monitor = @monitors[io]
48
- monitor = Monitor.new(@selector, io)
49
- @monitors[io] = monitor
50
- end
51
-
52
- yield monitor
42
+ monitor = @selector.register(io, set)
43
+ monitor.value = Task.current
44
+ Task.suspend :iowait
53
45
  end
54
46
 
55
47
  # Run the reactor, waiting for events or wakeup signal
56
48
  def run_once(timeout = nil)
57
49
  @selector.select(timeout) do |monitor|
58
- monitor.value.resume
59
- end
60
- end
61
-
62
- class Monitor
63
- def initialize(selector, io)
64
- @selector = selector
65
- @io = io
66
- @interests = {}
67
- end
68
-
69
- def wait_readable
70
- wait :r
71
- end
72
-
73
- def wait_writable
74
- wait :w
75
- end
76
-
77
- def wait(interest)
78
- raise "Already waiting for #{interest.inspect}" if @interests.include?(interest)
79
- @interests[interest] = Task.current
80
- reregister
81
- Task.suspend :iowait
82
- end
83
-
84
- def reregister
85
- if @monitor
86
- @monitor.close
87
- @monitor = nil
88
- end
89
-
90
- if interests_symbol
91
- @monitor = @selector.register(@io, interests_symbol)
92
- @monitor.value = self
93
- end
94
- end
95
-
96
- def interests_symbol
97
- case @interests.keys
98
- when [:r]
99
- :r
100
- when [:w]
101
- :w
102
- when [:r, :w]
103
- :rw
104
- end
105
- end
106
-
107
- def resume
108
- raise "No monitor" unless @monitor
109
-
110
- if @monitor.readable?
111
- resume_for :r
112
- end
113
-
114
- if @monitor.writable?
115
- resume_for :w
116
- end
117
-
118
- reregister
119
- end
120
-
121
- def resume_for(interest)
122
- task = @interests.delete(interest)
50
+ task = monitor.value
51
+ monitor.close
123
52
 
124
- if task
125
- if task.running?
126
- task.resume
127
- else
128
- raise "reactor attempted to resume a dead task"
129
- end
53
+ if task.running?
54
+ task.resume
55
+ else
56
+ Logger.warn("reactor attempted to resume a dead task")
130
57
  end
131
58
  end
132
59
  end
@@ -17,6 +17,7 @@ module Celluloid
17
17
 
18
18
  def connect
19
19
  @socket.connect_nonblock
20
+ self
20
21
  rescue ::IO::WaitReadable
21
22
  wait_readable
22
23
  retry
@@ -8,7 +8,11 @@ module Celluloid
8
8
  def_delegators :@server, :listen, :sysaccept, :close, :closed?, :addr, :setsockopt
9
9
 
10
10
  def initialize(hostname_or_port, port = nil)
11
- @server = ::TCPServer.new(hostname_or_port, port)
11
+ if port.nil?
12
+ @server = ::TCPServer.new(hostname_or_port)
13
+ else
14
+ @server = ::TCPServer.new(hostname_or_port, port)
15
+ end
12
16
  end
13
17
 
14
18
  def accept
@@ -3,7 +3,7 @@ module Celluloid
3
3
  # UDPSockets with combined blocking and evented support
4
4
  class UDPSocket
5
5
  extend Forwardable
6
- def_delegators :@socket, :bind, :connect, :send, :recvfrom_nonblock, :close, :closed?
6
+ def_delegators :@socket, :addr, :bind, :connect, :send, :recvfrom_nonblock, :close, :closed?
7
7
 
8
8
  def initialize(address_family = ::Socket::AF_INET)
9
9
  @socket = ::UDPSocket.new(address_family)
@@ -1,5 +1,5 @@
1
1
  module Celluloid
2
2
  module IO
3
- VERSION = "0.16.0"
3
+ VERSION = "0.16.1"
4
4
  end
5
5
  end
@@ -2,14 +2,24 @@ require 'spec_helper'
2
2
 
3
3
  describe Celluloid::IO::DNSResolver do
4
4
  describe '#resolve' do
5
+ it 'resolves hostnames statically from hosts file without nameservers' do
6
+ # /etc/resolv.conf doesn't exist on Mac OSX when no networking is
7
+ # disabled, thus .nameservers would return nil
8
+ Celluloid::IO::DNSResolver.should_receive(:nameservers).at_most(:once) { nil }
9
+ resolver = Celluloid::IO::DNSResolver.new
10
+ resolver.resolve('localhost').should eq Resolv::IPv4.create("127.0.0.1")
11
+ end
12
+
5
13
  it 'resolves hostnames' do
6
14
  resolver = Celluloid::IO::DNSResolver.new
7
15
  resolver.resolve('localhost').should eq Resolv::IPv4.create("127.0.0.1")
8
16
  end
9
17
 
10
18
  it "resolves domain names" do
11
- resolver = Celluloid::IO::DNSResolver.new
12
- resolver.resolve("celluloid.io").should == Resolv::IPv4.create("207.97.227.245")
19
+ resolver = Celluloid::IO::DNSResolver.new
20
+ nameservers = resolver.resolve("celluloid.io")
21
+ expect(nameservers).to include Resolv::IPv4.create("104.28.21.100")
22
+ expect(nameservers).to include Resolv::IPv4.create("104.28.20.100")
13
23
  end
14
24
 
15
25
  it "resolves CNAME responses" do
@@ -5,7 +5,7 @@ describe Celluloid::IO::TCPServer do
5
5
  let(:payload) { 'ohai' }
6
6
 
7
7
  it "can be initialized without a host" do
8
- expect{ server = Celluloid::IO::TCPServer.new(2000); server.close }.to_not raise_error
8
+ expect { Celluloid::IO::TCPServer.new(2000).close }.to_not raise_error
9
9
  end
10
10
 
11
11
  context "inside Celluloid::IO" do
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: celluloid-io
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.16.0
4
+ version: 0.16.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Tony Arcieri
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-09-05 00:00:00.000000000 Z
11
+ date: 2014-10-08 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: celluloid
@@ -56,16 +56,16 @@ dependencies:
56
56
  name: rspec
57
57
  requirement: !ruby/object:Gem::Requirement
58
58
  requirements:
59
- - - ">="
59
+ - - "~>"
60
60
  - !ruby/object:Gem::Version
61
- version: '0'
61
+ version: 2.14.0
62
62
  type: :development
63
63
  prerelease: false
64
64
  version_requirements: !ruby/object:Gem::Requirement
65
65
  requirements:
66
- - - ">="
66
+ - - "~>"
67
67
  - !ruby/object:Gem::Version
68
- version: '0'
68
+ version: 2.14.0
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: benchmark_suite
71
71
  requirement: !ruby/object:Gem::Requirement
@@ -146,6 +146,7 @@ files:
146
146
  - lib/celluloid/io/version.rb
147
147
  - log/.gitignore
148
148
  - logo.png
149
+ - spec/celluloid/io/.dns_resolver_spec.rb.swp
149
150
  - spec/celluloid/io/actor_spec.rb
150
151
  - spec/celluloid/io/dns_resolver_spec.rb
151
152
  - spec/celluloid/io/mailbox_spec.rb
@@ -190,6 +191,7 @@ specification_version: 4
190
191
  summary: Celluloid::IO allows you to monitor multiple IO objects within a Celluloid
191
192
  actor
192
193
  test_files:
194
+ - spec/celluloid/io/.dns_resolver_spec.rb.swp
193
195
  - spec/celluloid/io/actor_spec.rb
194
196
  - spec/celluloid/io/dns_resolver_spec.rb
195
197
  - spec/celluloid/io/mailbox_spec.rb
@@ -206,4 +208,3 @@ test_files:
206
208
  - spec/fixtures/server.crt
207
209
  - spec/fixtures/server.key
208
210
  - spec/spec_helper.rb
209
- has_rdoc: