[#18186] [req] Marshal — keiju@... (Keiju ISHITSUKA)

けいじゅ@日本ラショナルソフトウェアです.

14 messages 2002/09/05
[#18190] Re: [req] Marshal — matz@... (Yukihiro Matsumoto) 2002/09/05

まつもと ゆきひろです

[#18229] Re: [ruby-cvs] rough/ext/stringio: * ruby-stringio.spec: 0.0.7, added changelog. — "U.Nakamura" <usa@...>

こんにちは、なかむら(う)です。

22 messages 2002/09/09
[#18230] Re: [ruby-cvs] rough/ext/stringio: * ruby-stringio.spec: 0.0.7, added changelog. — nobu.nakada@... 2002/09/09

なかだです。

[#18231] Re: [ruby-cvs] rough/ext/stringio: * ruby-stringio.spec: 0.0.7, added changelog. — "U.Nakamura" <usa@...> 2002/09/09

こんにちは、なかむら(う)です。

[#18232] Re: [ruby-cvs] rough/ext/stringio: * ruby-stringio.spec: 0.0.7, added changelog. — nobu.nakada@... 2002/09/09

なかだです。

[#18233] Re: [ruby-cvs] rough/ext/stringio: * ruby-stringio.spec: 0.0.7, added changelog. — "U.Nakamura" <usa@...> 2002/09/09

こんにちは、なかむら(う)です。

[#18234] Re: [ruby-cvs] rough/ext/stringio: * ruby-stringio.spec: 0.0.7, added changelog. — WATANABE Hirofumi <eban@...> 2002/09/09

わたなべです。

[#18236] Re: [ruby-cvs] rough/ext/stringio: * ruby-stringio.spec: 0.0.7, added changelog. — "U.Nakamura" <usa@...> 2002/09/09

こんにちは、なかむら(う)です。

[#18238] Re: [ruby-cvs] rough/ext/stringio: * ruby-stringio.spec: 0.0.7, added changelog. — WATANABE Hirofumi <eban@...> 2002/09/09

わたなべです。

[#18241] Re: [ruby-cvs] rough/ext/stringio: * ruby-stringio.spec: 0.0.7, added changelog. — "U.Nakamura" <usa@...> 2002/09/09

こんにちは、なかむら(う)です。

[#18285] rubicon on EWS4800 — Koji Arai <JCA02266@...>

新井です。

59 messages 2002/09/13
[#18322] Re: rubicon on EWS4800 — Koji Arai <JCA02266@...> 2002/09/21

新井です。

[#18333] Re: rubicon on EWS4800 — kjana@...4lab.to (YANAGAWA Kazuhisa) 2002/09/21

In message <20020921.152641.11483667.JCA02266@nifty.ne.jp>

[#18336] Re: rubicon on EWS4800 — nobu.nakada@... 2002/09/21

なかだです。

[#18337] Re: rubicon on EWS4800 — Tanaka Akira <akr@...17n.org> 2002/09/21

In article <200209211605.g8LG52p04564@sharui.nakada.kanuma.tochigi.jp>,

[#18338] Re: rubicon on EWS4800 — nobu.nakada@... 2002/09/21

なかだです。

[#18341] Re: rubicon on EWS4800 — Tanaka Akira <akr@...17n.org> 2002/09/21

In article <200209211628.g8LGSxp04786@sharui.nakada.kanuma.tochigi.jp>,

[#18342] Re: rubicon on EWS4800 — nobu.nakada@... 2002/09/21

なかだです。

[#18343] Re: rubicon on EWS4800 — Tanaka Akira <akr@...17n.org> 2002/09/21

In article <200209211739.g8LHdKp05495@sharui.nakada.kanuma.tochigi.jp>,

[#18345] Re: rubicon on EWS4800 — nobu.nakada@... 2002/09/22

なかだです。

[#18349] Re: rubicon on EWS4800 — Tanaka Akira <akr@...17n.org> 2002/09/22

In article <200209220415.g8M4Fkp24392@sharui.nakada.kanuma.tochigi.jp>,

[#18374] Re: [ruby-cvs] ruby/ext/tcltklib: * eval.c (ruby_run): should set toplevel visibility again here. — WATANABE Hirofumi <eban@...>

わたなべです。

20 messages 2002/09/25
[#18376] Re: [ruby-cvs] ruby/ext/tcltklib: * eval.c (ruby_run): should set toplevel visibility again here. — matz@... (Yukihiro Matsumoto) 2002/09/25

まつもと ゆきひろです

[#18377] Re: [ruby-cvs] ruby/ext/tcltklib: * eval.c (ruby_run): should set toplevel visibility again here. — nobu.nakada@... 2002/09/25

なかだです。

[#18378] Re: [ruby-cvs] ruby/ext/tcltklib: * eval.c (ruby_run): should set toplevel visibility again here. — WATANABE Hirofumi <eban@...> 2002/09/25

わたなべです。

[ruby-dev:18397] Re: rubicon on EWS4800

From: nobu.nakada@...
Date: 2002-09-27 09:07:33 UTC
List: ruby-dev #18397
なかだです。

At Fri, 27 Sep 2002 15:15:52 +0900,
Tanaka Akira wrote:
> > ということで、問題がないようであれば入れてしまおうかと思います
> > が。忘れないうちに。
> 
> HP-UX で試してみました。失敗します。
> 
> TestFile:
> ---------
>     ./builtin/TestFile.rb:302:in `test_s_open'(TestFile)
>     ./builtin/TestFile.rb:297:in `open'
>     ./builtin/TestFile.rb:297:in `test_s_open'
>     ./builtin/TestFile.rb:274:in `each'
>     ./builtin/TestFile.rb:274:in `test_s_open'
>     ....Expected: "<koala\n> "
>     ....But was:  "<nil>"
> 
> うぅむ。問題が微妙に違うんですねぇ。
> (今回の発端となった EWS4800 ではどうなのだろう?)
> 
> 取り出すと、
> 
> hpux% echo wombat>z;./ruby -e 'File.open("z", "r+") {|f| p f.gets; f.puts("koara"); f.rewind; p f.gets; p f.gets}'
> "wombat\n"
> "wombat\n"
> nil
> hpux% cat z
> wombat
> hpux% 
> 
> という話ですが、rewind の前に flush すると
> 
> hpux% echo wombat>z;./ruby -e 'File.open("z", "r+") {|f| p f.gets; f.puts("koara"); f.flush; f.rewind; p f.gets; p f.gets}' 
> "wombat\n"
> "wombat\n"
> "koara\n"
> hpux% 
> 
> となってうまくいきます。

うーん、HP-UXだと[ruby-dev:18345]のテストはどっちになるんでしょ
う。

> fseeko(3S) によれば
> 
>  ERRORS
>       fseek(), fseeko(), fseek_unlocked(), ftell(), ftello(),
>       ftell_unlocked(), rewind() and rewind_unlocked() fail if the stream is
>       unbuffered or the buffered data needs to be flushed, or ...
> 
> だそうなので、上記の例のように buffered data が flush されなければなら
> ない場合には fail するはずだという気もしますが、rb_io_rewind を見る限
> りは fseeko が失敗したら例外が上がるはずなので失敗していないように思え
> ます。へんなの。
> 
> それはそれとして、SUSv3 にも同様の文章があるので、fseek する前には
> 有無を言わさず fflush すべきなんでしょう。たぶん。

これは失敗するのが正しい動作で、glibcのようなのは規格から外れた
拡張ってことなんでしょうか。

とりあえずconfigure.inに入れてみましたが、SunOS 5.8だとこんな風
になるようです。

checking whether need to flush between R/W... yes
checking whether need to flush before seek... no


Index: configure.in
===================================================================
RCS file: /cvs/ruby/src/ruby/configure.in,v
retrieving revision 1.142
diff -u -2 -p -r1.142 configure.in
--- configure.in	25 Sep 2002 07:03:01 -0000	1.142
+++ configure.in	27 Sep 2002 09:01:48 -0000
@@ -568,4 +568,49 @@ else
 fi
 
+AC_DEFUN(RUBY_CHECK_IO_NEED_FLUSH,
+[AC_CACHE_CHECK(whether need to flush [$1], [$2],
+    [AC_TRY_RUN([
+#include <stdio.h>
+
+char *fn = "conftest.dat";
+char *wombat = "wombat\n";
+char *koara = "koara\n";
+
+int main()
+{
+    char buf[BUFSIZ];
+    FILE *f;
+    int r = 1;
+
+    if (!(f = fopen(fn, "w+"))) return 1;
+    fputs(wombat, f);
+    fflush(f);
+    fseek(f, 0, 0);
+    if (!fgets(buf, BUFSIZ, f) || strcmp(buf, wombat)) goto fail;
+    ]ifelse(index($2,between_rw),-1,fflush(f);)[
+    fputs(koara, f);
+    ]ifelse(index($2,before_seek),-1,fflush(f);)[
+    fseek(f, 0, 0);
+    ]ifelse(index($2,between_rw),-1,fflush(f);)[
+    if (!fgets(buf, BUFSIZ, f) || strcmp(buf, wombat)) goto fail;
+    if (!fgets(buf, BUFSIZ, f) || strcmp(buf, koara)) goto fail;
+    r = 0;
+  fail:
+    fclose(f);
+    unlink(fn);
+    return r;
+}
+], [$2]=no, [$2]=yes, [$2]=yes)])])
+
+RUBY_CHECK_IO_NEED_FLUSH(between R/W, rb_cv_need_io_flush_between_rw)
+if test "$rb_cv_need_io_flush_between_rw" = yes; then
+  AC_DEFINE(NEED_IO_FLUSH_BETWEEN_RW, 1)
+fi
+
+RUBY_CHECK_IO_NEED_FLUSH(before seek, rb_cv_need_io_flush_before_seek)
+if test "$rb_cv_need_io_flush_before_seek" = yes; then
+  AC_DEFINE(NEED_IO_FLUSH_BEFORE_SEEK, 1)
+fi
+
 dnl default value for $KANJI
 DEFAULT_KCODE="KCODE_NONE"
Index: io.c
===================================================================
RCS file: /cvs/ruby/src/ruby/io.c,v
retrieving revision 1.160
diff -u -2 -p -r1.160 io.c
--- io.c	25 Sep 2002 07:03:01 -0000	1.160
+++ io.c	27 Sep 2002 08:20:56 -0000
@@ -183,4 +183,10 @@ rb_io_check_closed(fptr)
 }
 
+#if NEED_IO_FLUSH_BETWEEN_RW || NEED_IO_FLUSH_BEFORE_SEEK
+#define SET_MODE_RBUF(fptr)    ((fptr)->mode |= FMODE_RBUF)
+#else
+#define SET_MODE_RBUF(fptr)    ((void)(fptr))
+#endif
+
 void
 rb_io_check_readable(fptr)
@@ -190,4 +196,10 @@ rb_io_check_readable(fptr)
 	rb_raise(rb_eIOError, "not opened for reading");
     }
+#if NEED_IO_FLUSH_BETWEEN_RW
+    if ((fptr->mode & FMODE_WBUF) && !fptr->f2) {
+	fflush(fptr->f);
+	fptr->mode &= ~FMODE_WBUF;
+    }
+#endif
 }
 
@@ -199,4 +211,10 @@ rb_io_check_writable(fptr)
 	rb_raise(rb_eIOError, "not opened for writing");
     }
+#if NEED_IO_FLUSH_BETWEEN_RW
+    if ((fptr->mode & FMODE_RBUF) && !fptr->f2) {
+	fflush(fptr->f);
+	fptr->mode &= ~FMODE_RBUF;
+    }
+#endif
 }
 
@@ -389,4 +407,20 @@ rb_io_tell(io)
 #endif
 
+#ifdef NEED_IO_FLUSH_BEFORE_SEEK
+static void
+flush_before_seek(fptr)
+    OpenFile *fptr;
+{
+    if (fptr->mode & FMODE_RBUF) {
+	fflush(fptr->f);
+    }
+    if (fptr->mode & FMODE_WBUF) {
+	fflush(fptr->f2 ? fptr->f2 : fptr->f);
+    }
+}
+#else
+#define flush_before_seek(fptr) ((void)(fptr))
+#endif
+
 static VALUE
 rb_io_seek(io, offset, whence)
@@ -398,4 +432,5 @@ rb_io_seek(io, offset, whence)
 
     GetOpenFile(io, fptr);
+    flush_before_seek(fptr);
     pos = fseeko(fptr->f, NUM2OFFT(offset), whence);
     if (pos != 0) rb_sys_fail(fptr->path);
@@ -429,4 +464,5 @@ rb_io_set_pos(io, offset)
 
     GetOpenFile(io, fptr);
+    flush_before_seek(fptr);
     pos = fseeko(fptr->f, NUM2OFFT(offset), SEEK_SET);
     if (pos != 0) rb_sys_fail(fptr->path);
@@ -443,4 +479,5 @@ rb_io_rewind(io)
 
     GetOpenFile(io, fptr);
+    flush_before_seek(fptr);
     if (fseeko(fptr->f, 0L, 0) != 0) rb_sys_fail(fptr->path);
     clearerr(fptr->f);
@@ -472,4 +509,5 @@ rb_io_eof(io)
     if (ch != EOF) {
 	ungetc(ch, fptr->f);
+	SET_MODE_RBUF(fptr);
 	return Qfalse;
     }
@@ -718,4 +756,5 @@ read_all(fptr, siz)
     if (bytes == 0) return rb_str_new(0,0);
     if (bytes != siz) rb_str_resize(str, bytes);
+    SET_MODE_RBUF(fptr);
 
     return str;
@@ -755,4 +794,5 @@ io_read(argc, argv, io)
 	rb_sys_fail(fptr->path);
     }
+    SET_MODE_RBUF(fptr);
     RSTRING(str)->len = n;
     RSTRING(str)->ptr[n] = '\0';
@@ -905,4 +945,5 @@ rb_io_getline_fast(fptr, delim)
 
     if (!NIL_P(str)) {
+	SET_MODE_RBUF(fptr);
 	fptr->lineno++;
 	lineno = INT2FIX(fptr->lineno);
@@ -960,4 +1001,5 @@ rb_io_getline(rs, fptr)
 
     if (!NIL_P(str)) {
+	SET_MODE_RBUF(fptr);
 	fptr->lineno++;
 	lineno = INT2FIX(fptr->lineno);
@@ -2233,4 +2275,6 @@ io_reopen(io, nfile)
     }
     if ((orig->mode & FMODE_READABLE) && pos >= 0) {
+	flush_before_seek(fptr);
+	flush_before_seek(orig);
 	fseeko(fptr->f, pos, SEEK_SET);
 	fseeko(orig->f, pos, SEEK_SET);


-- 
--- 僕の前にBugはない。
--- 僕の後ろにBugはできる。
    中田 伸悦

In This Thread