diff options
author | matz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 1999-09-20 07:14:18 +0000 |
---|---|---|
committer | matz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 1999-09-20 07:14:18 +0000 |
commit | 70a444b0cc703a2fd3e05045cd1e36266221149e (patch) | |
tree | 32169a95b2aadc737d2a78b02bc0cb5fba56e856 | |
parent | 656cbdf2b7a0b185fe1232cf7322f5b39f47c28a (diff) |
19990920
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@533 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
-rw-r--r-- | ChangeLog | 7 | ||||
-rw-r--r-- | ToDo | 1 | ||||
-rw-r--r-- | ext/socket/socket.c | 2 | ||||
-rw-r--r-- | io.c | 45 | ||||
-rw-r--r-- | misc/ruby-mode.el | 2 | ||||
-rw-r--r-- | rubyio.h | 2 |
6 files changed, 45 insertions, 14 deletions
@@ -1,3 +1,10 @@ +Mon Sep 20 01:08:02 1999 Yukihiro Matsumoto <matz@netlab.co.jp> + + * 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 <matz@netlab.co.jp> * stable version 1.4.2 released. @@ -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; } @@ -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_") @@ -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)); |