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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: e8936112cb188471884a6fa66ee0db2b61d5229ac75acb8953c78e5b76587bc8
4
- data.tar.gz: e76eb21f0f7f2a11e465ee3d4834b3abd48b54269949ee3623e2b2c2bdc1a17c
3
+ metadata.gz: 2d385aa7803c7861610c50348dec4108760bf2e0a21d36bd6a9402788ec56f62
4
+ data.tar.gz: 5292469bfb8a3cc8fb581d12ecde445cef46551000604b6e8d1c3b9ca96b2d93
5
5
  SHA512:
6
- metadata.gz: d6ff8db4154e29a41a41b3878a93355ab3ce8092112f76f7fa4a61042a9747138f9a270217decf0e39cc5a9890f7ce5f34ebaa8a93e74aeb68d1cf5b0d470a09
7
- data.tar.gz: bbe432d09de33e607b7940005a1d29ee0c1de6c14d3a2a56105c5fa26e32ea81a6327a87a6e520163f34836ffe820296674bf29a46c72cc45c603872500f090f
6
+ metadata.gz: 10b83c2ad3e4861715b4348f0e4aa54e9f84377fa08acf3fb59caaccbb164909326ae1d527afaac5bed6a7401a4981942f75b767a370cb276553784ab0bce2b0
7
+ data.tar.gz: 990ed1ae55dba125d7f95a4e2d2477353b7bddeaa275149713fc2769fd36cea564ebe179567fe93924b1a37bc18f9e4c51ea7da1310587c34c94190975154fb8
@@ -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
- len = @w.write_nonblock(serialize(object))
111
- @bytes.push(len)
112
- @counter.increment!(bytes_written: len)
113
- len.tap { @lock.release }
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
- len = @bytes.shift
161
- obj = deserialize(@r.read_nonblock(len.zero? ? 1 : len))
162
- @counter.increment!(bytes_read: len)
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
- # @return [Integer]
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
- # @endgroup
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
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Chan
4
- VERSION = "0.21.0"
4
+ VERSION = "0.22.0"
5
5
  end
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.21.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: 3.6.9
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: []