Skip to content

Commit ec74cdd

Browse files
Log frozen read buffer.
1 parent dd1bd32 commit ec74cdd

File tree

1 file changed

+30
-4
lines changed

1 file changed

+30
-4
lines changed

lib/io/stream/readable.rb

Lines changed: 30 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -187,10 +187,15 @@ def read_until(pattern, offset = 0, limit: nil, chomp: true)
187187
if index = index_of(pattern, offset, limit)
188188
return nil if limit and index >= limit
189189

190-
@read_buffer.freeze
190+
# @read_buffer.freeze
191191
matched = @read_buffer.byteslice(0, index+(chomp ? 0 : pattern.bytesize))
192192
@read_buffer = @read_buffer.byteslice(index+pattern.bytesize, @read_buffer.bytesize)
193193

194+
if @read_buffer.frozen?
195+
Console.warn(self, "Read buffer is frozen, duplicating it!", name: "read_until")
196+
@read_buffer = @read_buffer.dup
197+
end
198+
194199
return matched
195200
end
196201
end
@@ -202,7 +207,7 @@ def read_until(pattern, offset = 0, limit: nil, chomp: true)
202207
# @returns [String | Nil] The contents of the stream up until the pattern, or nil if the pattern was not found.
203208
def discard_until(pattern, offset = 0, limit: nil)
204209
if index = index_of(pattern, offset, limit, true)
205-
@read_buffer.freeze
210+
# @read_buffer.freeze
206211

207212
if limit and index >= limit
208213
@read_buffer = @read_buffer.byteslice(limit, @read_buffer.bytesize)
@@ -213,6 +218,11 @@ def discard_until(pattern, offset = 0, limit: nil)
213218
matched = @read_buffer.byteslice(0, index+pattern.bytesize)
214219
@read_buffer = @read_buffer.byteslice(index+pattern.bytesize, @read_buffer.bytesize)
215220

221+
if @read_buffer.frozen?
222+
Console.warn(self, "Read buffer is frozen, duplicating it!", name: "discard_until")
223+
@read_buffer = @read_buffer.dup
224+
end
225+
216226
return matched
217227
end
218228
end
@@ -275,11 +285,16 @@ def gets(separator = $/, limit = nil, chomp: false)
275285
end
276286

277287
# Freeze the read buffer, as this enables us to use byteslice without generating a hidden copy:
278-
@read_buffer.freeze
288+
# @read_buffer.freeze
279289

280290
line = @read_buffer.byteslice(0, index+(chomp ? 0 : separator.bytesize))
281291
@read_buffer = @read_buffer.byteslice(index+separator.bytesize, @read_buffer.bytesize)
282292

293+
if @read_buffer.frozen?
294+
Console.warn(self, "Read buffer is frozen, duplicating it!", name: "gets")
295+
@read_buffer = @read_buffer.dup
296+
end
297+
283298
return line
284299
end
285300

@@ -343,6 +358,11 @@ def fill_read_buffer(size = @minimum_read_size)
343358
# This effectively ties the input and output stream together.
344359
flush
345360

361+
if @read_buffer.frozen?
362+
Console.warn(self, "Read buffer is frozen, duplicating it!", name: "fill_read_buffer")
363+
@read_buffer = @read_buffer.dup
364+
end
365+
346366
if @read_buffer.empty?
347367
if sysread(size, @read_buffer)
348368
# Console.info(self, name: "read") {@read_buffer.inspect}
@@ -392,7 +412,7 @@ def consume_read_buffer(size = nil, buffer = nil)
392412
else
393413
# We know that we are not going to reuse the original buffer.
394414
# But byteslice will generate a hidden copy. So let's freeze it first:
395-
@read_buffer.freeze
415+
# @read_buffer.freeze
396416

397417
if buffer
398418
# Use replace instead of clear + << for better performance
@@ -401,7 +421,13 @@ def consume_read_buffer(size = nil, buffer = nil)
401421
else
402422
result = @read_buffer.byteslice(0, size)
403423
end
424+
404425
@read_buffer = @read_buffer.byteslice(size, @read_buffer.bytesize)
426+
427+
if @read_buffer.frozen?
428+
Console.warn(self, "Read buffer is frozen, duplicating it!", name: "consume_read_buffer")
429+
@read_buffer = @read_buffer.dup
430+
end
405431
end
406432

407433
return result

0 commit comments

Comments
 (0)