git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@533 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
matz 1999-09-20 07:14:18 +00:00
Родитель 656cbdf2b7
Коммит 70a444b0cc
6 изменённых файлов: 45 добавлений и 14 удалений

Просмотреть файл

@ -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> Sat Sep 18 13:45:43 1999 Yukihiro Matsumoto <matz@netlab.co.jp>
* stable version 1.4.2 released. * stable version 1.4.2 released.

1
ToDo
Просмотреть файл

@ -34,6 +34,7 @@ Standard Libraries
* Stream or Port, abstract superclass of IO ? * Stream or Port, abstract superclass of IO ?
* String#{pred,prev}, String#downto * String#{pred,prev}, String#downto
* optional stepsize argument for succ() * optional stepsize argument for succ()
* Dir.glob(pat){|f|...}
Extension Libraries Extension Libraries

Просмотреть файл

@ -115,7 +115,7 @@ sock_new(class, fd)
#endif #endif
fp->f2 = rb_fdopen(fd, "w"); fp->f2 = rb_fdopen(fd, "w");
fp->mode = FMODE_READWRITE; fp->mode = FMODE_READWRITE;
rb_io_unbuffered(fp); rb_io_synchronized(fp);
return (VALUE)sock; return (VALUE)sock;
} }

45
io.c
Просмотреть файл

@ -442,6 +442,29 @@ read_all(port)
return str; 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 static VALUE
io_read(argc, argv, io) io_read(argc, argv, io)
int argc; int argc;
@ -465,9 +488,7 @@ io_read(argc, argv, io)
str = rb_str_new(0, len); str = rb_str_new(0, len);
READ_CHECK(fptr->f); READ_CHECK(fptr->f);
TRAP_BEG; n = io_fread(RSTRING(str)->ptr, len, fptr->f);
n = fread(RSTRING(str)->ptr, 1, len, fptr->f);
TRAP_END;
if (n == 0) { if (n == 0) {
if (feof(fptr->f)) return Qnil; if (feof(fptr->f)) return Qnil;
rb_sys_fail(fptr->path); rb_sys_fail(fptr->path);
@ -564,9 +585,7 @@ rb_io_gets_internal(argc, argv, io)
} }
else { else {
READ_CHECK(f); READ_CHECK(f);
TRAP_BEG; cnt = io_fread(buf, sizeof(buf), f);
cnt = fread(buf, 1, sizeof(buf), f);
TRAP_END;
if (cnt == 0) { if (cnt == 0) {
if (ferror(f)) rb_sys_fail(fptr->path); if (ferror(f)) rb_sys_fail(fptr->path);
c = EOF; c = EOF;
@ -1388,14 +1407,18 @@ pipe_finalize(fptr)
} }
#endif #endif
void
rb_io_synchronized(fptr)
OpenFile *fptr;
{
fptr->mode |= FMODE_SYNC;
}
void void
rb_io_unbuffered(fptr) rb_io_unbuffered(fptr)
OpenFile *fptr; OpenFile *fptr;
{ {
if (fptr->f2 == 0) rb_raise(rb_eTypeError, "non-writable fptr"); rb_io_synchronized(fptr);
if (fptr->f != 0) setbuf(fptr->f, NULL);
setbuf(fptr->f2, NULL);
fptr->mode |= FMODE_SYNC;
} }
static VALUE static VALUE
@ -1421,7 +1444,7 @@ pipe_open(pname, mode)
if (modef & FMODE_READABLE) fptr->f = f; if (modef & FMODE_READABLE) fptr->f = f;
if (modef & FMODE_WRITABLE) { if (modef & FMODE_WRITABLE) {
fptr->f2 = f; fptr->f2 = f;
rb_io_unbuffered(fptr); rb_io_synchronized(fptr);
} }
return (VALUE)port; return (VALUE)port;
} }

Просмотреть файл

@ -47,7 +47,7 @@
ruby-block-end-re "\\)\\>\\|\\}\\|\\]\\)") ruby-block-end-re "\\)\\>\\|\\}\\|\\]\\)")
) )
(defconst ruby-operator-chars ",.+*/%-&|^~=<>:") (defconst ruby-operator-chars "-,.+*/%&|^~=<>:")
(defconst ruby-operator-re (concat "[" ruby-operator-chars "]")) (defconst ruby-operator-re (concat "[" ruby-operator-chars "]"))
(defconst ruby-symbol-chars "a-zA-Z0-9_") (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_writable _((OpenFile*));
void rb_io_check_readable _((OpenFile*)); void rb_io_check_readable _((OpenFile*));
void rb_io_fptr_finalize _((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_io_check_closed _((OpenFile*));
void rb_eof_error _((void)); void rb_eof_error _((void));