[macruby-changes] [4480] MacRuby/trunk/io.c
source_changes at macosforge.org
source_changes at macosforge.org
Mon Aug 30 22:02:24 PDT 2010
Revision: 4480
http://trac.macosforge.org/projects/ruby/changeset/4480
Author: lsansonetti at apple.com
Date: 2010-08-30 22:02:24 -0700 (Mon, 30 Aug 2010)
Log Message:
-----------
when reading all, try to determine the input's remaining data length before actually reading it in chunks
Modified Paths:
--------------
MacRuby/trunk/io.c
Modified: MacRuby/trunk/io.c
===================================================================
--- MacRuby/trunk/io.c 2010-08-31 02:04:11 UTC (rev 4479)
+++ MacRuby/trunk/io.c 2010-08-31 05:02:24 UTC (rev 4480)
@@ -1011,16 +1011,26 @@
static VALUE
rb_io_read_all(rb_io_t *io_struct, VALUE outbuf)
{
+ struct stat st;
+ long bufsize = 512;
+ if (fstat(io_struct->read_fd, &st) == 0 && S_ISREG(st.st_mode)) {
+ const off_t pos = lseek(io_struct->read_fd, 0, SEEK_CUR);
+ if (st.st_size >= pos && pos >= 0) {
+ bufsize = st.st_size - pos;
+ if (bufsize > LONG_MAX) {
+ rb_raise(rb_eIOError, "file too big for single read");
+ }
+ }
+ }
+
outbuf = rb_str_bstr(outbuf);
-
- const long BUFSIZE = 512;
long bytes_read = 0;
const long original_position = rb_bstr_length(outbuf);
while (true) {
- rb_bstr_resize(outbuf, original_position + bytes_read + BUFSIZE);
+ rb_bstr_resize(outbuf, original_position + bytes_read + bufsize);
uint8_t *bytes = rb_bstr_bytes(outbuf) + original_position + bytes_read;
- const long last_read = rb_io_read_internal(io_struct, bytes, BUFSIZE);
+ const long last_read = rb_io_read_internal(io_struct, bytes, bufsize);
bytes_read += last_read;
if (last_read == 0) {
break;
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.macosforge.org/pipermail/macruby-changes/attachments/20100830/22fd1fee/attachment-0001.html>
More information about the macruby-changes
mailing list