xchan.rb 0.21.0 → 0.22.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.
- checksums.yaml +4 -4
- data/lib/xchan/unix_socket.rb +47 -14
- data/lib/xchan/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 2d385aa7803c7861610c50348dec4108760bf2e0a21d36bd6a9402788ec56f62
|
|
4
|
+
data.tar.gz: 5292469bfb8a3cc8fb581d12ecde445cef46551000604b6e8d1c3b9ca96b2d93
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 10b83c2ad3e4861715b4348f0e4aa54e9f84377fa08acf3fb59caaccbb164909326ae1d527afaac5bed6a7401a4981942f75b767a370cb276553784ab0bce2b0
|
|
7
|
+
data.tar.gz: 990ed1ae55dba125d7f95a4e2d2477353b7bddeaa275149713fc2769fd36cea564ebe179567fe93924b1a37bc18f9e4c51ea7da1310587c34c94190975154fb8
|
data/lib/xchan/unix_socket.rb
CHANGED
|
@@ -46,6 +46,8 @@ class Chan::UNIXSocket
|
|
|
46
46
|
@counter = Chan::Counter.new(tmpdir)
|
|
47
47
|
@lock = Chan.locks[lock]&.call(tmpdir) || lock
|
|
48
48
|
@mutex = Mutex.new
|
|
49
|
+
@partial = nil
|
|
50
|
+
@partial_len = 0
|
|
49
51
|
end
|
|
50
52
|
|
|
51
53
|
##
|
|
@@ -107,10 +109,12 @@ class Chan::UNIXSocket
|
|
|
107
109
|
@mutex.synchronize do
|
|
108
110
|
@lock.lock_nonblock
|
|
109
111
|
raise IOError, "channel closed" if closed?
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
@
|
|
113
|
-
|
|
112
|
+
data = serialize(object)
|
|
113
|
+
head = [data.bytesize].pack("Q>")
|
|
114
|
+
n = @w.write_nonblock(head << data)
|
|
115
|
+
@bytes.push(data.bytesize)
|
|
116
|
+
@counter.increment!(bytes_written: data.bytesize)
|
|
117
|
+
data.bytesize.tap { @lock.release }
|
|
114
118
|
rescue IOError, IO::WaitWritable, Errno::ENOBUFS => ex
|
|
115
119
|
@lock.release
|
|
116
120
|
raise Chan::WaitWritable, ex.message
|
|
@@ -157,15 +161,35 @@ class Chan::UNIXSocket
|
|
|
157
161
|
@mutex.synchronize do
|
|
158
162
|
@lock.lock_nonblock
|
|
159
163
|
raise IOError, "closed channel" if closed?
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
164
|
+
stream = @r.local_address.socktype == Socket::SOCK_STREAM
|
|
165
|
+
unless @partial
|
|
166
|
+
if stream
|
|
167
|
+
head = String.new
|
|
168
|
+
while head.bytesize < 8
|
|
169
|
+
head << @r.read_nonblock(8 - head.bytesize)
|
|
170
|
+
end
|
|
171
|
+
@partial_len = head.unpack1("Q>")
|
|
172
|
+
@partial = String.new(capacity: @partial_len)
|
|
173
|
+
else
|
|
174
|
+
buf = @r.read_nonblock(65536)
|
|
175
|
+
@partial_len = buf[0, 8].unpack1("Q>")
|
|
176
|
+
@partial = buf[8, @partial_len]
|
|
177
|
+
end
|
|
178
|
+
@bytes.shift
|
|
179
|
+
end
|
|
180
|
+
if stream
|
|
181
|
+
while @partial.bytesize < @partial_len
|
|
182
|
+
@partial << @r.read_nonblock(@partial_len - @partial.bytesize)
|
|
183
|
+
end
|
|
184
|
+
end
|
|
185
|
+
obj = deserialize(@partial)
|
|
186
|
+
@counter.increment!(bytes_read: @partial.bytesize)
|
|
187
|
+
@partial = nil
|
|
163
188
|
obj.tap { @lock.release }
|
|
164
189
|
rescue IOError => ex
|
|
165
190
|
@lock.release
|
|
166
191
|
raise(ex)
|
|
167
192
|
rescue IO::WaitReadable => ex
|
|
168
|
-
@bytes.unshift(len)
|
|
169
193
|
@lock.release
|
|
170
194
|
raise Chan::WaitReadable, ex.message
|
|
171
195
|
rescue Errno::EAGAIN => ex
|
|
@@ -198,6 +222,13 @@ class Chan::UNIXSocket
|
|
|
198
222
|
lock { size.zero? }
|
|
199
223
|
end
|
|
200
224
|
|
|
225
|
+
##
|
|
226
|
+
# @return [Integer]
|
|
227
|
+
# Returns the number of elements waiting to be read
|
|
228
|
+
def size
|
|
229
|
+
@bytes.size
|
|
230
|
+
end
|
|
231
|
+
|
|
201
232
|
##
|
|
202
233
|
# @group Stat methods
|
|
203
234
|
|
|
@@ -218,14 +249,16 @@ class Chan::UNIXSocket
|
|
|
218
249
|
alias_method :bytes_read, :bytes_received
|
|
219
250
|
|
|
220
251
|
##
|
|
221
|
-
# @
|
|
222
|
-
# Returns the number of objects waiting to be read
|
|
223
|
-
def size
|
|
224
|
-
lock { @bytes.size }
|
|
225
|
-
end
|
|
252
|
+
# @endgroup
|
|
226
253
|
|
|
227
254
|
##
|
|
228
|
-
# @
|
|
255
|
+
# @return [void]
|
|
256
|
+
def flush
|
|
257
|
+
@lock.lock
|
|
258
|
+
to_a
|
|
259
|
+
ensure
|
|
260
|
+
@lock.release
|
|
261
|
+
end
|
|
229
262
|
|
|
230
263
|
##
|
|
231
264
|
# @group Wait methods
|
data/lib/xchan/version.rb
CHANGED
metadata
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: xchan.rb
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.
|
|
4
|
+
version: 0.22.0
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- '0x1eef'
|
|
@@ -167,7 +167,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
|
167
167
|
- !ruby/object:Gem::Version
|
|
168
168
|
version: '0'
|
|
169
169
|
requirements: []
|
|
170
|
-
rubygems_version:
|
|
170
|
+
rubygems_version: 4.0.6
|
|
171
171
|
specification_version: 4
|
|
172
172
|
summary: An easy to use InterProcess Communication (IPC) library
|
|
173
173
|
test_files: []
|