From: nobu.nakada@... Date: 2002-12-20T17:09:31+09:00 Subject: [ruby-dev:19137] [PATCH] Marshal.dump to non-blocking IO & error check なかだです。 [ruby-core:00569]でJos Backusに指摘されたMarshal.dumpがnon- blocking IOに対応していないのと、エラーチェックしてない件のパッ チです。 Index: io.c =================================================================== RCS file: /cvs/ruby/src/ruby/io.c,v retrieving revision 1.172 diff -u -2 -p -r1.172 io.c --- io.c 19 Dec 2002 09:20:20 -0000 1.172 +++ io.c 20 Dec 2002 08:05:13 -0000 @@ -352,4 +352,34 @@ rb_io_wait_writable(f) /* writing functions */ +long +rb_io_fwrite(ptr, len, f) + const char *ptr; + long len; + FILE *f; +{ + long n, r; + + if ((n = len) <= 0) return n; +#ifdef __human68k__ + do { + if (fputc(*ptr++, f) == EOF) { + if (ferror(f)) return -1L; + break; + } + } while (--n > 0); +#else + while (ptr += (r = fwrite(ptr, 1, n, f)), (n -= r) > 0) { + if (ferror(f)) { + if (rb_io_wait_writable(fileno(f))) { + clearerr(f); + continue; + } + return -1L; + } + } +#endif + return len - n; +} + static VALUE io_write(io, str) @@ -358,6 +388,5 @@ io_write(io, str) OpenFile *fptr; FILE *f; - long n, r; - register char *ptr; + long n; rb_secure(4); @@ -375,25 +404,6 @@ io_write(io, str) f = GetWriteFile(fptr); - ptr = RSTRING(str)->ptr; - n = RSTRING(str)->len; -#ifdef __human68k__ - do { - if (fputc(*ptr++, f) == EOF) { - if (ferror(f)) rb_sys_fail(fptr->path); - break; - } - } while (--n > 0); -#else - while (ptr += (r = fwrite(ptr, 1, n, f)), (n -= r) > 0) { - if (ferror(f)) { - if (rb_io_wait_writable(fileno(f))) { - clearerr(f); - continue; - } - rb_sys_fail(fptr->path); - } - } -#endif - n = ptr - RSTRING(str)->ptr; + n = rb_io_fwrite(RSTRING(str)->ptr, RSTRING(str)->len, f); + if (n == -1L) rb_sys_fail(fptr->path); if (fptr->mode & FMODE_SYNC) { io_fflush(f, fptr); Index: marshal.c =================================================================== RCS file: /cvs/ruby/src/ruby/marshal.c,v retrieving revision 1.75 diff -u -2 -p -r1.75 marshal.c --- marshal.c 19 Dec 2002 09:20:20 -0000 1.75 +++ marshal.c 19 Dec 2002 10:37:31 -0000 @@ -103,5 +103,6 @@ w_byten(s, n, arg) { if (arg->fp) { - fwrite(s, 1, n, arg->fp); + if (rb_io_fwrite(s, n, arg->fp) < 0) + rb_sys_fail(0); } else { Index: rubyio.h =================================================================== RCS file: /cvs/ruby/src/ruby/rubyio.h,v retrieving revision 1.20 diff -u -2 -p -r1.20 rubyio.h --- rubyio.h 2 Oct 2002 14:59:25 -0000 1.20 +++ rubyio.h 8 Nov 2002 01:31:21 -0000 @@ -60,4 +60,5 @@ FILE *rb_fdopen _((int, const char*)); int rb_getc _((FILE*)); long rb_io_fread _((char *, long, FILE *)); +long rb_io_fwrite _((const char *, long, FILE *)); int rb_io_mode_flags _((const char*)); void rb_io_check_writable _((OpenFile*)); -- --- 僕の前にBugはない。 --- 僕の後ろにBugはできる。 中田 伸悦