From 70a444b0cc703a2fd3e05045cd1e36266221149e Mon Sep 17 00:00:00 2001 From: matz Date: Mon, 20 Sep 1999 07:14:18 +0000 Subject: 19990920 git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@533 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- ChangeLog | 7 +++++++ ToDo | 1 + ext/socket/socket.c | 2 +- io.c | 45 ++++++++++++++++++++++++++++++++++----------- misc/ruby-mode.el | 2 +- rubyio.h | 2 +- 6 files changed, 45 insertions(+), 14 deletions(-) diff --git a/ChangeLog b/ChangeLog index 1b5fe5f6b9..3e2deca7b6 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,10 @@ +Mon Sep 20 01:08:02 1999 Yukihiro Matsumoto + + * io.c (io_fread): should not block other threads. + + * io.c (rb_io_synchronized): renamed from rb_io_unbuffered(); do + not call setbuf(NULL) any more. + Sat Sep 18 13:45:43 1999 Yukihiro Matsumoto * stable version 1.4.2 released. diff --git a/ToDo b/ToDo index 1ecd529b3e..1fa2f396ae 100644 --- a/ToDo +++ b/ToDo @@ -34,6 +34,7 @@ Standard Libraries * Stream or Port, abstract superclass of IO ? * String#{pred,prev}, String#downto * optional stepsize argument for succ() +* Dir.glob(pat){|f|...} Extension Libraries diff --git a/ext/socket/socket.c b/ext/socket/socket.c index 93a8aacce3..4c0934a87b 100644 --- a/ext/socket/socket.c +++ b/ext/socket/socket.c @@ -115,7 +115,7 @@ sock_new(class, fd) #endif fp->f2 = rb_fdopen(fd, "w"); fp->mode = FMODE_READWRITE; - rb_io_unbuffered(fp); + rb_io_synchronized(fp); return (VALUE)sock; } diff --git a/io.c b/io.c index 93cf75ece2..3aa95e2cae 100644 --- a/io.c +++ b/io.c @@ -442,6 +442,29 @@ read_all(port) return str; } +static size_t +io_fread(ptr, len, f) + char *ptr; + size_t len; + FILE *f; +{ + size_t n = len; + + while (n--) { + *ptr = getc(f); + if (*ptr == EOF) { + *ptr = '\0'; + break; + } + ptr++; + if (!READ_DATA_PENDING(f)) { + rb_thread_wait_fd(fileno(f)); + } + } + + return len - n - 1; +} + static VALUE io_read(argc, argv, io) int argc; @@ -465,9 +488,7 @@ io_read(argc, argv, io) str = rb_str_new(0, len); READ_CHECK(fptr->f); - TRAP_BEG; - n = fread(RSTRING(str)->ptr, 1, len, fptr->f); - TRAP_END; + n = io_fread(RSTRING(str)->ptr, len, fptr->f); if (n == 0) { if (feof(fptr->f)) return Qnil; rb_sys_fail(fptr->path); @@ -564,9 +585,7 @@ rb_io_gets_internal(argc, argv, io) } else { READ_CHECK(f); - TRAP_BEG; - cnt = fread(buf, 1, sizeof(buf), f); - TRAP_END; + cnt = io_fread(buf, sizeof(buf), f); if (cnt == 0) { if (ferror(f)) rb_sys_fail(fptr->path); c = EOF; @@ -1389,15 +1408,19 @@ pipe_finalize(fptr) #endif void -rb_io_unbuffered(fptr) +rb_io_synchronized(fptr) OpenFile *fptr; { - if (fptr->f2 == 0) rb_raise(rb_eTypeError, "non-writable fptr"); - if (fptr->f != 0) setbuf(fptr->f, NULL); - setbuf(fptr->f2, NULL); fptr->mode |= FMODE_SYNC; } +void +rb_io_unbuffered(fptr) + OpenFile *fptr; +{ + rb_io_synchronized(fptr); +} + static VALUE pipe_open(pname, mode) char *pname, *mode; @@ -1421,7 +1444,7 @@ pipe_open(pname, mode) if (modef & FMODE_READABLE) fptr->f = f; if (modef & FMODE_WRITABLE) { fptr->f2 = f; - rb_io_unbuffered(fptr); + rb_io_synchronized(fptr); } return (VALUE)port; } diff --git a/misc/ruby-mode.el b/misc/ruby-mode.el index 667cad30d9..2875608f07 100644 --- a/misc/ruby-mode.el +++ b/misc/ruby-mode.el @@ -47,7 +47,7 @@ ruby-block-end-re "\\)\\>\\|\\}\\|\\]\\)") ) -(defconst ruby-operator-chars ",.+*/%-&|^~=<>:") +(defconst ruby-operator-chars "-,.+*/%&|^~=<>:") (defconst ruby-operator-re (concat "[" ruby-operator-chars "]")) (defconst ruby-symbol-chars "a-zA-Z0-9_") diff --git a/rubyio.h b/rubyio.h index 81f162a012..f4b72781e5 100644 --- a/rubyio.h +++ b/rubyio.h @@ -54,7 +54,7 @@ int rb_io_mode_flags _((const char*)); void rb_io_check_writable _((OpenFile*)); void rb_io_check_readable _((OpenFile*)); void rb_io_fptr_finalize _((OpenFile*)); -void rb_io_unbuffered _((OpenFile*)); +void rb_io_synchronized _((OpenFile*)); void rb_io_check_closed _((OpenFile*)); void rb_eof_error _((void)); -- cgit v1.2.3