iomultiplex 0.1.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.
@@ -0,0 +1,87 @@
1
+ # encoding: utf-8
2
+
3
+ # Copyright 2014-2016 Jason Woods
4
+ #
5
+ # Licensed under the Apache License, Version 2.0 (the "License");
6
+ # you may not use this file except in compliance with the License.
7
+ # You may obtain a copy of the License at
8
+ #
9
+ # http://www.apache.org/licenses/LICENSE-2.0
10
+ #
11
+ # Unless required by applicable law or agreed to in writing, software
12
+ # distributed under the License is distributed on an "AS IS" BASIS,
13
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ # See the License for the specific language governing permissions and
15
+ # limitations under the License.
16
+
17
+ module IOMultiplex
18
+ # StringBuffer allows us to store the returned allocations from sysread calls
19
+ # as an array of the actual strings, preventing the need for re-allocations
20
+ # to expand a string
21
+ # The allocations only happen at the point that enough data is received to
22
+ # meet a request and at that time only a single allocation is performed
23
+ class StringBuffer
24
+ attr_reader :length
25
+
26
+ def initialize
27
+ reset
28
+ end
29
+
30
+ def reset
31
+ @buffer = []
32
+ @length = 0
33
+ nil
34
+ end
35
+
36
+ def push(data)
37
+ data = data.to_s
38
+ @buffer.push data
39
+ @length += data.length
40
+ end
41
+ alias << push
42
+
43
+ def read(n)
44
+ process n, false
45
+ end
46
+
47
+ def peek(n)
48
+ return '' if length == 0 # rubocop:disable Style/ZeroLengthPredicate
49
+ s = ''
50
+ # Coalesce small writes
51
+ i = 0
52
+ while n > 0 && @buffer[i]
53
+ if @buffer[i].length > n
54
+ s << @buffer[i][0, n]
55
+ break
56
+ else
57
+ s << @buffer[i]
58
+ n -= @buffer[i].length
59
+ end
60
+ i += 1
61
+ end
62
+ s
63
+ end
64
+
65
+ def shift(n)
66
+ process n, true
67
+ end
68
+
69
+ def empty?
70
+ length == 0 # rubocop:disable Style/ZeroLengthPredicate
71
+ end
72
+
73
+ private
74
+
75
+ def process(n, discard = false)
76
+ data = ''
77
+ n = n.to_i
78
+ while n > 0 && length > 0 # rubocop:disable Style/ZeroLengthPredicate
79
+ s = @buffer[0].length > n ? @buffer[0].slice!(0, n) : @buffer.shift
80
+ n -= s.length
81
+ @length -= s.length
82
+ data << s unless discard
83
+ end
84
+ data
85
+ end
86
+ end
87
+ end
@@ -0,0 +1,56 @@
1
+ # encoding: utf-8
2
+
3
+ # Copyright 2014-2016 Jason Woods
4
+ #
5
+ # Licensed under the Apache License, Version 2.0 (the "License");
6
+ # you may not use this file except in compliance with the License.
7
+ # You may obtain a copy of the License at
8
+ #
9
+ # http://www.apache.org/licenses/LICENSE-2.0
10
+ #
11
+ # Unless required by applicable law or agreed to in writing, software
12
+ # distributed under the License is distributed on an "AS IS" BASIS,
13
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ # See the License for the specific language governing permissions and
15
+ # limitations under the License.
16
+
17
+ require 'iomultiplex/ioreactor'
18
+
19
+ module IOMultiplex
20
+ # A TCP listener
21
+ class TCPListener < IOReactor
22
+ def initialize(address, port, id = nil, pool = nil, &block)
23
+ raise RuntimeError, 'connection_accepted not implemented', nil \
24
+ unless block_given? || respond_to?(:connection_accepted)
25
+ super TCPServer.new(address, port), 'r', id
26
+ @io.listen 1024
27
+ @pool = pool
28
+ @block = block
29
+ end
30
+
31
+ protected
32
+
33
+ # Replace the IOReactor read_action - we need to call accept, not read
34
+ # Accept up to 10 connections at a time so we don't block the IO thread
35
+ # for too long
36
+ def read_action
37
+ 10.times do
38
+ accept_one
39
+ end
40
+ end
41
+
42
+ def accept_one
43
+ socket = @io.accept_nonblock
44
+ client = @block ? @block.call(socket) : connection_accepted(socket)
45
+ unless client
46
+ socket.close
47
+ return
48
+ end
49
+ if @pool
50
+ @pool.distribute client
51
+ else
52
+ @multiplexer.add client
53
+ end
54
+ end
55
+ end
56
+ end
@@ -0,0 +1,4 @@
1
+ # Version of IOMultiplex
2
+ module IOMultiplex
3
+ VERSION = '0.1.0'
4
+ end
metadata ADDED
@@ -0,0 +1,98 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: iomultiplex
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Jason Woods
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2016-03-31 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: cabin
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '0.6'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '0.6'
27
+ - !ruby/object:Gem::Dependency
28
+ name: nio4r
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '1.0'
34
+ - - ">="
35
+ - !ruby/object:Gem::Version
36
+ version: 1.0.1
37
+ type: :runtime
38
+ prerelease: false
39
+ version_requirements: !ruby/object:Gem::Requirement
40
+ requirements:
41
+ - - "~>"
42
+ - !ruby/object:Gem::Version
43
+ version: '1.0'
44
+ - - ">="
45
+ - !ruby/object:Gem::Version
46
+ version: 1.0.1
47
+ description: NIO4R IO reactor library
48
+ email:
49
+ - devel@jasonwoods.me.uk
50
+ executables: []
51
+ extensions: []
52
+ extra_rdoc_files: []
53
+ files:
54
+ - lib/iomultiplex.rb
55
+ - lib/iomultiplex/iomultiplex.rb
56
+ - lib/iomultiplex/ioreactor.rb
57
+ - lib/iomultiplex/ioreactor/buffered.rb
58
+ - lib/iomultiplex/ioreactor/openssl.rb
59
+ - lib/iomultiplex/mixins/callback.rb
60
+ - lib/iomultiplex/mixins/ioreactor/read.rb
61
+ - lib/iomultiplex/mixins/ioreactor/write.rb
62
+ - lib/iomultiplex/mixins/logger.rb
63
+ - lib/iomultiplex/mixins/logslow.rb
64
+ - lib/iomultiplex/mixins/openssl.rb
65
+ - lib/iomultiplex/mixins/post.rb
66
+ - lib/iomultiplex/mixins/select.rb
67
+ - lib/iomultiplex/mixins/state.rb
68
+ - lib/iomultiplex/mixins/timer.rb
69
+ - lib/iomultiplex/pool.rb
70
+ - lib/iomultiplex/stringbuffer.rb
71
+ - lib/iomultiplex/tcplistener.rb
72
+ - lib/iomultiplex/version.rb
73
+ homepage: https://github.com/driskell/iomultiplex
74
+ licenses:
75
+ - GPL
76
+ metadata: {}
77
+ post_install_message:
78
+ rdoc_options: []
79
+ require_paths:
80
+ - lib
81
+ required_ruby_version: !ruby/object:Gem::Requirement
82
+ requirements:
83
+ - - ">="
84
+ - !ruby/object:Gem::Version
85
+ version: '0'
86
+ required_rubygems_version: !ruby/object:Gem::Requirement
87
+ requirements:
88
+ - - ">="
89
+ - !ruby/object:Gem::Version
90
+ version: '0'
91
+ requirements: []
92
+ rubyforge_project: nowarning
93
+ rubygems_version: 2.4.2
94
+ signing_key:
95
+ specification_version: 4
96
+ summary: An event-loop experiment designed for high throughput across many clients,
97
+ with minimal and deterministic memory usage.
98
+ test_files: []